blaライブラリのメモ
(0)
- blaライブラリは、Basic-Likeライブラリのadvanceバージョンのこと。現バージョンはWindows用のみ。
- 初心者向けの使いやすさよりも、ウィンドウを複数持つ仕組みの方に力点を置いている。
- とりあえずライブラリとしては最大16個のウィンドウを管理できる。
- bla.cを修正すればもっと増やせる。
- 作者は川合。
- Essenではグラフィックを簡単に扱えるようにしたいので、blaライブラリを使う。
- あとEssenはマルチウィンドウ環境にしたい。メインウィンドウで実行して、サブウィンドウにはプロンプトがあり、そこで動作中のプログラムの変数のprintなどができるとか。
(1)
- #include "bla.h"して使う。Windows版の場合、リンク時は-lgdi32が必要。
- もしくは#include "bla_easy.h"して使うこともできる。この場合、関数名の頭についている「bla_」を省略できるようになる。
- bla_openWin(xsiz, ysiz, title)
- xsiz, ysizはウィンドウの描画可能域のサイズ。titleは文字列。
- titleについては、呼び出し時に内部ワークエリアへタイトルをコピーするので、呼び出し後に文字列が破壊されても問題ない。
- [返値] bla_Window * 型のハンドルを返す。リソース不足によりウィンドウのオープンが失敗した時は、NULLを返す。
- なおこの関数によって開かれたウィンドウは、アプリがCtrl-Cなどで強制終了した場合や単にexitなどで終了した場合のどちらでも、勝手に閉じられてリソースをOSに返す。つまりウィンドウを消したくなければアプリは終了してはいけない。
- なお、ユーザがウィンドウを勝手に閉じてしまう場合はありうる。その場合、win->phase==2になるので、それを検出して対処することはできる。この場合リソースはまだ解放されていないので、closeWinする必要がある(もしくはアプリを終了してしまえばリソースは解放される)。
- bla_closeWin(win)
- ウィンドウを閉じる。リソースも解放される。
- [返値] この関数はvoidなので何も返さない。
- bla_exit(code)
- codeはint。アプリを終了する。
- この関数で終了すると、最も互換性の問題が少ないはず。
- [返値] この関数はそもそも帰ってこない。
- bla_flushAll(win)
- winはハンドル。描画バッファの内容を確実に画面に反映させる。
- [返値] この関数はvoidなので何も返さない。
- bla_leapFlushAll(win, t)
- tはミリ秒。描画バッファの内容を過負荷にならない頻度で画面に反映させる。
- 過負荷になるかどうかは、前回の反映からどのくらいの時間が経っているかで判定する。
- 具体的には、前回描画時刻からtミリ秒以上経っていればflushAllする。
- t=0の場合は、無条件にflushAllする。
- ループの中でflushする場合とかに使える。
- [返値] この関数はvoidなので何も返さない。
- bla_end()
- アプリケーションを終了するが、もしまだ閉じていないウィンドウがあればそれをflushして、ユーザによって閉じられるのを待つ。ウィンドウが全部閉じられたらbla_exit(0);する。
- bla_wait(msec)
- ミリ秒単位のwait。WindowsならSleep関数を使えばいいのだけど、それだと他のOSに移植するときに困難になるので、blaがラッピング関数を提供している。
- [返値] この関数はvoidなので何も返さない。
- bla_rgb(r, g, b)
- 256階調のRGB値から色番号を生成する。これは単に使いやすくするための便利ツールであり、OS依存を解消するためのものではない。RRGGBBになる。
- [返値] intで色番号を返す。
- bla_setPix(win, x, y, c)
- ウィンドウの描画域内の1画素の色を設定する。xやyに画面外の値を設定しないことを想定しているので注意(blaは上級者向けなので、安全よりも速度を優先している)。
- [返値] この関数はvoidなので何も返さない。
- bla_setPixEx(win, x, y, c)
- ウィンドウの描画域内の1画素の色を設定する。こちらではxやyが画面外になるかもしれないことを想定しているし、setMode()で指定した描画アルゴリズムを反映する。またcが-1であれば透明色指定だと判断して描画しない。
- つまり速度は落ちるが多機能である。
- [返値] この関数はvoidなので何も返さない。
- bla_fillRect(win, sx, sy, x0, y0, c)
- ウィンドウの中に塗りつぶした長方形を描画する。sxとsyは描画したい長方形のサイズ、x0とy0は長方形の位置(長方形の左上の座標)。
- [返値] この関数はvoidなので何も返さない。
- bla_fillRectEx(win, sx, sy, x0, y0, c)
- 描画に際して、bla_setPixEx()を使う。したがって長方形の一部が画面外にあっても正しく描画される。
- bla_drawRect(win, sx, sy, x0, y0, c)
- bla_drawRectEx(win, sx, sy, x0, y0, c)
- bla_fillOval(win, sx, sy, x0, y0, c)
- bla_fillOvalEx(win, sx, sy, x0, y0, c)
- bla_drawOvalEx(win, sx, sy, x0, y0, c)
- 円もしくは楕円をかく。引数はRectと同じで、それで仮想的な長方形を指定すると、それに内接する楕円を描画する。sxとsyを同じ値にすると楕円ではなく正円になる。
- drawOvalはない(もはや内部の処理が複雑で、非Ex版を作っても速度は大差ないから)。
- bla_getPix(win, x, y)
- 指定した座標の色を返す。
- [返値] 色番号をintで返す。
- bla_drawStr(win, x0, y0, c, b, str)
- bla_drawStrEx(win, x0, y0, c, b, str)
- 文字列を描画する。cは文字色。bは背景色。bに-1を指定すれば背景色が透明になって上書きする絵を壊さずに描画できるが、そういうことをしたいときはEx版のほうを使わなければいけないので注意すること。
- 描画の際に使われるフォントは8x16ピクセルの半角フォントで、これはblaが内部で持っているのでOS依存はないが、その代わり全角文字が一切使えないという欠点がある。
- bla_drawLine(win, x0, y0, x1, y1, c)
- bla_drawLineEx(win, x0, y0, x1, y1, c)
- bla_setMode(win, mode)
- ウィンドウごとに描画モードを設定する。bla_setPixEx()が参照する。
- modeに指定できる値は次の4種類。
- bla_MODE_SET
- bla_MODE_OR
- bla_MODE_AND
- bla_MODE_XOR
- [返値] この関数はvoidなので何も返さない。
- bla_waitEx(msec)
- 基本的にはミリ秒単位のwait。しかしそれ以上の機能も持っていて、待っている間にグラフィックウィンドウが閉じられた場合は、すべてのウィンドウが閉じられていないかをチェックして、もし全部閉じられてしまったらbla_end()を実行する。
- msecを0にすることも可能で、この場合、単に「もしすべてのグラフィックウィンドウが閉じられたらbla_end()を実行する」という命令になる。
(2)
- 現在blaライブラリはMacOS版もあり、つまりアプリは移植作業無しで共通化できるわけだけど、その際には注意しなければいけないことがあることが判明している。それはMacOSではどうもシステム側で多くのマクロや構造体を定義しているらしく、Windowsなら普通に使える名前が使えない。
- 既に分かっているもの: Point, MAX
- ちなみに私はそういう場合は、頭にaをつけてきりぬけようと思っている。anotherのaのつもり。
こめんと欄