ページへ戻る

− Links

 印刷 

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

osaskwiki:blike/man/p0002

ページ内コンテンツ
  • 上級者向けのblikeマニュアル(2)
      • グラフィック描画関数群
      • そのほかの関数群
      • 基本的なゲームの作り方

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

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

グラフィック描画関数群 anchor.png[5]

  • [01f以降] setPix(int x, int y, int c)
    • 画面に点を打つ。cは色で0x000000~0xffffffが有効。
  • [01f以降] drawLine(int x0, int y0, int x1, int y1)
    • 線を引く。色は事前に color() か setCol() で指定しておくこと。
    • アルゴリズムの関係で、drawLine(x0, y0, x1, y1) と drawLine(x1, y1, x0, y0) が厳密には重ならない場合もある。とはいえ、ズレは1ピクセル程度である。
      • これがいやなら bball00a.c のようにすればいいだろう。
        if (x0 <= t[j].x)
            drawLine(x0, y0, t[j].x, t[j].y);
        else
            drawLine(t[j].x, t[j].y, x0, y0);
  • [01f以降] drawRect(int sx, int sy, int x0, int y0)
    • 長方形を描く。sxとsyが大きさで、x0とy0は左上の頂点の座標である。色は事前に color() か setCol() で指定しておくこと。
  • [01f以降] fillRect(int sx, int sy, int x0, int y0)
    • 塗りつぶした長方形を描く。色は事前に color() か setCol() で指定しておくこと。
  • [01f以降] fillOval(int sx, int sy, int x0, int y0)
    • 塗りつぶした楕円を描く。引数の意味するところは、この4パラメータで「仮想的な」長方形を指定し、その長方形に内接するような楕円を描画するということである。このような仕様にしたのは、Javaアプレットの関数の仕様をまねたからである。色は事前に color() か setCol() で指定しておくこと。
  • [01f以降] setCol(int c)
    • 描画色を設定する。0x000000~0xffffffが有効。これは文字表示色にもなる。だから color() よりも微妙な色指定ができることになる。
  • [01f以降] setBCol(int b)
    • 背景色を設定する。0x000000~0xffffffが有効。といっても背景色は文字表示関数と cls() くらいしか参照してない。
  • [01f以降] int iCol(int c)
    • cは0~15が有効で、これを0x000000~0xffffffの整数に変換する。color()関数が内部で使っているものを表に出しただけ。
  • [01f以降] int rgb(int r, int g, int b)
    • r, g, b はそれぞれ0~255が有効。これらを0x000000~0xffffffの整数に変換する。
  • [01f以降] drawStr(int x0, int y0, int rx, int ry, const char *s, ...)
    • 文字列を描画する。printfとの違いは、描き始めの位置をピクセル単位で制御できることと、重ねあわせができることと、拡大ができることである。
    • rxやryは倍率で、整数倍のみ指定できる。
  • [01f以降] setMode(int flags)
    • flagsは以下のものが指定できる。
      #define BL_PSET     0x00000004
      #define BL_PAND     0x00000005
      #define BL_POR      0x00000006
      #define BL_PXOR     0x00000007
      #define BL_DBGFLSH  0x00000040
      #define BL_RLSFLSH  0x00000060
      #define BL_DEBUG    BL_DBGFLSH
      #define BL_RELEASE  BL_RLSFLSH
    • PSET, PAND, POR, PXOR はどれか一つを指定することができる。デフォルトでは PSET になっている。指定しなければ変更されない。
      • これらは setPix(), drawLine(), drawRect(), fillRect(), fillOval(), drawStr() に影響する。
    • DBGFLSH, RLSFLSH もどれか一つを指定することができる。デフォルトでは DBGFLSH になっている。指定しなければ変更されない。
      • これはフラッシュ忘れを分かりやすくする。リリースモードにするとフラッシュ忘れが分かりにくくなる代わりに(忘れていても結構それなりに画面に反映されてしまうことがある)、メモリが節約され、速度も向上する。
      • リリースモードにしたいときは、一番最初に setMode(BL_RELEASE); と書くのが良いだろう。
      • デバッグが終わる前にリリースモードにするべきではない。
  • [01f以降] openVWin(int n, int sx, int sy)
    • 裏画面(仮想画面)を準備する。n=0は表画面のことなので、 openWin(sx, sy); は openVWin(0, sx, sy); と同等である。
    • nは0~15が有効なので、裏画面は最大15枚持てるということになる。裏画面は何を描いても画面には反映されない。裏画面に対してなら、0x000000~0xffffff以外の色を使ってもよい。
    • 裏画面は、背景やキャラクタなどを描いておいて、重ね合わせ処理をするときなどに使う。詳しいことは copyRct0() などを参照のこと。
  • [01f以降] slctWin(int n)
    • 描画関数がどの画面に対して描画を行うかを指定する。 openVWin() しないまま slctWin() して描画することもできて、その場合は表画面と同一サイズで blike が openVWin() する。
  • [01f以降] copyRct0(int sx, int sy, int n0, int x0, int y0, int n1, int x1, int y1)
    • ウィンドウのある領域の画像を、別のウィンドウの同じ大きさの領域にコピーする。sxとsyは領域のサイズで、n0やn1はウィンドウ番号。 n0, x0, y0 の内容が、 n1, x1, y1 へコピーされる。
    • n0とn1が同じウィンドウを指していてもよく、その場合は同一画面内でのコピーになる。ただし領域が重なっていてはいけない。
  • [01f以降] copyRct1(int sx, int sy, int n0, int x0, int y0, int n1, int x1, int y1, int ic)
    • ウィンドウのある領域の画像を、別のウィンドウの同じ大きさの領域にコピーする。その際、 ic で指定した色が透明色として扱われる。
  • [01f以降] drawPtrn(int sx, int sy, int x, int y, char *c, char *p)
    • ドット絵を描く。sxとsyは絵の大きさ。xとyは絵を描く座標。cは配色や絵の名前を指定するための文字列で、pは絵の内容を表す文字列である。以下に例を示す。
      drawPtrn(8, 8, 100, 100, "%name=sample ○=#000000 ●=#FFFFFF",
          "●●●●●●●●"
          "●○○○○○○●"
          "●○●●●●○●"
          "●○●○○●○●"
          "●○●○○●○●"
          "●○●●●●○●"
          "●○○○○○○●"
          "●●●●●●●●"
      );
    • この例では全角文字を使ったが、 test021a.c のように半角でもよい。
    • 絵の名前はエラー時にのみ使われるので、エラーが起きないのなら指定しなくてもよい。
    • この関数は文字列をちまちまと解釈するのであまり高速ではない。もし何度も表示するのなら、裏画面に一度これで描いておいて、あとはそこからcopyRct0するのがいいだろう。
    • 色指定は、 #hhhhhh の形式の代わりに 0xhhhhhh を使うこともできる。多分そうしたほうが初心者には教えやすい(getPixして色比較するときに、if文中に #FFFFFF とは書けないから)。
    • ちなみに色 #80000000 は透明色として扱われ、描画されない。
Page Top

そのほかの関数群 anchor.png[6]

  • [01f以降] int rnd(int n)
    • 0からn-1の範囲の乱数を返す。
  • [01f以降] srand(int s)
    • 乱数のパターンを指定する。
Page Top

基本的なゲームの作り方 anchor.png[7]

  • 実はゲームに限らず、この構造は頻出する。
    準備の処理
    for (;;) {
        画面に描画など(動かないものは再描画しないようにすると動作が軽くなる)
        必要ならflshWinをやる(下でwaitを使うのならこれはやらなくていい)
        終了判定が成立すればbreak
        waitかwaitNF
        inkey
        キー入力によっていろいろやる
        キー入力によらない時間経過処理など(敵が動くとか)
    }
    終了処理
  • inkeyの後にも描画やflshWinをする場合がある。
  • ポイントは、画面を作り終わったらwaitして、waitの直後にinkeyするということである。

Last-modified: 2011-03-11 (金) 00:00:00 (JST) (319d) by lina