攻撃とダメージ処理 - 自機の攻撃動作で作ったプログラムの改良版になります。
三角関数を使って剣と腕を円運動させます。
$Mycharクラス(一部)
|
function Attack(){
if (getkey(90)==1 && onAttack==0 && AttackOK==0) {
onAttack=1;
appear(new Weapon_My(x,y,"vertical"));
}
}
|
上記が剣を振る時の自機のプログラムです。スペースキーが押されており、攻撃中でなければ攻撃モーションに移行します。
$Weapon_Myクラス(一部)
|
if (p=="vertical"){
p=$pat_weapon+0;
f=$Mychar.f;
zOrder=3;
ATC=4;
for (i=0; i<120; i+=10 ) {
if (i==0) appear(new Effect(x,y,"Arm_My2"));
angle=i*f-(90*f);
x=$Mychar.x+sin(i*f)*30;
y=$Mychar.y-cos(i*f)*30;
update();
}
for (_time=0;_time<15;_time++){
x=$Mychar.x+sin(i*f)*30;
y=$Mychar.y-cos(i*f)*30;
update();
}
}
|
ここが剣を描画する部分になります。最初のfor文までの変数の代入は初期設定です。変数ATCは剣の攻撃力になります。この値を大きくすれば与えるダメージが大きくなります。
最初のfor文が剣を回転させる部分です。angleという変数で角度を決めています。変数iを変化させていくことでangleがかわります。
このfor文中にif(i==0)・・・の一文がありますが、ここで自機の腕を描画します。$Arm_Myクラスを呼び出すようになっており、同じように腕を回転させます。
angleの式は意味がちょっとわかりにくいですが、自機が右左どちらに向いていても角度を出せるようにしてあります。Excelで計算するとこんな感じになります。
2番目のfor文は、剣を回転させた後、しばらくそのままの位置で表示する部分です。ゲームで言う「タメ」を作るところにあたります。_timeの値がウェイトです。本プログラムでは大剣を振った後の重さを表現するために値を大きくしてあります。値を小さくすれば動きが軽くなります。試してみてください。
|