|

|
|
 |
2.5 アニメーションする方法 |
 |
|
|
|
|
|
ゲームでは、自機や敵キャラは画面上を動き回るだけではなく、歩いたり転んだり飛んだり跳ねたりなどアニメーションをしながら動きます。でも、別にたいしたことをやっているわけではありません。パラパラマンガと同じで、少しずつ形を変えたパターンを何種類か用意しておき、それらを順番に表示するだけです。
プログラムを作るのは簡単だけど、実は寝たり倒れたり逆立ちしたりなど、スムーズにアニメーションさせるパターンを作る方が実は面倒だったりしますが、それは根性でカバーしましょう(笑)
|
|
|
|
|
|
| アニメーションする例/Offsetプロパティを使った例 |
|
|
|
|
さて、苦労して描いた絵は早速アニメーションさせなくてはなりません。てなわけで、アニメーションする方法の一つ目はOffsetプロパティを使い複数のパターンを切り替え表示する例です。
Offsetプロパティというのは、「Rangeなどで指定した範囲からOffset(行, 列)で指定した先の部分を操作対象とする」というプロパティで、定義範囲の変更を行うプロパティです。例えば、元のパターンをR1C1〜R16C16で定義したときにOffset(16, 16)と指定すると、行・列に16加えたR17C17〜R32C32の部分を参照するように変更されます。
これを踏まえてサンプルで作ったパターンの場合、1つ目のパターンがR1C1〜R16C16、2つ目のパターンがR1C17〜R16C32の範囲です。基準となるパターンを1つ目のパターンにした場合、2つ目のパターンを参照するときはOffset(0,16)、1つ目パターンを参照するときはOffset(0,0)です。
例では、歩くようなアニメーションをしながら横移動しています。Rangeオブジェクトは1つ目のパターン(R1C1〜R16C16)で作成しておき、表示毎にOffsetプロパティを使ってコピー元を変更することでアニメーションしています。
Sub prcAnimation1()
Dim i As Long
Dim j As Long
Dim objChar As Range
Dim lngPtn As Long
'怪獣のパターンを定義します
Set objChar = Range(Cells(1, 1), Cells(16, 16))
'Offsetの位置制御用 最初は0
lngPtn = 0
For i = 1 To 50
'怪獣を描画します
objChar.Offset(0, lngPtn).Copy _
Destination:=Range(Cells(21, i), Cells(36, i + 15))
'Offsetの参照先制御です 0,16,0,16…を繰り返します
lngPtn = lngPtn + 16
If lngPtn > 16 Then
lngPtn = 0
End If
'時間稼ぎのループです
For j = 1 To 5000: DoEvents: Next
Next
End Sub
|
※このエクセルマクロはワークシート内へ記述するマクロです
|
|
|
|
|
|
| アニメーションする例/配列のRangeオブジェクトを使う例 |
|
|
|
|
パターンをアニメーションする2つ目の方法です。複数パターンを配列にしたRange型の変数のそれぞれに定義し、表示毎にパターン番号を切り替える方法です。
例では、歩くようなアニメーションをしながら横移動しています。Range型の変数は配列で2つ用意し、配列番号1はR1C1〜R16C16の範囲を、配列番号2はR1C17〜R16C32を定義しておき、表示毎にパターンの番号を変更することでアニメーションしています。
Sub prcAnimation2()
Dim i As Long
Dim j As Long
Dim objChar(1 To 2) As Range
Dim lngPtn As Long
'怪獣のパターンを定義します
Set objChar(1) = Range(Cells(1, 1), Cells(16, 16))
Set objChar(2) = Range(Cells(1, 17), Cells(16, 32))
'パターン番号の制御用 最初は1
lngPtn = 1
For i = 1 To 50
'怪獣を描画します
objChar(lngPtn).Copy _
Destination:=Range(Cells(20, i), Cells(36, i + 15))
'パターン番号の変更です 1,2,1,2…を繰り返します
lngPtn = lngPtn + 1
If lngPtn = 3 Then
lngPtn = 1
End If
'時間稼ぎのループです
For j = 1 To 5000: DoEvents: Next
Next
End Sub
|
|
|
|
|
|