キャッチゲームの制作 VB6
 (2) 網の移動処理 (キーの判定) 前へ 目次へ 次へ 

 落下物(リンゴ)を受け取る網を左右に移動させる。

 1. キーの判定

 移動には、左右のカーソル移動キー(←、→)を使う。キー入力は、フォーム(Form1)のKeyDownイベントで受け取ることにするので、プログラムはForm_KeyDownプロシージャに書く。

 Form1オブジェクトのKeyDownプロシージャの引数はKeyCodeとShiftがある(どちらもInteger型)。引数KeyCodeには押されたキーのコード(文字コードとは意味が異なる。*1参照)が格納されている。

 特殊なキー(カーソルやエンターキーなどの機能キー)のコードはVisualBasicの定数として設定されている。ここで必要な左右のカーソル移動キーはそれぞれvbKeyLeft, vbKeyRightとして定義されている。(その他のキーについてはヘルプの「Keycode 定数」を参照)

if KeyCode = vbKeyLeft Then    '←(左移動)キーが押されたとき

 引数Shiftは次のようなデータが格納される。

第0ビット : Shiftキー、   第1ビット : Ctrlキー、   第2ビット : Altキー
1 : 押されている、  0 : 押されていない


 2. 網の移動処理

 ウィンドウの横幅はプロパティで9600(twip)と設定したので、例えば1回の移動量を100twipとするとキーを96回押すと端から端まで移動する。この移動量を200twipずつにすると半分の48回で端から端まで移動する。すなわち、「移動スピード = 移動量」ということになる。
 ここでは、80twipずつ移動させることにする。また、Shiftキーを押しながら移動させると倍の160twipずつになるようにする。移動量については実際に実行させてみて調節すること。

・プログラムリスト

Option Explicit    '変数宣言を強制する

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'網の移動処理
    If KeyCode = vbKeyLeft Then    '左カーソル移動キー(←)
        '網の移動量計算
        imgNet.Left = imgNet.Left - 80 * ((Shift And &H1) + 1)
        If imgNet.Left < 0 Then    '左端まで到達したとき
            imgNet.Left = 0
        End If
    ElseIf KeyCode = vbKeyRight Then    '右カーソル移動キー(→)
        '網の移動量計算
        imgNet.Left = imgNet.Left + 80 * ((Shift And &H1) + 1)
        If imgNet.Left > Form1.ScaleWidth - imgNet.Width Then    '右端まで到達したとき
            imgNet.Left = Form1.ScaleWidth - imgNet.Width
        End If
    End If
    imgNet.Move imgNet.Left, imgNet.Top    '網の移動
End Sub

Private Sub Form_Load()
    ChDrive App.Path    'カレントドライブをプログラムと同じドライブにする (注意)
    ChDir App.Path      'カレントフォルダをプログラムと同じフォルダにする
End Sub

 先頭のOption Explicitは、変数宣言を強制する、すなわち、変数宣言をしていない変数は使えないようにする命令である。(*2参照)

 移動量の計算で80に((Shift And &H1)+1)をかけ算している。(Shift And &H1)の部分でShiftキーのデータだけを取り出し(マスクという)ている。@Shiftキーが押されていなければ(Shift And &H1)の部分は0で1を加算して80*1となる。AShiftが押されているときは(Shift And &H1)の部分が1になり1を加算して80*2となる。網の横方向の座標(x座標)はLeftプロパティで設定する。
 移動量の計算後、網がウィンドウをはみ出ないようにIf文でx座標(Leftプロパティ)を検査している。

 Form_Loadプロシージャで実行している二つの命令の注釈にあるカレントとは、現在の作業場所という意味で作業場所をプログラムと同じドライブ、フォルダに移動(設定)している。こうしておけば、例えば得点データをファイルに保存するときもファイル名だけを指定すれば、プログラムと同じドライブ、フォルダに保存される。

(注意)
 ネットワーク上のドライブを使用しているとき次の命令はエラーになる。
        ChDrive  App.Path
 これはApp.Pathにドライブ名(A〜Z)が記憶されていないためである。ネットワークドライブの割り当てをしているときも同じである。次のようにコメントにしておく。

        'ChDrive  App.Path
ファイル保存の場所注意

 実行してみよう。網がカーソル移動キーで左右に移動するはずである。

 

*1 キーコードと文字コード
 キーコードは、キーひとつひとつに割り当てられたコードである。例えば、Aのキーには"A", "a", "ち"の3つの文字が割り当てられているが、文字には関係ない。したがって、大文字のモード、小文字のモード、カナのモード、どのモードであってもAのキーを押したときはvbKeyA(65)が得られる。
 文字コードは、文字のひとつひとつに割り当てられたコードで、"A"は&H41、"a"は&H61というように文字ごとに異なるコードが得られる。

 

*2 変数宣言を強制するメリット
 「テーマ0 プログラミングを始める前に」でも説明したように、変数は宣言した方が高速に動作する。さらに、変数のスペルミスなどを防ぐこともできる。例えば、得点用の変数にTokutenを使っていたとする。10点ずつ加算する計算式で

Tokuten = Tokutenn + 10

と書いたとする。変数宣言が強制されていなければ実行してもエラーが発生しない。ただし、変数Tokutenには点数(10)は加算されない。Option Explicitで宣言を強制しておけば、

Dim Tokuten As Integer
  …
Tokuten = Tokutenn + 10

を実行すると、Tokutennが宣言されていないというエラーが発生する。

 


 (2) 網の移動処理 (キーの判定) 前へ 目次へ 次へ 
Copyright © 2001,2002 Hiroshi Masuda 

 

 

inserted by FC2 system