Tonyu Lab
Contents

 
Top
About Us
About Tonyu
Tonyu Program Tech
0.基礎
1.条件節
2.クラスの継承
3.メソッド
4.コンストラクター
Tutorial
Sample
BBS
Link
 
Author: Nuntora

4.コンストラクター

 コンストラクターとクラスの継承を理解し、それを自由に使いこなすことができれば、Tonyuをマスターしたと言っても過言ではないかもしれません。Tonyuは「簡単にゲームを作成できる」という合言葉で生まれた言語できすが、実際は奥深く文章になっていないものも多く存在します。その一つが「コンストラクター」です。

 コンストラクターを一言で言えば、「オブジェクトを生成する際に必ず実行される初期化処理を記載した部分」くらいの意味ですが、わかりやすく言えば、「一番最初に読み込んでくれる部分」くらいの意味でも結構だと思います。

---------------------------------------------------------------
myChar.tonyu
---------------------------------------------------------------
extends SpriteChar;
function onDie() {
  appear(new Bomb(x , y ,$pat_bomb+0));          //自機爆発画像を表示
  }
  
while (1) {                                      //無限ループ
  if (getkey(39)>0 && x<$screenWidth-30) x+=3;   //右移動
  if (getkey(37)>0 && x>30) x-=3;                //左移動
  if (getkey(40)>0 && y<$screenHeight-30) y+=3;  //下移動
  if (getkey(38)>0 && y>30) y-=3;                //上移動
  if (getkey(32)==1) {                           //スペースキー
    appear(new tama(x,y,$pat_Tama+0,0, 5,-10));  //右上方への弾
    appear(new tama(x,y,$pat_Tama+0,0, 0,-10));  //上方への弾
    appear(new tama(x,y,$pat_Tama+0,0,-5,-10));  //左上方への弾
  }
  atariHantei();
  update();
}
---------------------------------------------------------------

---------------------------------------------------------------
tama.tonyu
---------------------------------------------------------------
extends DxChar;
constructor tama(x,y,p,f,vx,vy) {                //コンストラクター
  super(x,y,p,f);
  this.vx=vx;
  this.vy=vy;
  if (!vy && !vx) {
  vx=0;
  vy=-10;
  }
}
while (y>0 && y<$screenHeight) {
  y+=vy;
  x+=vx;
  update();
}
---------------------------------------------------------------

さて、上のプログラムは何をやっているのでしょうか。3つの方向に弾を飛ばそうしているのがお分かりいただけるでしょうか。

tama(x,y,p,f,vx,vy)

x,y,p,f,vx,vy
とは、つまりは
appear(new tama(x,y,$pat_Tama+0,0, 5,-10)) の場合

x,y,$pat_Tama+0,0, 5,-10
のことを指し示しています。

super()という変なものが出てきましたが、これは親クラス(DxChar)にあるコンストラクターをもらってくる(参照する)という意味です。

thisというあまり見慣れないものが出てきましたが、これは自分自身のオブジェクトという意味です

(注:JAVAではclass名とconstructor名が同じでなければなりませんでしたが、Tonyuではconstructorと書いてください。また引数を持たせた複数のconstructorを生成することはできますが、片方は無視されます。つまりは、複数のコンストラクターは機能いたしません。)

結果的に何が行われたのでしょうか。ご理解いただけるかどうかはわかりませんが、このようになります。

appear(new tama(x,y,$pat_Tama+0,0, 5,-10))の場合、発生した場所や画像などは親クラスの値を使い(x,y,$pat_Tama+0,0:x,y,p,f)、5と-10をそれぞれ自分の速度vx,vyに代入し、移動方法を決定した。vx、vyが与えられていなかった場合には、直進移動するようにした。

数学者っぽく言えば

自機と発生した弾の単位ベクトルを利用して、弾の移動方法を決定した。

となります。難しいですね。しかし、理解して頂きたいのはコンストラクターです。なぜ、3つの方向に弾を飛ばす場合に、3つのクラスを用意してあげなければならなかったのでしょうか?それは、vxとvyがそれぞれ異なるからです。しかし、メソッドのように気軽にオブジェクトを発生させることはできません。そこで、コンストラクターを用いて、オブジェクトの初期化を行いvxとvyをそれぞれに与えてあげることで、tama1、tama2、tama3と3つのクラスになるようなことを回避しています。

 自分のプログラムにも当てはまりそうだと思われた方は是非とも試していただきたいと思います。

 当ホームページにて、コンストラクターに関するサンプルを用意してあります。実際に、どのようにして使用しているのか参考にして頂ければ幸いです。