前 次 トップ |
クラスの継承
(Enemy.tonyuをSuperクラスにして、skyBlue.tonyuを作成する)
skyBlue.tonyuを作成する
先に作成したEnemyとYellowとRedのプログラムを見てみましょう。
Enemy.tonyu |
---|
extends SpriteChar; function onDie() { appear(new Bomb(x , y ,$pat_Sample+4)); } function atariHantei() { for (t in $chars) { if ( t is Tama && crashTo(t) ) { die(); t.die(); $score=$score+10; } } if (crashTo($myChar)) $myChar.die(); } nexty=rnd(50)+100; while (y<nexty) { y=y+2; atariHantei(); update(); } if (x>$myChar.x) vx=2; else vx=-2; while (y<$screenHeight+15) { y=y+3; x=x+vx; if(x<15 || x>$screenWidth-15) vx=-vx; atariHantei(); update(); } |
Yellow.tonyu |
---|
extends SpriteChar; function onDie() { appear(new Bomb(x , y ,$pat_Sample+4)); } function atariHantei() { for (t in $chars) { if ( t is Tama && crashTo(t) ) { die(); t.die(); $score=$score+10; } } if (crashTo($myChar)) $myChar.die(); } i=0; d=1; while (y<$screenHeight+15) { i++; y=y+1; x=x+d*sin(8*y)*10; if(x<15 || x>$screenWidth-15) d=-d; atariHantei(); if(p==$pat_Sample+8) vp=1; else if(p==$pat_Sample+10) vp=-1; if(i%20==0) p=p+vp; update(); } |
Red.tonyu |
---|
extends SpriteChar; function onDie() { appear(new Bomb(x , y ,$pat_Sample+4)); } function atariHantei() { for (t in $chars) { if ( t is Tama && crashTo(t) ) { life=life-1; if(life<=0) { die(); $score=$score+30; } t.die(); } } if (crashTo($myChar)) $myChar.die(); } life=3; i=0; d=1; if(x<$myChar.x) direction=1; else direction=-1; while (y<$screenHeight+15) { i++; y=y+1; x=x+d*(sin(16*y)*10+direction); if(x<15 || x>$screenWidth-15) d=-d; atariHantei(); if(p==$pat_Sample+11) vp=1; else if(p==$pat_Sample+13) vp=-1; if(i%20==0) p=p+vp; update(); } |
カラーをつけた部分は非常に似ています。これをメソッドのようにどこかでまとめられないのでしょうか。
まとめると、プログラムは見やすくなる上、後で変更したり敵を増やしたりするときに便利そうです。
クラスの継承を使ってみましょう。
クラスの継承についてはTonyuLABのTonyu Program Techでも説明してありますので参考にしてみてください。
参照:
Tonyu Program Tech-クラスの継承
Tonyu System-命令リファレンス
-extends
まず、新しいオブジェクトを作成して、skyBlueと言う名前にしてEnemyの内容のメソッド以外をコピーします。
次にextendsの後ろをSpriteCharからEnemyに変えてみましょう。
skyBlue.tonyu |
---|
extends Enemy; nexty=rnd(50)+100; while (y<nexty) { y=y+2; atariHantei(); update(); } if (x>$myChar.x) vx=2; else vx=-2; while (y<$screenHeight+15) { y=y+3; x=x+vx; if(x<15 || x>$screenWidth-15) vx=-vx; atariHantei(); update(); } |
Enemyには、メソッドだけをおいておきましょう。
Enemy.tonyu |
---|
extends SpriteChar; function onDie() { appear(new Bomb(x , y ,$pat_Sample+4)); } function atariHantei() { for (t in $chars) { if ( t is Tama && crashTo(t) ) { die(); t.die(); $score=$score+10; } } if (crashTo($myChar)) $myChar.die(); } |
YellowはEnemyとまったく同じメソッドを持っているのでSpriteCharをEnemyに変えてメソッドを削除してしまえば終わりです。
Yellow.tonyu |
---|
extends Enemy; i=0; d=1; while (y<$screenHeight+15) { i++; y=y+1; x=x+d*sin(8*y)*10; if(x<15 || x>$screenWidth-15) d=-d; atariHantei(); if(p==$pat_Sample+8) vp=1; else if(p==$pat_Sample+10) vp=-1; if(i%20==0) p=p+vp; update(); } |
Redはメソッドがまったく同じではありません。lifeがあります。そこで、Enemyの内容をRed.tonyuの内容に変えてしまいましょう。
また、skyBlueやYellowも得点が30点となりそうなので、markという変数も用意しておきましょう。
Enemy.tonyu |
---|
extends SpriteChar; function onDie() { appear(new Bomb(x , y ,$pat_Sample+4)); } function atariHantei() { for (t in $chars) { if ( t is Tama && crashTo(t) ) { life=life-1; if(life<=0) { die(); $score=$score+mark; } t.die(); } } if (crashTo($myChar)) $myChar.die(); } |
Red.tonyu |
---|
extends Enemy; mark=30; life=3; i=0; d=1; if(x<$myChar.x) direction=1; else direction=-1; while (y<$screenHeight+15) { i++; y=y+1; x=x+d*(sin(16*y)*10+direction); if(x<15 || x>$screenWidth-15) d=-d; atariHantei(); if(p==$pat_Sample+11) vp=1; else if(p==$pat_Sample+13) vp=-1; if(i%20==0) p=p+vp; update(); } |
これでRedにも継承を適用しましたが、skyBlueとYellowにはlifeがありませんので無敵のような状態になってしまいました。
(実際には、null値が入ってskyBlueもYellowも一発で死にます。しかし、scoreもnull値になるためスコアに加算されません。)
そこで、skyBlueとYellowにはlife=1の一文を付け足してあげましょう。また、得点を10点に戻してあげましょう。
skyBlue.tonyu |
---|
extends Enemy; mark=10; life=1; nexty=rnd(50)+100; while (y<nexty) { y=y+2; atariHantei(); update(); } if (x>$myChar.x) vx=2; else vx=-2; while (y<$screenHeight+15) { y=y+3; x=x+vx; if(x<15 || x>$screenWidth-15) vx=-vx; atariHantei(); update(); } |
Yellow.tonyu |
---|
extends Enemy; mark=10; life=1; i=0; d=1; while (y<$screenHeight+15) { i++; y=y+1; x=x+d*sin(8*y)*10; if(x<15 || x>$screenWidth-15) d=-d; atariHantei(); if(p==$pat_Sample+8) vp=1; else if(p==$pat_Sample+10) vp=-1; if(i%20==0) p=p+vp; update(); } |
これで一見落着と行きたいところですが、UFOはいまだにEnemyを出しつづけています。これでは、skyBlueは出て来れません。
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)); } while(1) { while(x<$screenWidth - 40) { x=x+2; appearEnemy(); update(); } while(x>40) { x=x-2; appearEnemy(); update(); } } |
これでクラスの継承は終わりです。プログラムの効率良くなり、見やすくもなりました。
次は、新しい敵を作成して、敵にも弾を撃たせて見ましょう。
前 次 トップ |