トップ


アニメーションを加える

Yellowにアニメーションを加えて見ましょう。

まず、画像を用意します。


Sample3.lzh

Yellowに新しい動きを2つ加えてみましょう。

アニメーションアダプタ

アニメーションアダプタというメソッドがあります。これを使用してみましょう。

Yellow.tonyu
extends SpriteChar;
function onDie() {
  appear(new Bomb(x , y ,$pat_Sample+4));
}
function atariHantei() {
  for (t in $chars) {
   if ( t is Tama && crashTo(t) )  {
     die();
     t.die();
     $score=$score+10;
   }
  }
  if (crashTo($myChar)) $myChar.die();
}
yellowAnimation=newAnimation();
while (y<$screenHeight) {
   y=y+1;
   x=x+vx+sin(8*y)*10;
   atariHantei();
  p=p+vp; vp=-vp;
   yellowAnimation.loop($pat_Sample+8,$pat_Sample+10,20);
   update();
}

$pat_Sample+8から$pat_Sample+10までの3つの画像を20フレームごとに描画させています。
アニメーションアダプタの使用方法については、HELPも参照してみてください。

pの値を変えて描画させる

なにやら、Yellowがワシャワシャ動くようになりましたが、少し不自然です。



どうやら、原因はアニメーションのさせ方のようです。

$pat_Sample+8→$pat_Sample+9→$pat_Sample+10→$pat_Sample+9→$pat_Sample+8・・・

のようにすれば、綺麗にアニメーションさせられそうです。

そこでpという変数を使用して、アニメーションを行わせて見ましょう。

まず、pという変数は、Tonyuにおいては特別な意味があります。
Tonyuにおける変数pは画像の種類を現す変数です。実際にやってみましょう。

Yellow.tonyu
extends SpriteChar;
function onDie() {
  appear(new Bomb(x , y ,$pat_Sample+4));
}
function atariHantei() {
  for (t in $chars) {
   if ( t is Tama && crashTo(t) )  {
     die();
     t.die();
     $score=$score+10;
   }
  }
  if (crashTo($myChar)) $myChar.die();
}
i=0;
while (y<$screenHeight) {
  i++;
  y=y+1;
  x=x+vx+sin(8*y)*10;
  atariHantei();
  if(p==$pat_Sample+8) vp=1;
  else if(p==$pat_Sample+10) vp=-1;
  if(i%20==0) p=p+vp;
  update();
}

内容が少し高級になってきました。

iという変数を用意してフレームカウント刻むことにしました。

if(i%20==0)
とは、
「iを20で割った余りが0の場合には・・・」
という意味です。具体的には、20,40,60,80,100....となります。

これで20フレームごとに画像が更新されます。

if(p==$pat_Sample+8) vp=1;
else if(p==$pat_Sample+10) vp=-1;
if(i%20==0) p=p+vp;

とは、pが$pat_Sample+8の時にはvpを1として、pが$pat_Sample+10の時にvpを-1と設定しています。結果として、

p vp p=p+vp
$pat_Sample+8 1 null
$pat_Sample+9 1 $pat_Sample+8+1
$pat_Sample+10 -1 $pat_Sample+9+1
$pat_Sample+9 -1 $pat_Sample+10-1
$pat_Sample+8 1 $pat_Sample+9-1

のようになり、思った通りに動作してくれました。

アニメーションアダプタもpという変数を使用して動作してくれるメソッドであるということが理解していただけたと思います。

このような面倒なことをせずに、$pat_Sample+9をコピーして$pat_Sample+11として画像を4枚用意し、アニメーションアダプタを利用するのも賢くて見た目も綺麗な方法です。また、これだけの内容であればswingを使用する方法がもっとも賢い方法だと思います。しかし、loopやswing、playでは対処できない場合も想定できます。実際にアニメーションアダプタが行っている動作を理解することは必要なことです。

次に、毎回敵が弾一発で死んでしまうようでは物足りません。敵にライフを付けて固くしてみましょう。

  トップ