LAST UPDATE 1998/08/08


『 その8-5 』


 ■ 強制的に偶数にする

例えばマウスからの入力座標を強制的に偶数にしたいとき、こんな場合は
    X = X And &HFFFFFFFE
にする。なぜFFFFFFFEかというと、マウス座標は通常Long型で表されるので、4バイトなのである。4バイトという事は16進数にすると8桁なのでこのような数値になる。ついでに
    X = X And &HFFFFFFF8
にすると、8単位に数値を丸めることができる。


 ■ スイッチのON/OFFを切り替える

プログラム中でスイッチやフラグが必要になったときは通常、0がOFFで1がONというように考える。スイッチの変数をSWと宣言して1だったら0に、0だったら1に切り替えるプログラムを作るとする。それをifを使って行うと
    if (SW=0) Then SW=1 Else SW=0
になる。これでも問題はないのだが、ifは通常スピードが遅い。そこで
    SW = SW Xor 1
とする。数値の論理演算はスピードが速いのである。


 ■ 色数を減らす

 通常Windowsでは色をRGBそれぞれ1バイト(8ビット)で表す。その場合色数は1600万色である。これはフルカラーとかTrue Colorとか呼ばれている。1バイトだから256種類、それが3個だから256×256×256= 16777216色なのである。減色したい場合がある。
 ビット数と色数の関係を表に示すので参考にしてもらいたい。
例えばフルカラーで表されているカラーコードを512色以内に丸めたい場合を考える。フルカラーの場合は各色8ビットで表されている。例えば赤の成分が99だったとする。
    99 = &H63 = 0110 0011
である。512色ということは表を参考にすると各色3ビットしか使えないことになる。3ビット以内に数値を丸めるということは、2進数で表したときに上の方(左側)の3ビットを残して捨てれば良い。したがって
ビット数  
B G R 合計 色数
1 1 1 3 8
2 2 2 6 64
2 3 3 8 256
3 3 3 9 512
5 5 5 15 32768
5 5 6 16 65536
8 8 8 24 フルカラー
    0110 0011 And 1110 0000
という論理演算をすれば良い。結果は
    0110 0000 = &H60 = 96
になる。1110 0000は16進数で&HE0なので、実際には
    Pic.Pset(x, y), Pic.Point(x, y), &HE0E0E0
とすれば良いことになる。


 ■ 特定のビット情報を取り出す

 ピクチャーボックスなどの情報を取り出す命令でPointというのがある。
    Color = Pic.Point(X, Y)
というように使用する。これで、XYで指定した場所に表示されているカラーコードを取り出すことができる。
    Color = &H00BBGGRR
という構成になっているので、例えばここで緑の成分を取り出したい場合は
    G = Pic.Pset(X, Y) And &HFF00&
    G = G / &H100
とすれば良いのである。


 ■ 特定のビットをマスクする

 現在製作中のプログラムのピクチャーボックスを左ダブルクリックしてみよう。するとピクチャーボックスのClickイベントのコードが表示される。次にそのウインドウの上の右側にあるイベントリストを開いて、MouseDownというイベントを開いてみよう。すると入力引数が
    Pic_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
になっている。ここで再びVBのヘルプを見てみよう。ここにShiftに関する説明が出ている。説明には、「Shiftはビットフィールドで、ビット0が…」などと書いてある。これを読んですぐに意味のわかる初心者の人は初心者ではない。 シフトの変数型はInteger型であるからして、サイズは2バイトである。ということは16進数では4桁、2進数では16ビットで表される。 2進数でものを考えるときに一番右の数字をビット0と呼ぶ。そこから左に向かってビット1、2となっていって、一番左端の数字はビット15になる。
pic3.gif  例えば、Altキーが押されていた場合は
    Shift = 0000 0000 0000 0100 = 4
になり、Alt+Shiftであれば
    Shift = 0000 0000 0000 0101 = 9
という値が入っている。 Altキーが押されていたかどうか調べたい場合には
    if (Shift = 4) Then
というコードでも良い。しかし、AltもしくはCtrlのどちらかが押されていた場合という条件で調べたい場合には
    if ((Shift = 4) Or (Shift = 2) Or (Shift = 6))
という条件式にしなければならない。6というのはAlt+Ctrlの場合である。ところがこんなときにAnd演算を使うと便利なのだ。この場合はAltキーのビットとCtrlキーのビットを1にして考える。2進数では0000 0000 0000 0110だから、16進数では&H06である。したがって
    If ((Shift And &H06)<>0)
とコードを書くことによって、判定することができる。また、ここではビット3~15までは未使用で0が入っている。ところが物によっては0という数値が保証されていない場合がある。そんな場合の備えのためにも、Shift=4などと直接数値を調べるよりも、And演算で必要のないビットを消して(マスクする)調べた方が確実なのだ。
それでは次回はいよいよ3次元でコースが表示されるのである。





その8 -1 | その8-2 | その8-3 | その8-4 | その8-5

『 サルのゲーム製作講座 』 目次 | その 1 | その 2 | その 3 | その 4 |
その 5 | その 6 | その 7 | その 8 | その 9 | その 10 | その 11


もどる

e-mail: sc_3da@magical2.egg.or.jp