* aclライブラリ(2021年版)
-(by [[K]], 2021.11.21)

** (0) はじめに
-aclライブラリは、OSやCPUの違いを吸収し、共通のやり方で簡単なグラフィック機能やメモリ管理機能を提供することを目的にしたC言語向けのライブラリです。
-2020年9月に最初のバージョン(00b, 00f)を公開しました。

|kcube.c : 112行 (ライブラリのsampleより)|    |invader.c : 162行 (ライブラリのsampleより)|
|http://k.osask.jp/files/pic20200831a.jpg||http://k.osask.jp/files/pic20200901a.jpg|

** (1) ダウンロード&インストール

** [1-1]Windows版(32bit, 64bit両対応)
-''[1-1-1]はじめに''
--ここで紹介する方法は、Windows上でMinGW-5.1.6(32bit)を利用した方法です。SDL2.0は利用しません(あっても無視するだけなので、共存も可能です)。
--このやり方だと64bit対応アプリは作れませんが、32bitアプリは64bit版のWindowsでも問題なく動作するため、基本的には問題になりません。
--64bit版の開発環境を構築するのももちろん可能ですが、32bit版のWindowsを使っている人には適用できない説明になってしまうので、ここでは32bit版で説明します。
--自力で64bit版のMinGWをインストールして、あとは以下を適宜読み替えれば、難なく64bit版の開発環境を構築できるでしょう。

-''[1-1-2]MinGW-5.1.6のダウンロード&インストール''
--http://k.osask.jp/files/MinGW516.exe (155KB) をダウンロードして適当なフォルダ上で実行してください。
--実行するとカレントディレクトリに作業用ファイルをたくさん作るので、そういうことをされても困らない場所においてから実行しましょう。
--実行して順当に進んでいくと「Download and install」か「Download only」かを選ぶ画面になります。ここでは「Download and install」を選びます。
--さらに進んでいくと「Previous」「Current」「Candidate」のどれかを選択する画面になりますが、そこは「Current」でいいと思います。
--そしてインストール構成を選ぶ画面になります。ここは「Minimal」を選べば十分です。他にもほしいものがあるのなら追加してもいいですよ。Minimalだとインストール容量は50MB程度になるはずです。
--そしてインストールするディレクトリを聞かれます。ここも好きにしていいですが、とりあえず以下ではデフォルト通り「C:¥MinGW」を指定したものとして話を進めます。
--あとはまあ適当にやっていればインストールは終わるでしょう。

-''[1-1-3]aclライブラリのダウンロード&インストール''
--以下をダウンロードします。
--[ver.0.1a Windows専用型] http://k.osask.jp/files/acl01a_win.zip (19.8KB) (著作者は川合秀実, ライセンスはKL-01)
--[ver.0.1b Windows専用型] http://k.osask.jp/files/acl01b_win.zip (19.9KB) (著作者は川合秀実, ライセンスはKL-01) [最新版]
--このアーカイブを展開し、中のacl_winフォルダを得て、適当なところにその acl_win フォルダを置きます(中のsampleは以下のテストが終わったら削除しても問題ありません)。
--まあでも説明の便宜上、以下では「c:¥acl_win」に置いたとして話を進めます。
--これでインストールは完了です。

-''[1-1-4]aclライブラリのテストとアプリのコンパイル手順''
--コマンドプロンプトを開いて、acl_winフォルダの中のsampleフォルダの中へカレントディレクトリを移動してください(cdコマンドで)。
--そこで以下のように入力します。gccのコマンドラインオプションは順番に敏感なので気を付けてください(厳密はリンカオプションが順番に敏感)。
 prompt>c:\MinGW\bin\gcc.exe -m32 -Wl,-s -Wno-unused-function -Os -I c:\acl_win grd.c -o grd.exe -DAARCH_X86 -lgdi32
