トップ

弾が敵に当たっても貫通しないようにする



現況では弾は敵に当たっても貫通してしまいます。これでは、シュティングゲームらしくありません。
Enemyに当たったら、弾が消えるように設定してみましょう。

Enemy.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();
     $Tama.die();
     $score=$score+10;
   } 
  }
  if (crashTo($myChar)) $myChar.die();
}
nexty=rnd(50)+100;while (y<nexty) {
  y=y+2;
  atariHantei();
  update();
}
if (x>$myChar.x) vx=2; else vx=-2;
while (y<$screenHeight) {
  y=y+3;
  x=x+vx;
  atariHantei();
  update();
}

これで弾がEnemyに当たった場合には、Tama.tonyuのdie関数が呼ばれて、弾が消えてくれそうです。



どういうわけでしょうか。エラーが出てきてしまいました。

こういったケースのエラーで悩んでいるUserの方は非常に多いと思います。
こういった風に考えてみましょう。

「$Tamaというクラスを持つオブジェクトを消す」
ということと
「$Tamaというクラスを持つ特定のオブジェクトを消す」
ということは異なることなのです。

画面上にたくさんの弾が発生している中で、どのオブジェクトを消せばよいのか困っているわけです。

Enemy.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();
}
nexty=rnd(50)+100;while (y<nexty) {
  y=y+2;
  atariHantei();
  update();
}
if (x>$myChar.x) vx=2; else vx=-2;
while (y<$screenHeight) {
  y=y+3;
  x=x+vx;
  atariHantei();
  update();
}

これでわかったという方も多いと思います。
「t」というオブジェクトがTamaというクラスを持って、Enemyとぶつかっているわけです。

次に、弾が貫通しなくなってしまったので、スペースキーを連打しなくてはならなくなりました。
これでは、いつスペースキーが壊れても仕方ありません。
連射機能を補完してあげましょう。

  トップ