次 トップ


エンディングを作成する

現在ではBossが破壊されても何も起らず、ゲームが終わったような気がしません。エンディングも作成してあげましょう。

Enemy.tonyu
extends SpriteChar;

function onDie() {
  appear(new Bomb(x , y ,$pat_Sample+4,3));
}
function atariHantei() {
  for (t in $chars) {
   if ( t is Tama && crashTo(t) )  {
     life=life-1;
     if(life==0) {
       die();
       if(mark==200) $UFO.stop=3;
       if(mark==1000) {
         $UFO.stop=4;
         $mplayer.stop();
       }
       $score=$score+mark;
       $mplayer.play($se_bomb,0,60);
     }
     t.die();
   }
  }
  if (crashTo($myChar)) $myChar.die();
}
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);
}

まず、音楽を止めて、UFOを動かしてあげましょう。

UFO.tonyu
extends SpriteChar;

function appearEnemy() {
   if (rnd( 400 )==0) appear(new Item(rnd(530)+15,y,22));
   if (rnd( 1600 )==0) appear(new Item(rnd(530)+15,y,17));
   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));
   if ($score>1000 && stop==0) stop=1;
   if ($score>3000 && stop==3) {
     appear(new Boss(x+1000,y+1000,$pat_Sample+29));
     stop=2;
     $mplayer.stop();
     $mplayer.play($se_shootingsampleBoss,0,80);
   }
}
$score=0;
vx=2;
stop=0;
while(1) {
  if(! $myChar.isDead()) {
    if(!( (stop==1 || stop==2) && x>$screenWidth - 42 )) x=x+vx;
    else {
      if(stop==1){
        appear(new middleBoss(x,y,$pat_Sample+26));
        stop=2;
      }
    }
    if( stop!=1 && stop!=2 && stop!=4 ) {
      appearEnemy();
    }
    if( x<40 || x>$screenWidth - 40 ) vx=-vx;
    if( stop>3 && x<$screenWidth/2 ) {
      for(i=-5;i<=5;i++) for(j=-5;j<=5;j++) {
        appear(new Bomb(x-i*5,y-j*5,$pat_Sample+4,3));
        $mplayer.play($se_bomb,0,60);
      }
      die();
    }
  }
  update();
}

次に、UFOが動いて敵を出されては困るので、新しくstop!=4という条件を加え、さらに、UFOは真中に戻ってきてダイナミックに爆破させてみました。

この状態ではmyCharの移動が可能です。myCharにはどこかに飛んでいってもらって消えてもらいましょう。

myChar.tonyu
extends SpriteChar;
 
function onDie() {
  appear(new Bomb($myChar.x , $myChar.y ,$pat_Sample+4,3));
  $mplayer.stop();
  $mplayer.play($se_shootingsample_gameover,0,80);
}

function atariHantei() {
  for (t in $chars) {
   if ( t is Item && crashTo(t) )  {
     if(t.p==22) if(a.get(0)>=11) a.set(0,a.get(0)-1);  //赤い玉
     if(t.p==17) if(a.get(1)<=3) a.set(1,a.get(1)+1);   //青い玉
     t.die();
   }
  }
}
a=new Array();  //アイテムの配列
a.add(10);  //弾の連射間隔カウント...a(0)
a.add(4);   //弾の同時発射数...a(1)
while(!($UFO.isDead())) {
  i++;
  if (getkey(39)>0 && x<$screenWidth-20 ) x=x+3;
  if (getkey(37)>0 && x>20) x=x-3;
  if (getkey(32)>1 && i>a.get(0)) {
    $mplayer.play($se_shoot,0,80);
    for(ii=1;ii<=a.get(1);ii++) appear(new Tama((x-5*(a.get(1)-1-2*(ii-1))),y,$pat_Sample+1));
    i=0;
  }
  atariHantei();
  update();
}
while(1){
  if(y>-15) y-=2;
  else ending=1;
  update();
}