--長いですね・・・。これを毎回入力するのは苦痛でしょうから、以下のバッチファイルを作っておくといいと思います。
 c:\MinGW\bin\gcc.exe -m32 -Wl,-s -Wno-unused-function -Os -I c:\acl_win %1.c -o %1.exe -DAARCH_X86 %2 %3 %4 %5 %6 %7 %8 %9 -lgdi32
--これを「ccacl.bat」で保存したとして以下では説明します。
--このccacl.batがあれば、
 prompt>ccacl grd
--だけでコンパイルとリンクができるようになります。
--無事に実行ファイルができたら、
 promp>grd
--で実行してみてください。美しいグラデーションが出るはずです。
--他にも
 prompt>ccacl mandel
 prompt>ccacl kcube
 prompt>ccacl invader
--でコンパイル&リンクができますので、実行してみてください。無事に動けばテストは完了です!

** [1-2]SDL2.0版(Windowsでもこれでできますが、[1-1]のバージョンを使うほうが動作が軽くて快適です)
-''[1-2-1]はじめに''
--ここで紹介する方法は、SDL2.0を利用した一般的な方法です。
--CコンパイラやSDL2.0をインストールして利用可能にする方法は、それぞれのOSや環境ごとにまちまちなので、まずはそれを自力で解決してください。
--[参考] https://www.libsdl.org/ に行って「Download / SDL Releases」に進んで、「Development Libraries」を見れば、インストールためのヒントが得られると思います。

-''[1-2-2]aclライブラリのダウンロード&インストール''
--以下をダウンロードします。
--[ver.0.1a SDL2.0対応型] http://k.osask.jp/files/acl01a_sdl2.zip (19.8KB) (著作者は川合秀実, ライセンスはKL-01)
--[ver.0.1b SDL2.0対応型] http://k.osask.jp/files/acl01b_sdl2.zip (19.8KB) (著作者は川合秀実, ライセンスはKL-01) [最新版]
--[ver.0.1b SDL2.0対応型] http://k.osask.jp/files/acl01b_sdl2.zip (19.9KB) (著作者は川合秀実, ライセンスはKL-01) [最新版]
--このアーカイブを展開し、中にあるacl_sdl2フォルダを得てください。そして適当なところにその acl_sdl2 フォルダを置きます(中のsampleはテストが終わったら削除しても問題ありません)。
--これでインストールは完了です。

-''[1-2-3]aclライブラリのテストとアプリのコンパイル手順''
--Cコンパイラのコマンドラインオプションに、SDL2.0向けのオプションに加えて、以下を加えてください。
 -I(acl_sdl2へのパス) -DAARCH_X64
---ただし上記の例はx64の場合です。ほかのCPUの場合は、-DAARCH_以降を以下から選んでください。
---このオプションでライブラリにアーキテクチャ情報を与えています。
|-DAARCH_X86|x86(32bit)の場合|
|-DAARCH_X64|x64(64bit)の場合|
|-DAARCH_ARM32|ARM(32bit)の場合|
|-DAARCH_AARCH64|ARM(64bit)の場合|
--この方法で、sample内のgrd.c, mandel.c, kcube.c, invader.cを(どこか適当なフォルダ内で)コンパイルしてみてください。インストールがうまくいっていれば、それぞれ実行ファイルが生成されるはずです。
--実行して問題なく動くことを確認できたら、ライブラリのテストも完了です。

** (2) その他のaclライブラリ利用例
-(準備中)


