ページへ戻る

+ Links

 印刷 

blike​/man​/p0001 :: OSASK計画

osaskwiki:blike/man/p0001

上級者向けのblikeマニュアル(1) anchor.png

  • (by K, 2011.03.08)
  • このページはC言語の文法が分からないという人を対象にはしていません。そういう人はblike​/introへ。
  • ドライバ開発者向けの情報はblike​/drvにあります。
Page Top

キャラクタ系関数群 anchor.png

  • [01f以降] printf(const char *s, ...)
    • いわゆるprintf。しかしフォーマット記述子はなんでも全部使えるというわけではない。どのくらいのさじ加減にするかは検討中。
    • 表示される文字は8x16ピクセルの固定ピッチフォントで、それ以外の文字が使いたいときは他の方法での表示を推奨する(グラフィック描画など)。
  • [01f以降] puts(const char *s)
    • 文字列の表示。標準関数のputs()と同様に、出力後に改行が付加される。
  • [01f以降] bl_puts(const char *s)
    • 文字列の表示。標準関数のputs()とは異なり、改行の付加はない(そういう意味でfputs()ふう)。
  • [01f以降] putc(int c)
    • 文字の表示。
  • [01f以降] locate(int x, int y)
    • 次回のprintfでの表示位置を指定。左上は(0,0)である。右下の座標はウィンドウサイズによる。デフォルトでは640x400なので、(79,24)が右下になる。
  • [01f以降] color(int c, int b)
    • テキスト表示のカラーを指定。cは文字色。bは背景色。それぞれ0~15が有効。-1などの無効な数値を指定すれば無視されるので、color(7, -1);などとすれば文字色だけの変更も可能。指定した色が反映されるのは次回のprintfからである。
    • 何番がどの色なのかは、以下を参照のこと。1~7が高輝度で、8~15が低輝度である。
      static int t[] = {
          0x000000, 0x0000ff, 0x00ff00, 0x00ffff, 0xff0000, 0xff00ff, 0xffff00, 0xffffff,
          0x5f5f5f, 0x0000af, 0x00af00, 0x00afaf, 0xaf0000, 0xaf00af, 0xafaf00, 0xafafaf
      };
  • [01f以降] cls()
    • 画面全域を背景色で消去する。
Page Top

キー入力関数群 anchor.png

  • [01f以降] int inkey()
    • blikeではキー入力はすべてキーバッファに貯められるが、そのキーバッファから1つ取り出す。もしキーバッファが空であれば0を返す。したがってこの関数を呼んでも処理はとまらない(それがgetc()とは違う)。
    • キーコード比較用に以下のマクロが#defineされている。
      #define KEY_ENTER   '\n'
      #define KEY_ESC     27
      #define KEY_BACKSPACE 8
      #define KEY_TAB     9
      #define KEY_LEFT    331
      #define KEY_RIGHT   333
      #define KEY_UP      328
      #define KEY_DOWN    336
      #define KEY_INS     338
      #define KEY_DEL     339
    • (これらの(変則的な)値は、blikeの旧バージョンとの互換性のため。旧バージョンではwin32の仕様に振り回されて適当に決めた。)
  • [01f以降] gets(char *s)
    • 一行入力。これはカーソルが出て、入力を促す。
  • [01f以降] int bl_inkey(int flags)
    • これはもっと小回りのきくinkeyである。flagsには以下のものを指定できる(組み合わせたいときは | でつなぐ)。
      #define BL_WAITKEYF     0x00000001
      #define BL_WAITKEYNF    0x00000002
      #define BL_WAITKEY      0x00000003
      #define BL_GETKEY       0x00000004
      #define BL_CLEARREP     0x00000008
      #define BL_DELFFF       0x00000010
    • まず、何も指定しない場合、すなわち bl_inkey(0) を説明しよう。この場合、キーバッファの先頭の値を得ることができるが、この値はバッファから削除されない。つまりキーバッファをいじらずに、入力が来ているかどうかを確認できる。
    • BL_GETKEY を指定すれば、 inkey() と同じく取得した値をバッファから取り除く。
    • BL_WAITKEY を指定すれば、キーバッファが空の間は wait() するようになる。つまりキーが入力されるまで待つ。
    • BL_WAITKEYNF を指定すれば、キーバッファが空の間は waitNF() するようになる。つまりキーが入力されるまで待つ。
    • BL_WAITKEYF を指定すれば、inkey() 処理に先立って画面全域の flshWin() を行う。
      • ちなみに、フラグを見れば自明だが、 BL_WAITKEY == BL_WAITKEYF | BL_WAITKEYNF である。
    • BL_CLEARREP を指定すれば、過剰なキーリピートを削除する。ゲームなどではこれをやったほうがいいことが多い。逆にgetsみたいなものを自作したいときは、これをやらないほうがいい。
    • BL_BL_DELFFF を指定すれば、blikeが内部制御用に挿入している 0xfff のキーコードを返さないようになる。
    • inkey() に相当するのは、 bl_inkey(BL_GETKEY | BL_CLEARREP | BL_DELFFF) である。
