| 前 次 トップ |
敵に弾を撃たせる
(Green.tonyuを作成して、Electoron.tonyuを撃たせる)
Green.tonyuを作成する
前ページでクラスの継承が完成しているはずです。敵を追加するのも簡単になりました。Greenというのを追加してみましょう。
| Green.tonyu |
|---|
extends Enemy;
function asteroid(ax,ay,ang,maxis,frate){
x=ax+maxis*cos(ang)*cos(ang)*cos(ang);
y=ay+maxis*frate+maxis*frate*sin(ang)*sin(ang)*sin(ang);
}
mark=100;
life=5;
sx=x;
sy=y;
angle=270;
majorAxis=100;
flatRate=1/2;
i=0;
if (x>$myChar.x) vx=2; else vx=-2;
while (y<$screenHeight+15) {
i++;
asteroid(sx,sy,angle,majorAxis,flatRate);
angle+=3;
if(x<15 || x>$screenWidth-15) d=-d;
atariHantei();
if(p==$pat_Sample+19) vp=1;
else if(p==$pat_Sample+21) vp=-1;
if(i%20==0) p=p+vp;
update();
}
|
三角関数のsin()とcos()を使用して、アステロイドと呼ばれる菱形の図形を描かせています。sin()やcos()を知らなくても、
function asteroid(ax,ay,ang,maxis,frate){
x=ax+maxis*cos(ang)*cos(ang)*cos(ang);
y=ay+maxis*frate+maxis*frate*sin(ang)*sin(ang)*sin(ang);
}
をレシピとして使用すれば誰でも出来ます。axとayは中心の座標、angは角度、maxisは長径、frateは扁平率(0<frate<1)です。
さて、口をパカパカ開けて移動していますが、これは
「口を開けたときに弾を撃たせる」 ということを意図して作りました。
口が開いたときに弾を撃たせるにはどうしたらよいでしょうか?
問題がたくさんありそうです。
まず、敵の弾を作るところから考えてみましょう。新しいオブジェクトを作ってElectronと名前を付けてください。
| Electoron.tonyu |
|---|
extends Enemy;
life=100;
while (y<$screenHeight) {
y=y+2;
atariHantei();
update();
}
|
思ったよりも簡単にできました。ElectronもEnemyよりクラスを継承して、弾が当たっても壊れないようlifeを100に設定しました。
myCharの弾は貫通させたいという場合には、Enemyのクラスを継承せずに、atariHanteiメソッドを作成して、
function atariHantei() {
if (crashTo($myChar)) $myChar.die();
}
としてあげればできそうです。
今回はアニメーションアダプタが使用できない例ですが、YellowもRedもアニメーションアダプタを使用しないで作成しました。
| Green.tonyu |
|---|
extends Enemy;
function asteroid(ax,ay,ang,maxis,frate){
x=ax+maxis*cos(ang)*cos(ang)*cos(ang);
y=ay+maxis*frate+maxis*frate*sin(ang)*sin(ang)*sin(ang);
}
mark=100;
life=5;
sx=x;
sy=y;
angle=270;
majorAxis=100;
flatRate=1/2;
i=0;
animationOn=0;
vp=0;
if (x>$myChar.x) vx=2; else vx=-2;
while (y<$screenHeight+15) {
i++;
asteroid(sx,sy,angle,majorAxis,flatRate);
angle+=3;
if(x<15 || x>$screenWidth-15) d=-d;
atariHantei();
if(rnd(50)==0 && animationOn==0) {
vp=1;
animationOn=1;
}
if(p==$pat_Sample+21 && vp==1) {
vp=-1;
appear(new Electoron(x,y,$pat_Sample+24));
}
else if(p==$pat_Sample+19 && vp==-1) {
vp=0;
animationOn=0;
}
if(i%20==0) p=p+vp;
update();
}
|
プログラムが長くなり、複雑になりましたが、内容は簡単です。
animationOnという変数を新たに設けてあります。
ランダムに弾を発射してもらいたいので
if(rnd(50)==0 && animationOn==0) {
のようにrndを使用しました。animetionOnが0の時はアニメーションが行われていない状態です。
以前のようにvpを1に変え、animationOnを1にしてアニメーション中であることを記録します。
次に、口が全開になったときとは、pが$pat_Sample+21の時です。このときに弾を発射できるようにしますが、pが$pat_Sample+21の時に何度でも弾を吐き出されては困るので、vp==1という条件を馳せてあります。
vpはすぐに-1と変わるので1つのアニメーションに対して1つしか弾を発射できないはずです。
最後にpが$pat_Sample+19に戻ったときには、アニメーションを止めなくてはなりません。戻ってきたということはvp==-1のはずです。
| p | vp | p=p+vp | animation | action |
|---|---|---|---|---|
| $pat_Sample+19 | 0 | null | 0 | - |
| $pat_Sample+19 | 1 | $pat_Sample+19+0 | 1 | - |
| $pat_Sample+20 | 1 | $pat_Sample+19+1 | 1 | - |
| $pat_Sample+21 | -1 | $pat_Sample+20+1 | 1 | appear(new Electoron()) |
| $pat_Sample+20 | -1 | $pat_Sample+21-1 | 1 | - |
| $pat_Sample+19 | 0 | $pat_Sample+20-1 | 0 | - |
| $pat_Sample+19 | 0 | $pat_Sample+19-0 | 0 | - |
これで敵も弾を撃つことができるようになりました。
次は、また新しい敵を作成して、ちょっと変わったことをしてみましょう。
| 前 次 トップ |