endingというローカル変数をつけてみました。これで、現在がエンディング中であることを示すことにします。

Text.tonyu
extends TextChar;

destructor fileOut(){  //fileOutのデストラクタ
  fileOut.close();
  print("デストラクタによりファイルは保存されました");
}
$screenHeight=381;
$screenWidth=560;
$bgcolor=11816980;
$mplayer.play($se_shootingsample1,0,80);
$myChar.ending=0;
i=255;
j=500;
messageContents=new Array();  //messageの内容の配列
messageContents.add("製作:チュートリアル-シューティングゲーム hoge-");
messageContents.add("  :シューティングチュートリアルエクステンデット nuntora");
messageContents.add("画像:チュートリアル-シューティングゲーム hoge-");
messageContents.add("  :シューティングチュートリアルエクステンデット nuntora");
messageContents.add("プログラム:チュートリアル-シューティングゲーム hoge-");
messageContents.add("     :シューティングチュートリアルエクステンデット nuntora");
messageContents.add("BGM:nuntora");
messageContents.add("効果音:nuntora");
messageContents.add("助言:nuntora");
messageContents.add("監修:nuntora");
while(1) {
  text="Score:"+$score;
  if($myChar.isDead()) {
    if($score>$highScore) {
      $highScore=$score;
      fileOut=new FileWriter("highScore.txt");
      fileOut.writeLn($highScore);
      fileOut.close();
    }
    if(i>0) i--;
    if(i==250) for(t in $chars) if(t is Enemy) t.die();
    if(i==200) appear(new Blue($screenWidth/2,$UFO.y,$pat_Sample+22));
    if(i==1) $UFO.die();
    $bgcolor=color(  0,  0,  i);
    drawText($screenWidth/2-130,$screenHeight/2-30,"Game Over",color(255-i,255-i,255-i),50);
    drawText(210,330,"Press N Key",$clWhite,16);
    if (getkey(78)>0) $projectManager.loadPage($page_start);
  }
  if($myChar.ending==1){
    if (getkey(78)>0) $projectManager.loadPage($page_start);
    if(j>-700) {
      drawText(10,j-50,"Shooting Game Sample - Extended -",$clWhite,22);
      for(jj=0;jj<10;jj++) drawText(10,j+jj*50,messageContents.get(jj),$clWhite,13);
      j-=1;
      drawText(160,j+jj*50+330,"Press N Key for Replay",$clWhite,16);
    }
    if(j==-700) drawText(160,130,"Press N Key for Replay",$clWhite,16);
  }
  update();
}

最後に製作者の名前などを書いてあげるとエンディングらしくなります。

エンディングの時だけでなく、著作権に絡む内容はreadmeファイルなどを作成して一緒に配布すること大切なことです。他人の著作権を守ることは自分の著作権を守ることにもなります。

最後に

これで、シューティングチュートリアルエクステンデッドは終わりです。しかし、このチュートリアルにも中ボスやエンディングに音楽や効果音を付け加えたりするとよりゲームらしくなります。
しかし、今回はチュートリアル作成ということで、仕上がりには重点を置かず、内容に重点をおきました。

Tonyu作成に必要な知識としての「配列」、「継承」、「コンストラクタ」の他にも、プログラム製作に必要な数学の知識としての「三角関数」、日頃は滅多に見かけることのない高等数学の知識である「階差数列」、「アステロイド」、「インボリュート」、「レムニスケート」なども織り交ぜてみました。
数学が苦手な方でもプログラム作成は可能であることを理解していただけたと思いますが、それと同時にどんなに避けようとしても三角関数の知識は必要になることもご理解いただけたと思います。
現在の自分にあった内容でゲームを作成し、高等数学などの知識は理解せずにメソッドとして使用するだけにとどめると、ゲーム作成にあたりさらなる飛躍を望むことができると確信しています。

 次 トップ