Page Top

表示制御関数群 anchor.png

  • [01f以降] openWin(int sx, int sy)
    • ウィンドウの大きさを指定する。ウィンドウといっているが、実際のニュアンスは必要な画面の広さというべきかもしれない。
    • blikeではウィンドウは一枚しか開けない(というか必要な画面の広さはひとつ)。ただし裏画面を持つことはできる。裏画面については openVWin() を参照。
    • ウィンドウシステムをサポートしないOS上では、この命令で画面解像度が変更されるかもしれない。
    • openWin() は最初に一度しか設定できない。二度目以降の実行は無視される。sxは160以上でなければいけないし、syは1以上でなければいけない。
    • openWin() を実行する前に文字表示や描画系の関数を呼ぶと、 openWin(640, 400); が実行される。これがデフォルトの画面サイズである。
    • openWin() は、ウィンドウを準備した後に cls() を実行する。しかし flshWin() は実行していないので、必要に応じてフラッシュしなければいけない。
  • [01f以降] flshWin(int sx, int sy, int x0, int y0)
    • ウィンドウの内部バッファをフラッシュする。
    • 多くのOSでは、画面表示にはそれなりの時間がかかる。したがって、blikeではすべての描画関数(文字表示も含まれる)の実行結果をすぐには画面には反映させていない。内部バッファでのみ処理する。そして一通りかき終わったら、このフラッシュ関数でバッファの内容を画面に反映させる。そういう仕組みである。
    • しかしこのフラッシュの概念は初心者にはやや難しいため、wait() 関数を普通に使っていれば、blikeが適当なタイミングで flshWin() するようになっている。しかし blike まかせではやっぱり処理は重くなる傾向にあり、したがって動作の軽快な良いアプリケーションを書きたいのであれば、フラッシュの自前制御は欠かせない。
    • この関数では、グラフィック座標(x0, y0)から、右にsxピクセル、下にsyピクセルの、長方形の範囲の内部バッファをフラッシュして画面に反映させることができる。flshWin() はやはり負荷の大きな関数で、その負荷の大きさはこのときに指定する長方形の面積に強く依存する。したがって変更していない部分をできるだけ含まないようにしてやれば、高速になる。
    • また長方形の面積によらない固定的な負荷もあるので、斜めに線を引いたからといって1ピクセルずつフラッシュするのは効率が良くない。ある程度の大きさで何回かに分けるのがベストだろう。
Page Top

時間制御関数群 anchor.png

  • [01f以降] wait(int msec)
    • 画面全域のフラッシュの後、指定された時間だけ待つ。時間の指定はミリ秒。
    • この待っている間もキー入力などは受け付けていて、それはバッファに貯められている。
    • この関数はフラッシュを伴うので、ウィンドウサイズによっては結構重い関数である。
    • blike初心者向き。
    • wait(-1); とすると無限に待つ。
  • [01f以降] waitNF(int msec)
    • これはwaitから自動フラッシュ機能を省いたものである。この関数はかなり軽い。しかしwaitをやめてこれにするということは、自分でフラッシュを管理するということであり、その意味でこれはblike初心者向きではない。
  • [01f以降] int bl_clock()
    • アプリが起動してからの経過時間をミリ秒で返す。

Last-modified: 2011-03-08 (火) 00:00:00 (JST) (319d) by lina