** (3) 主な提供関数
|w = aOpenWin(xsiz, ysiz, title, mod)|差異吸収|00b~|グラフィックウィンドウをオープンします。|
|w = aOpenWinEx(xsiz, ysiz, title, mod)|差異吸収|01a~|拡張グラフィックウィンドウをオープンします。なおデフォルトでは、xsizやysizは拡張キャラクタの個数で指定するので、ピクセル数を16で割った数になります。|
|aFlushAll(w)|差異吸収|00b~|グラフィックバッファの内容を実画面に反映させます。|
|aLeapFlushAll(w, msec)|差異吸収|00b~|前回のflushからmsec以上の時間がたっていればflushします。もし時間がたっていなければ何もしません。|
|aWait(msec)|差異吸収|00b~|指定された時間の間sleepします。|
|i = aInkey(w, mod)|差異吸収|00b~|キー入力を検出します。|
|aSetPix(w, x, y, c)|描画関数|00b~|グラフィックバッファに点を描画します|
|c = aRgb8(r, g, b)|便利関数|00b~|RGB値(0~255)から、24bitカラーコードを生成します。|
|c = aGetPix(w, x, y)|描画関数|00b~|ウィンドウ上の画素の色を取得します。|
|aFillRect(w, xsiz, ysiz, x0, y0, c)|描画関数|00b~|グラフィックバッファに塗りつぶされた四角形を描画します。|
|aDrawRect(w, xsiz, ysiz, x0, y0, c)|描画関数|00b~|グラフィックバッファに塗りつぶされていない四角形を描画します。|
|aDrawLine(w, x0, y0, x1, y1, c)|描画関数|00b~|グラフィックバッファに直線を描画します。|
|aFillOval(w, xsiz, ysiz, x0, y0, c)|描画関数|00b~|グラフィックバッファに塗りつぶされた楕円形を描画します。|
|aDrawFillOval(w, xsiz, ysiz, x0, y0, c)|描画関数|00b~|グラフィックバッファに塗りつぶさていない楕円形を描画します。|
|aDrawStr(w, x, y, b, c, s)|描画関数|00b~|文字列を描画します。|
|aFill(w, x, y, c)|描画関数|01a~|指定された座標から同色で接続された領域を塗りつぶします。|
|aDrawOvalCent(w, x, y, a, b, c)|描画関数|01a~|中心座標と半径を指定するaDrawOval()です。|
|aFillOvalCent(w, x, y, a, b, c)|描画関数|01a~|中心座標と半径を指定するaFillOval()です。|
|aClrKeybuf(w)|便利関数|00b~|キーバッファをクリアします。|
|i = aInkeyWait(w, mod)|便利関数|00b~|何かキーが入力されるまでaWait()します。|
|fullCol = aGetPal(w, c)|便利関数|01a~|[WinExのみ]カラーパレット番号から24bitカラーコードに変換します。|
|aEch(w, x, y, ch, c, b)|描画関数|01a~|指定された座標に拡張キャラクタを描画します。|
|aCls(w, c)|描画関数|01a~|ウィンドウの描画範囲全体をクリアします。|
|ch = aGetEch(w, x, y)|描画関数|01a~|[WinExのみ]画面上の拡張キャラクタのキャラクタコードを取得します。|
|c = aGetEchCol(w, x, y)|描画関数|01a~|[WinExのみ]画面上の拡張キャラクタの描画色を取得します。|
|b = aGetEchBak(w, x, y)|描画関数|01a~|[WinExのみ]画面上の拡張キャラクタの背景色を取得します。|
|aEchBox(w, xsiz, ysiz, x, y, ch, c, b)|描画関数|01a~|拡張キャラクタで矩形を描きます。|
|ch = aGetEchBox(w, xsiz, ysiz, x, y)|描画関数|01a~|[WinExのみ]矩形範囲でaGetEch()します。すべて同じ値であればその値を返します。一つでも違う値があれば-1を返します。|
|c = aGetEchBoxCol(w, xsiz, ysiz, x, y)|描画関数|01a~|[WinExのみ]矩形範囲でaGetEchCol()します。それ以外はaGetEchBox()と同じです。|
|b = aGetEchBoxBak(w, xsiz, ysiz, x, y)|描画関数|01a~|[WinExのみ]矩形範囲でaGetEchBak()します。それ以外はaGetEchBox()と同じです。|
|aScroll(w, xsiz, ysiz, x, y, dx, dy, mod, ch, c, b)|描画関数|01a~|矩形範囲を画面上で移動させます。|
|aGrPrintf(w, x, y, c, b, s,...)|描画関数|01a~|グラフィックウィンドウに対するprintf()です。|
|aEchSav(w, x, y, ch, c, b)|描画関数|01a~|[WinExのみ]描画前に描画範囲の内容を内部で保存するaEch()です。保存した内容は下記のaEchRst()で自動復元されます。|
|aEchRst(w)|便利関数|01a~|[WinExのみ]aEchSav()で保存した内容を復元します。もし何も保存していなければ何もしません。|
|aWaitKey(w, keycode)|便利関数|01a~|指定されたキーが入力されるまでaWait()します。|
|i = aInkey_waitRC(w, msec)|便利関数|01a~|[WinExのみ]aClrKeybuf()して、aWait()して、aInkey()して、aEchRst()します。|
|i = aInkey_waitR(w, msec)|便利関数|01a~|[WinExのみ]aWait()して、aInkey()して、aEchRst()します。|
|dx = aMoveDx(keycode)|便利関数|01a~|もしkeycodeがカーソルの左右であれば-1か+1を返します。それ以外は0を返します。|
|dy = aMoveDy(keycode)|便利関数|01a~|もしkeycodeがカーソルの上下であれば-1か+1を返します。それ以外は0を返します。|
|a = aSaturateInt(a, i0, i1)|便利関数|01a~|もしaがi0より小さければi0を返します。i1より大きければi1を返します。i0~i1の値ならそのままaを返します。|
|||||
|aErrExit(s, ...)|便利関数|00b~|エラーメッセージをvprintfで表示してexit(1)します。|
|q = aErrExitP0(p, s, ...)|便利関数|00b~|もしp==0であれば、aErrExit()します。p!=0であれば、そのままpの値を返します。|
|p = aMalloc(siz)|便利関数|00b~|比較的高速なmallocです。|
|aFree(p, siz)|便利関数|00b~|比較的高速なfreeです。ただしaMallocしたときのサイズを指定する必要があります。|
|r = aXorShift32()|便利関数|01a~|乱数を返します。|
|r = aRnd(n)|便利関数|01a~|0~(n-1)の乱数を返します。|
|aArySetInt(a, i0, i1, v)|便利関数|01a~|AInt a[]な配列に対して、a[i0~(i1-1)]=v;にします。|
|aAryMovInt(a, i1, i0, n)|便利関数|01a~|a[i0]からn個の要素を、a[i1]以降に移動させます。|
|i = aMaxInt(i0, i1)|便利関数|01a~|i0とi1のうち、大きいほうの値を返します。|
|i = aMinInt(i0, i1)|便利関数|01a~|i0とi1のうち、小さいほうの値を返します。|
|ARep(n)|便利マクロ|01a~|{ }の範囲をn回繰り返します。実体はfor文なので、break;やcontinue;もできます。|
|ARep0(n, i)|便利マクロ|01a~|ループカウンタを指定できるARep()です。入れ子も可能です。|
|i = aArgMaxRndInt(a, i0, i1)|便利関数|01a~|a[i0~(i1-1)]の中で最大値となるiを返す。もし最大となるiが複数あるときは、その中からランダムで選ぶ。|
-描画関数は全て便利関数
--描画関数は、関数名の末尾にOptを付けた関数も存在します。その場合、引数wの直後に以下のoptを指定できます。
---AOPT_Cf : カラーコードはパレット番号ではなく、24bitカラーコードで指定
---AOPT_Rf : 座標指定は拡張キャラクタ単位ではなく、ピクセル単位で指定
---AOPT_RfCf : Rf+Cf
---AOPT_Gn : この描画では aGetEch バッファに書き込まない
---AOPT_GnCf : Gn+Cf
---AOPT_GnRf : Gn+Rf
---AOPT_GnRfCf : Gn+Rf+Cf

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS