ABで避けゲーを作る

前回までのあらすじ:エラーを克服し、ActiveBasicにゲームを作らせたが、出来上がったのは何もない空虚なウィンドウだけであった。

3.画面描画

そーいえばPaintSceneというのを用意するにはしましたが何かを描くような命令はしてません。
ActiveBasicのアホはいちいち命令してやらないと・・・・うわあ!
ごめんなさいすみませんすいません!もうActiveBasicのアホとかいわないから僕のことバカっていわないで!!

あー、あー、よーするになんか描けばいいわけです。
背景とマイキャラと敵キャラを描けばよさそうですね。
早速コードを書いてみます。

Function PaintScene()
    '画面描画
    'アニメの1コマだと思えばわかりやすいとよく言われる
    PaintBackground()   '背景描画
    PaintMyChara()      'マイキャラ描画
    PaintEnemy()        '敵キャラ描画
End Function

ここでコンパイルしたらまた知らないだの無効な識別子だの言われることは目に見えているので先手を打ってみんな作っておきます。

Function PaintBackground()
    '背景描画
End Function

Function PaintMyChara()
    'マイキャラ描画
End Function

Function PaintEnemy()
    '敵キャラ描画
End Function

これだけ作っておいても何も表示されないでしょうね。
何しろActiveBasicはアh・・・いや、命令以外の余計なことは一切しないお利口さんだから、描くための命令をいろいろ使って描画します。まったく、いちいち世話が焼けます。
・・・・で、どうしましょう。
とりあえず一番大事そうなマイキャラの描画からはじめましょうか。

・・・・
・・・・
・・・・

めんどくさい。

ね、ねえねえ!いきなり綺麗な画像を出そうなんてさ、贅沢じゃないですか!そう思うでしょ?ね!ね!
どーせで画像だけ差し替えることもできるんですから、今は区別さえ付けば何でもいいじゃありませんか!まるでもいいじゃありませんか!
私、まるを描くだけなら自信があるんです!

どんなまるにしましょうか。あんなまる?こんなまる?それともそんなまる?
青くて直径32ドットで中を塗りつぶしたまる(148byte)にしましょうか。
青くて、直径32ドットで、中を塗りつぶした、まる、です。
リファレンスを見ていたらEllipseっていう関数を見つけました。

Declare Function Ellipse Lib "gdi32" _
   (hdc As DWord, _
    nLeftRect As Long, _
    nTopRect As Long, _
    nRightRect As Long, _
    nBottomRect As Long) As Long

よーわかりませんが多分下の図のようだと思います。
nLeftRectとnRightRectが左端からの距離、nTopRectとnBottomRectが上端からの距離(1.21kilobyte)
中心と半径じゃなくて左・上・右・下の座標をしているみたいですね。
左を中心のX座標-半径、上を~中略~にすればよさそうな気がします。
円の中心、をなんにするかといえば、当然マイキャラの場所。これには文句言わせません。

hdcとやらが曲者ですね・・・・
GetDCで取得して、いろんな描画命令で使って、使い終わったらReleaseDCで開放するそうです。
デバイスコンテキストへのハンドルなんていかめしい説明がされていますが、要するに何かを描くために必要な整理番号のようなものなんです。
嘘だと思うなら実際の番号を見てみますか?

Dim hDC As DWord
hDC = GetDC(hMainWnd)
MessageBox(hMainWnd, Str$(CDbl(hDC)), "今日のhDCは・・・?", 0)
ReleaseDC(hMainWnd, hDC)

151064240という数字が表示された(534biye)
というわけで、この数字を使っていろいろ描くことになります。
今回はたまたま151064240という数字が出ましたが、この値は実行するたびに変化するようなので、毎回GetDCで整理番号をもらうことになります。
ちなみにhMainWndというのはウィンドウへのハンドル、つまりこれも整理番号ということです。
Windowsってなんでもかんでも番号で扱ってるみたいですね。

なんだかわかったようなわからなかったような説明でしたが、hdcもnLeftRectもnTopRectもnRightRectもnBottomRectもわかったとして、とにかく描いてしまいましょう。
まるさえ出てくればこっちの勝ちです。(何が?)
GetDCで整理番号をもらって、Ellipseでマイキャラを描いて、ReleaseDCで後片付けをする、ということになりそうです。

Function PaintMyChara()
    'マイキャラ描画
    'めんどーだからまるでいーや!
    Dim hDC As DWord
    hDC = GetDC(hMainWnd)
    Ellipse(hDC, MyCharaX-16, MyCharaY-16, MyCharaX+16, MyCharaY+16)
    ReleaseDC(hMainWnd, hDC)
End Function

おっと、MyCharaXとMyCharaYというのはマイキャラの場所を表します。
忘れないように定義しておかないとまたActiveBasicに怒られます。
とりあえずグローバルなところ(?)に定義して、場所を100,200の場所にしておきます。
言葉じゃ意味がわからなくても、実際にやってみればなんとなくわかる!(多分)

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim MyCharaX As Long, MyCharaY As Long
MyCharaX = 100
MyCharaY = 200

黒縁の白いまるが出てきた(770byte)
おぉ、まるだ。
って、白かよ!!
・・・・どうせまた後で画像に差し替えるんだから青じゃなくて白でもいいじゃありませんか・・・・ねぇ。

続く