トップページへ
 攻撃パターン
・弓矢   | 利用規約 | 使い方 | 操作方法 |
■説明
前方に向かって矢を放ちます。飛距離があるので遠くの敵にも届きます。矢は壁を通り越すことができないようになっています。
■参考
攻撃とダメージ処理 - 自機の攻撃動作
攻撃パターン - 剣(縦斬り)
攻撃パターン - 剣(3方向)
■解説
$Mycharクラスで攻撃パターンを指定します。

  $Mycharクラス(一部)
function Attack(){
  if (getkey(90)==1 && onAttack==0 && AttackOK==0) {
    onAttack=1;
    appear(new Effect(x,y,"bow"));
  }
}

このあたりは攻撃パターン - 剣(縦斬り)などと同じです。ただし、最初に弓のタメ動作をさせたいので、これを$Effectクラスで呼び出します。この弓自体には当たり判定を持たせないようにします。

  $Effectクラス(一部)
if (p=="bow"){
  p=-1;
  for (i=0;i<30;i++){
    drawSprite($Mychar.x+$Mychar.f*8,$Mychar.y+2,
                     $pat_weapon+4,$Mychar.f,-6);
    drawSprite($Mychar.x+$Mychar.f*8,$Mychar.y+3,
                     $pat_arm+0 ,$Mychar.f, 1);
    update();
  }
  appear(new Weapon_My(x,y,"arrow"));
  $Mychar.onAttack=0;
}

 ただ自機の前に腕と弓を、所定の時間描いているだけです。描画が終了したら矢を呼び出すようにします。この矢は当たり判定を持たせたいので$Weapon_Myクラスを使います。

  $Weapon_Myクラス(一部)
if (p=="arrow"){
  ATC=3; erase=1;
  x=$Mychar.x; y=$Mychar.y;
  f=$Mychar.f; p=$pat_weapon+3;
  zOrder=3;
  ang=75*f;
  vx=9*cos(ang-90); vy=6*sin(ang-90);
  for (i=0;i<80;i++) {
    tx=x; ty=y;
    vy+=0.1; vx =vx*0.99;
    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) stick();
    update();
  }
}

function stick(){
  var i;
  for (i=0;i<30;i++){
     update();
  }
  die();
}

ang=75*f;で矢を放つ角度を指定しています。90で真横に、0で真上に矢を打ちます。
vx=9*cos(ang-90); vy=6*sin(ang-90);が矢の初速を決めている部分です。掛け算の係数が大きくなると矢の速度が速くなります。
for文の中が少し複雑ですが、矢に重力をかけている部分です。矢の傾き具合を計算し、角度を変えることで弓なりの軌跡に応じてグラフィックを回転させます。

if ($map.getAt(x,y)>=・・・の文は、矢が壁にあたったら停止させる部分です。stick()を呼び出して、停止してしばらくグラフィックを描画したあと消去します。




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

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