トップ


オープニングを作る

デバッグをおこなう

これで、ゲームの内容自体は全て完了です。ゲームをさらにゲームらしく見せるためにオープニングを作りたいと思いますが、一度この辺でバグが無いかどうか調べてみましょう。

もう、変なところがあると気付かれている方もいたと思います。10点の敵を倒したときに10点から40点、30点の敵を倒したときには30点から120点、1000点の大ボスに至っては1000点のはずのところ4000点加算されてしまうことがあります。何故でしょうか。

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;
       $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);
}

まさに、この「if(life<=0)」の部分に問題があったわけです。自分で気付いて直された方はデバッグを自力でできる人で、まったく気が付かなかったり気付いてもどこを直せばよかったのかわからなかった人は原因をよくよく考えてみましょう。
4倍の点数が加算されるときはTamaが4発同時にEnemyクラスを有する敵に当たり、その敵のlifeが1であったときに起ったのです。

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;
       $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);
}

これで中ボスに会うまではうまく作動するとおもいます。
しかし、中ボスに会って何かに気が付いたと思います。stingが無敵になっています。
これは以前にも指摘した通り、Stingにlifeが設定していないため、

life=null-1
    =-1

となって0の値をすり抜けてしまったからです。

Sting.tonyu
extends Enemy;

constructor sting(x,y,p,vx) {                //コンストラクター
  super(x,y,p);
  this.vx=vx;
  if(!vx) vx=0;
}
life=1;
while(y<$screenHeight+20){
  x=x+vx;
  y++;
  atariHantei();
  update();
}

これで、デバッグは一通り終了です。オープニングを作成してみましょう。

オープニング画面

プロジェクトマネージャーを使用しない方法もあります。しかし、myCharとUFOを削除してしまうと、それらの値を参照しているオブジェクトから一斉にエラーを報告されることになります。ここは、無難にプロジェクトマネージャーを使用しましょう。

プロジェクトマネージャーについては、HELPにあるチュートリアルの「迷路ゲーム」「スタート画面を作る」を参考にしてみてください。

まず、start.cmmlを作成してください。画面からすべてのオブジェクトが消えて何も書かれていない状態になったと思います。

何か命令を書くところが必要です。シークレットクラスを作成しましょう。

キャラクターパターンにSample.bmpを追加して、以下のようなプログラムを作成してください。

Main.tonyu
extends SecretChar;

$bgcolor=$clBlack;
i=0;
j=0;
k=0;
while(1){
  drawSprite(i+j/10,100+j*0.5+k,$pat_Sample+3);
  drawSprite($screenWidth-i-j/10,100+j*0.5+k,$pat_Sample+22);
  drawSprite(i+j/5-40,140+j*0.25+k,$pat_Sample+19);
  drawSprite($screenWidth-i-j/5+40,140+j*0.25+k,$pat_Sample+11);
  drawSprite(i+j/2-80,180+k,$pat_Sample+8);
  drawSprite($screenWidth-i-j/2+80,180+k,$pat_Sample+2);
  drawSprite($screenWidth/2,0-40+j*1.5+k,$pat_Sample+29);
  if(i<200) i++;
  else if(j<60) j++;
  else if(k<110) k++;
  else {
    drawText(50,50,"Shooting Game Sample - Extended -",$clWhite,22);
    drawText(210,330,"Press Space Key",$clWhite,16);
  }
  if (getkey(32)>0) $projectManager.loadPage($page_index);
  update();
}

何も特別なことはしていません。しかしこれで、オープニング画面は完成です。

次は、最高得点を表示させて見ましょう。

  トップ