前 次 トップ |
敵に弾を撃たせる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(); } } |
数学の知識でコンストラクタを使うことなく、プログラムも綺麗にまとまりました。次は、音楽を加えて見ましょう。
前 次 トップ |