CodeZine(コードジン)

特集ページ一覧

VBにおけるタイマーコントロールの基本

単純なタイマーで複雑な機能を実現する方法

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/02/29 14:00

ダウンロード サンプルソース (6.0 KB)

目次

動くオブジェクト

 2番目の例では、タイマーを利用してアイテムや画像やアニメーションをキー操作で移動させる方法を見ていきます。

注意
 Hキーは左への移動、Kキーは右、Uキーは上、Mキーは下への移動に使用します。

目的

 キーボードを移動トリガとして使用し(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に、ピクチャボックスを動かすために必要なコードと宣言を示します。

リスト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使用量を減らし、アプリケーションの他のイベントに大きな影響を及ぼすことなくスムーズな動きを実現することができます。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:japan.internet.com翻訳記事

もっと読む

著者プロフィール

  • Richard Newcombe(Richard Newcombe)

    Commodore 64の時代からコンピュータに親しみ、今では優れたプログラマー、デザイナーとして活躍。30代前半で、コンピュータから離れることはめったになく、コンピュータ関連の問題ならばいつでも助力とアドバイスを惜しまない人物。最近は本サイトに関するいくつかのプロジェクトに従事。

  • japan.internet.com(ジャパンインターネットコム)

    japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.com や EarthWeb.c...

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5