Entries

アニメーション その5

アニメーション その4で方向キーによるアニメーションパターンの変更ができるようになりました。

今度は同じ位置に表示するのではなく画像を移動させるプログラムを作成していきます。
画像を移動させるために必要となるデータには、画像を表示させている場所情報となる座標があります。
今まではDrawImage(img,0,0,…)というように(0,0)座標を画像表示位置としていました。
これをプログラムにより変化させれば移動アニメーションができるわけです。

今回利用している画像の大きさは32×32ですから、(0,0)だった座標を(32,0)とすれば右に1コマ移動できます。
しかし、この考えを利用してプログラムを作成すると、一瞬で隣のコマに移動してしまいます。
そこで、スムーズに移動するためのプログラムを考えていくわけです。
ここでも参考となるのが簡単レシピのインベーダーゲーム。
エイリアンが一定速度で移動するプログラムを参考にしていくと隣のコマへスムーズに移動するアニメーションを作成することができます。
一定速度で移動させるための考え方はシンプルです。
画像を表示している座標に移動速度と経過時間を掛けた値を加えるだけです。
つまり、X座標を1秒間に32ピクセル移動させていくのであれば、X座標=32ピクセル*経過時間とすればいいわけです。
経過時間はPaintメソッドが実行されて、Invalidateメソッドにより再描画されたときの時間を利用します。
これでコンピュータの性能によるPaintメソッドの実行回数のズレも調整できます。
コンピュータの性能によっては1回のPaintメソッドで1ピクセルずつ移動するかもしれませんし、2ピクセルずつ移動するかもしれません。
ですが、どちらも1秒間で移動するのは32ピクセルとなります。
この方法を使うことによってコンピュータの性能を気にせず1秒間に32ピクセル移動させることができます。

ということで、今回は秒速32ピクセルで右に移動するプログラムを作成していきます。
Public Class Form1
  Enum Direction
    down = 0 '前向き
    up = 1 '後ろ向き
    left = 2 '左向き
    right = 3 '右向き
  End Enum

  Dim img As Bitmap = New Bitmap(My.Resources.anime6) 'スプライト画像
  Dim imgRect(,) As Rectangle '画像矩形配列
  Dim iNo As Integer '表示画像インデックス
  Dim direct As Direction 'キャラクターの向いている方向
  Dim swatch As Stopwatch = New Stopwatch( ) 'ストップウォッチ
  Dim lastTime As Double '前回実行時の時間
  Dim loc As PointF '画像の場所座標
  Dim vel As PointF '画像の移動速度・・・ベクトル


  Public Sub New( )
    (省略)
  End Sub

  Sub Init( )
    imgRect = New Rectangle(3, 3) { }
    For y As Integer = 0 To imgRect.GetUpperBound(0) '行・・・前、後、左、右
      For x As Integer = 0 To imgRect.GetUpperBound(1) '列・・・1,2,3,4
        imgRect(y, x) = New Rectangle(x * 32, y * 32, 32, 32)
      Next
    Next
    iNo = 0
    direct = Direction.down '前向き
    swatch.Reset( )
    swatch.Start( )

    lastTime = 0.0
    loc = New PointF(0, 0)
    vel = New PointF(32, 0)

  End Sub

  Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    Dim g As Graphics = e.Graphics
    Dim nowTime As Double = swatch.ElapsedMilliseconds / 1000.0 'Paintメソッドを実行した瞬間の時間
    Dim elapsedTime As Double = nowTime - lastTime '経過時間
    lastTime = nowTime


    '画像切り替え処理
    iNo = CInt(Fix((nowTime * 2) Mod 4.0F))
    loc.X += vel.X * CSng(elapsedTime) 'X座標の移動

    '画像描画処理
    g.DrawImage(img, loc.X, loc.Y, imgRect(direct, iNo), GraphicsUnit.Pixel)

    Me.Invalidate( ) '強制再描画
  End Sub

  Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    (省略)
  End Sub
End Class

ちなみに、今回のプログラムでは1秒間に32ピクセル移動するように作成しています。
これではちょっと遅いなぁと思うのであれば1秒間に64ピクセルにするとよいでしょう。

カーソルキーを押しても右にしか移動しないのではキャラクター移動になりませんから、次回はカーソルキーを押すと移動する方向を変更するプログラムを作っていきます。

0件のコメント

コメントの投稿

新規
投稿した内容は管理者にだけ閲覧出来ます

0件のトラックバック

トラックバックURL
http://hinagis.blog33.fc2.com/tb.php/28-31954409
この記事に対してトラックバックを送信する(FC2ブログユーザー)

Appendix

最新記事

検索フォーム

月別アーカイブ

売れ筋ランキング

お楽しみ用

アニメグッズ

プロフィール

Author:ひなぎ
VB2005&2008でゲーム作成中

FC2カウンター

Powered By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ

FC2ブログ 一戸建て