| 前 次 トップ |
敵に弾を撃たせる2
(Blue.tonyuを作成して、Ball.tonyuを連続して撃たせる)
Blue.tonyuを作成する
Greenの時と同じようにBlueというオブジェクトとBallというオブジェクトを作成してみましょう。
| Blue.tonyu |
|---|
extends Enemy;
mark=100;
life=5;
sx=x;
sy=y;
ang=270;
i=-1;
while (y<$screenHeight+15) {
ii=0;
i=-i;
ang+=2;
x=sx+100*cos(ang);
y=sy+20+20*sin(ang);
if(rnd(200)==0) {
while(ii<=4){
appear(new Ball(x,y,$pat_Sample+25));
wait(5);
ii++;
}
p+=i;
atariHantei();
update();
}
|
| Ball.tonyu |
|---|
extends Enemy;
mark=0;
life=1;
while (y<$screenHeight+15) {
y=y+2;
atariHantei();
update();
}
|
楕円形を描くBlueと下に落ちるBallを作成しました。Ballは連続して5つ出てくるようになっています。
しかし、これでは物足りません。Ballがいつも下に落ちてばかりでは芸がありません。
たまには斜め下に落ちてもらいたいものです。しかし、問題があります。
| Ball1.tonyu | Ball2.tonyu | Ball3.tonyu |
|---|---|---|
extends Enemy;
mark=0;
life=1;
rx=1;
r=1;
while (y<$screenHeight+15) {
y=y+2;
x=(x+rx)*r;
if(x<15 || x>$screenHeight-15) r=-r;
atariHantei();
update();
}
|
extends Enemy;
mark=0;
life=1;
while (y<$screenHeight+15) {
y=y+2;
atariHantei();
update();
}
|
extends Enemy;
mark=0;
life=1;
rx=-1;
r=1;
while (y<$screenHeight+15) {
y=y+2;
x=(x+rx)*r;
if(x<15 || x>$screenHeight-15) r=-r;
atariHantei();
update();
}
|
| Blue.tonyu |
|---|
extends Enemy;
mark=100;
life=5;
sx=x;
sy=y;
ang=270;
i=-1;
while (y<$screenHeight+15) {
ii=0;
i=-i;
ang+=2;
x=sx+100*cos(ang);
y=sy+20+20*sin(ang);
if(rnd(200)==0) {
while(ii<=4){
if(x%3==0) appear(new Ball1(x,y,$pat_Sample+25));
else if(x%3==1) appear(new Ball2(x,y,$pat_Sample+25));
else appear(new Ball3(x,y,$pat_Sample+25));
wait(5);
ii++;
}
}
p+=i;
atariHantei();
update();
}
|
それは、Ballをそれぞれの方向に3つ(左下・下・右下)と用意してあげなければならないことです。
しかし、Ball1,Ball2,Ball3はほとんど同じソースです。クラスも増えて見難くなること必定です。
appear関数の方で
appear(new Ball(x,y,$pat_Sample+25,vx));
のように引数を渡せないものでしょうか。実は、コンストラクタという知識を利用すればそれが可能になります。
しかし、今回はクラスが3つだけなので、コンストラクタを使用しないで、BallクラスとBlueのみで作成してみたいと思います。
まず、Blueを以前の通りに戻してみましょう。
| Blue.tonyu |
|---|
extends Enemy;
mark=100;
life=5;
sx=x;
sy=y;
ang=270;
i=-1;
while (y<$screenHeight+15) {
i=-i;
ang+=2;
x=sx+100*cos(ang);
y=sy+20+20*sin(ang);
if(randomize(200)==0) {
while(i<=4){
appear(new Ball(x,y,$pat_Sample+25));
wait(5);
i++;
}
p+=i;
atariHantei();
update();
}
|
Ballの方には少し細工を施しておきましょう。
| Ball.tonyu |
|---|
extends Enemy;
mark=0;
life=1;
dx=x;
d=1;
while (y<$screenHeight+15) {
y+=2;
x+=(dx%3-1)*d;
if(x<15 || x>$screenWidth-15) d=-d;
atariHantei();
update();
}
|
Ballの最初のxの数値をdxに記録しておけば、それは既にランダムな数字と同じ事です。
また、
x+=dx%3-1;
とは面白い数値の出し方です。
dx%3の考えられる数値は0,1,2の3パターンしかありません。
dx%3-1としてしまえば、考えられるパターンは-1,0,1の3種類となり、
x+=dx%3-1は
x=x+(-1)
x=x+0
x=x+1
の三種類しかなくなり、結果的に3方向に分けることに成功したわけです。

UFOのソースを変えてGreenとBlueのオブジェクトを削除しておきましょう。
| UFO.tonyu |
|---|
extends SpriteChar;
function appearEnemy() {
if (rnd( 50 )==0) appear(new skyBlue(x,y,$pat_Sample+2));
if (rnd( 100 )==0 && $score>100) appear(new Yellow(x,y,$pat_Sample+8));
if (rnd( 200 )==0 && $score>200) appear(new Red(x,y,$pat_Sample+11));
if (rnd( 800 )==0 && $score>300) appear(new Green(x,y+20,$pat_Sample+19));
if (rnd( 1600 )==0 && $score>400) appear(new Blue(x,y+20,$pat_Sample+22));
}
while(1) {
while(x<$screenWidth - 40) {
x=x+2;
appearEnemy();
update();
}
while(x>40) {
x=x-2;
appearEnemy();
update();
}
}
|
数学の知識でコンストラクタを使うことなく、プログラムも綺麗にまとまりました。次は、音楽を加えて見ましょう。
| 前 次 トップ |