トップ


アイテムを取ってPowerUpさせる

アイテムを取って、myCharをPowerUpさせてみましょう。

まず、アイテムの画像を作成したいところなのですが、Tonyuには初期状態でいくつかの画像が用意されています。


Tonyu\Kernel\ball.bmp

それぞれ、p=0からp=31まで使用されています。
さらに述べさせて頂ければ、p=32にはmyCharの画像、p=32にはTamaの画像といったように取り込んだ画像が順次埋められていると思います。
今回は、初期状態で入っている画像の中の赤いボール(p=22)と青いボール(p=17)を使用してmyCharの攻撃力をPower Upさせたいとおもいます。

まず、Itemというオブジェクトを作成しましょう。そしてオブジェクトインスペクタを開いてみてください。


pの項目の右側で、数字が書いてあるところ(初期状態ならば「3」が代入されているはずです)というところで「22」と打ち込んで見てください。
画像が赤いボールに変わったと思います。

さて、今回は赤い玉で連射機能を上げて、青い玉でmyCharが弾を同時に4発撃てるようにする仕組みにしたいと思っています。
redBallとblueBallというクラスを2つ用意しても良いのですが、後でアイテムの種類を増やしたときにクラスがその都度増えて管理に大変そうです。
また、赤い玉も青い玉もただ単純に下に落ちてくるだけにしようかと思っているので、クラスを2つも作るのは無駄が多すぎます。

そこで、今回は「配列」という概念を使用して、効率良く少ないプログラムで綺麗に仕上げてみましょう。

Item.tonyu
extends SpriteChar;

while(y<$screenHeight+15){
  y+=2;
  update();
}

Itemはこのように短いプログラムで大丈夫です。

myCharのプログラムでPowerUpさせてみましょう。

myChar.tonyu
extends SpriteChar;
 
function onDie() {
  appear(new Bomb($myChar.x , $myChar.y ,$pat_Sample+4));
}

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(20);
a.add(1);
while(1) {
  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)) {
    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();
}

赤い玉と青い玉の両方に対応するようにしてみました。

まず、これを説明する前に、このソースには以下の知識が使われております。

配列に関しては、今から説明しますが、階差数列に関しては高校でも理系の知識が必要となります。よって、全てを説明することは大変困難なので、階差数列に関しては簡単な説明だけにさせていただきたいと思います。配列に関する説明は、TonyuLABでも行っております。

まず、プログラムの方では配列を作成しました。

a=new Array();

配列の名前がaとなりました。aはitemArrayなど名前を変更しても大丈夫です。
次に最初と2番目の項目には20と1を代入しました。

a.add(20);
a.add(1);

これで、a.get(0)=20、a.get(1)=1となったはずです。

if (getkey(32)>1 && i>a.get(0)) {

の部分は以前

if (getkey(32)>1 && i>20) {

となっていた個所です。最後の20を10などと数を少なくすると玉の連射は速くなります。
つまり、a.get(0)を10にできれば弾はより速く発射されるようになるということです。

当たり判定の中の以下の部分を見てみましょう

if(t.p==22) if(a.get(0)>=11) a.set(0,a.get(0)-1);

ifがたくさんあって非常に見にくいです。これは、以下の文と同じ意味です。

if(t.p==22) {
  if(a.get(0)>=11) {
    a.set(0,a.get(0)-1);
  }
} 

ここでは、当たった玉が何色なのかを判定し、配列aの0番目の要素(初期状態で20)が11以上であれば配列aの0番目の要素から1を引くという操作を行っています。初期状態では20ですので、最初の赤い玉に触れると19になるはずです。10回赤い玉を取ると配列aの0番目の要素は10となり、11以上ではないので、数がそれ以上減らないようになります。

青い玉の方は、初期状態で1が入っていたはずです。

新しい青い玉を取ると

if(t.p==17) if(a.get(1)<=3) a.set(1,a.get(1)+1);

配列aの1番目の要素が1つ増えます。よって、2となって4回目以降青い玉をとっても何も起らないようになっています。よって、4まで増えることができるわけです。

for(ii=1;ii<=a.get(1);ii++) appear(new Tama((x-5*(a.get(1)-1-2*(ii-1))),y,$pat_Sample+1));

階差数列が使用されております。一つだけ弾が飛ぶ場合には、

for(ii=1;ii<=1;ii++)となって、

appear(new Tama((x-5*(1-1-2*(1-1))),y,$pat_Sample+1));

の操作が一度だけ行われます。

(1-1-2*(1-1))

0-2*0で

0

になりますので、

x-5*0

となり

x

だけ残ります。

2つ飛ぶ場合には、

for(ii=1;ii<=2;ii++)

となり、左側の弾(ii=1)と右側の弾(ii=2)に別れます。先と同様に計算すると、

appear(new Tama((x-5*(1-2-2*(1-1))),y,$pat_Sample+1));
appear(new Tama((x-5*(1-2-2*(2-1))),y,$pat_Sample+1));

appear(new Tama((x-5*1),y,$pat_Sample+1));
appear(new Tama((x-5*(-1)),y,$pat_Sample+1));

となり、x-5とx+5の2つ飛ばすことになっています。3,4の時も同様な処置を執り行っているので、ソースは見やすくかつ数を増やすときも簡単に対応できるようになっています。

今回は、配列と階差数列をしようしましたが、配列を使わなくても同様な操作は可能です。また、階差数列もif文を多用すればソースは見づらくなりますが、不可能ではありません。自分の可能性にあった方法を探ってみたり、自分の現在の能力でできるプログラミングを目指してみることも大切です。

次は、赤い弾と青い弾を出現させたいのですが、UFOから敵同様に出現させたのではしっくりときません。ランダムに出現させて見ましょう。

  トップ