動くオブジェクト
2番目の例では、タイマーを利用してアイテムや画像やアニメーションをキー操作で移動させる方法を見ていきます。
目的
キーボードを移動トリガとして使用し(W A S D X)、ピクチャボックスの中で画像を移動させます。
方法
この例では、ピクチャボックスの中でピクチャボックスを使用します。また、フォームのKeypreviewをTrueに設定して、キーの押下イベントをフォームで処理できるようにします。
フォーム全体を覆うように1つ目のピクチャボックスを置き、Scalemodeを「3-Pixel」に設定します。このピクチャボックスの中に、2つ目のやや小さいピクチャボックスを置きます。さらにタイマーをフォームに追加します。これも先ほどと同じようにフォームの端に置いてください。
次はコーディングですが、今回は少々おもしろい方法を採用し、トライステート型(Tristate)を作成します。これはブール型と似ていますが、Forward、Stop、Backwardという3つの値を取ります。それぞれの値は正の数(+1)、ゼロ(0)、負の数(-1)を表し、移動方向を決定するために使用します。
このトライステート型を使用して2つの変数を作成します。1つ目は画像を上下に移動させるP1UDで、もう1つは左右に移動させるP1LRです。
キーが押されたことを認識するにはフォームのKeyDownイベントを使用します。押されたキーに応じて、以下のリストのようにトライステート型の変数の値を設定します。
- Wキー: P1UD = Negative(上)
- Aキー: P1LR = Negative(左)
- Dキー: P1LR = Positive(右)
- Xキー: P1UD = Positive(下)
- Sキー: P1UDおよびP1LR = Zero
このように準備しておけば、上記のどのキーを押した場合でも、前進あるいは後退するように適切な変数が設定されます。中央にあるSキーを押すと、動きが止まるように両方の変数が設定されます。
この方式では、停止キー(S)を押すまで画像は動き続けます。お望みであれば、キーを離したときに動きが止まるようにすることもできます。そのためには、フォームのKeyUpイベントを使用して以下のリストのように変数をZeroに設定します。
- WキーまたはXキー: P1UD = Zero
- AキーまたはDキー: P1LR = Zero
その他のロジックについては、実際のサンプルコードを見てください。リスト2に、ピクチャボックスを動かすために必要なコードと宣言を示します。
[General] Private Enum Tristate Neg = -1 Zero = 0 Pos = 1 End Enum Private P1UD As Tristate Private P1LR As Tristate Private AutoStop As Boolean [Form_Load] Picture2.Picture = LoadPicture(App.Path & "/pic1.bmp") Timer1.Interval = 50 Timer1.Enabled = True SPM = 1 'steps per timed tick [Form_KeyDown] Select Case KeyCode Case 65 P1LR = neg Case 68 P1LR = pos Case 87 P1UD = neg Case 88 P1UD = pos Case 83 P1LR = zero P1UD = zero End Select [Form_KeyUp] If AutoStop Then Select Case KeyCode Case 65, 68 P1LR = zero Case 87, 88 P1UD = zero End Select End If [Timer1_Timer] Picture2.Top = Picture2.Top + SPM * P1UD If Picture2.Top <= 0 Then P1UD = pos If Picture2.Top >= Picture1.ScaleHeight Then P1UD = neg Picture2.Left = Picture2.Left + SPM * P1LR If Picture2.Left <= 0 Then P1LR = pos If Picture2.Left >= Picture1.ScaleWidth Then P1LR = neg
お気付きになるかと思いますが、Timerイベントでは枠の位置を確かめて、画像が枠から出ないように動く方向を変えています。
変数SPMは、移動距離、つまりタイマーが時を刻むごとに画像が何ピクセル移動するかを設定するために使用します。
繰り返しになりますが、この方法でタイマーを使用すると、CPU使用量を減らし、アプリケーションの他のイベントに大きな影響を及ぼすことなくスムーズな動きを実現することができます。
