トップページへ
 攻撃パターン
・魔法(反射弾)   | 利用規約 | 使い方 | 操作方法 |
■説明
壁にあたると跳ね返るタイプの攻撃方法です。狭い場所や入り組んだ地形で効果を発揮します。
■参考
攻撃とダメージ処理 - 自機の攻撃動作
攻撃パターン - 弓矢
攻撃パターン - 魔法(5連弾)
■解説
  $Effectクラス(一部)
if (p=="Magic"){
  p=-1;
  zOrder=-7;
  anim=newAnimation();
  anim.swing($pat_weapon+2,$pat_weapon+2,3);
  $Mychar.p=$pat_chara+2;
  for (i=0;i<20;i++){
    x=$Mychar.x+$Mychar.f*15;
    y=$Mychar.y+3;
    drawSprite($Mychar.x+$Mychar.f*9,$Mychar.y+3,$pat_arm+0,
                                   $Mychar.f, 1);
    if (i==3) appear(new Weapon_My(x,y,"refrection"));
    update();
    }
  $Mychar.onAttack=0;
}
攻撃パターン - 魔法(5連弾)とほとんど変わりません。違いは攻撃までのタメの時間を短くしたこと、呼び出しが"refrection"になっていることくらいです。

  $Weapon_Myクラス(一部)
if (p=="refrection"){
  x=$Mychar.x+$Mychar.f*10;
  y=$Mychar.y;
  f=$Mychar.f;
  p=$pat_weapon+1;
  zOrder=3;
  erase=1;
  ATC=3;
  if (f== 1) {vx= 1; vy=-1;}
  if (f==-1) {vx=-1; vy=-1;}
  for(i=0;i<500;i++){
    tx=x; ty=y;
    WallHit_chk2();
    if (wX==1 || wX==-1) {vx=-vx;x+=vx;}
    if (wY==1 || wY==-1) {vy=-vy;y+=vy;}
    if (vx<0) f=-1;
    if (vx>0) f= 1;
    x+=vx; y+=vy;
    if (f== 1) angle=angle(tx-x,ty-y)+180;
    if (f==-1) angle=angle(tx-x,ty-y);
    if ($map.getAt(x,y)>=$pat_block+20 && $map.getAt(x,y)
                          <=$pat_block+39) die();
    if (i%5==1) update();
  }
}

if (p=="refrection")・・・からfor文までの間は初期設定です。自機の座標を初期位置に与えて、向きに応じて初期の速度vx,vyを決めています。
for文の中では、まず弾と壁の当たりを調べます。WallHit_chk2()がこれに該当します。このルーチンは自機の移動 - 左右移動などであつかっている壁上下左右の当たり判定とほぼ同じです。詳細は割愛します。
その後、弾-壁の位置関係に応じて速度と向きを変化させています。if (wX==1 || wX==-1)・・・がこの部分です。後は向きに応じて角度を変えたり、壁にめり込んだら弾を消去するなど細かな部分が入ります。for文の終了判定条件、i<500の数値を大きくすると弾を発射してから消えるまでの時間を長くすることができ、攻撃範囲が大きくなります。




|  トップページ | このサイトについて | 利用規約 | ご意見・お問い合わせ |

TonyuアクションRPG - ゲームプログラミング解説 -