Tonyu Lab
Contents

 
Top
About Us
About Tonyu
Tonyu Program Tech
0.基礎
1.update()
2."="と"=="の違い
1.条件節
2.クラスの継承
3.メソッド
4.コンストラクター
BBS
Link
 
Author: Nuntora

0. 基礎

 update() - もっとも基礎とされながら忘れられがちな関数

 Tonyuのチュートリアルを一通り作成して、独り立ちしようかとされている方に多く見られる現象があります。それはずばり1フレームに終了時にupdate()がないということです。

 そもそも、update()とは何をしているのでしょうか?これを理解しないことにはupdate()をどこに置けばよいのかわからず仕舞いです。

 update()とは、「描画」を行っております。update()が無ければ、画像が更新されず、処理だけが高速で行われます。結果的に処理が重くなってしまうわけです。また、処理が重くなるのは、update()がないという現象のほんの一端に過ぎません。その他、プログラムからは予想もできない現象が起ったりしてしまいます(APIレファレンス(命令リファレンス)「update」参照)。

 では、どういった場合にupdate()に気を使わなければならないのでしょうか?

  1. While Loopの終了時には最低でも一個。
  2. 描画処理を行わせたフレームの終了時にも置く(描画処理を含むfor文の終了時、等々)。

 それでは、それ以外の場合にはどうでしょうか?それ以外の場所には置かなくても大丈夫です。
 掲示板で質問される前にupdate()は大丈夫どうかを調べてみると良いと思います。Program自体には問題が生じていない場合でも挙動が不審といった場合、質問に答える方もあれこれ考えてしまうものです。

--------------------------------------------------------
teki.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(); 
     $score=$score+10;
   }
  }
  if (crashTo($myChar)) $myChar.die();
}
nexty=rnd(50)+100;
while (y<nexty) {
  y=y+2;
  atariHantei();
  update();
}
if (xx>$myChar.x) vx=2; else vx=-2;
while (y<$screenHeight) {
  y=y+3; 
  x=x+vx;
  atariHantei();
  update();
}
--------------------------------------------------------

これから見てお分かり頂けるように、update()は1フレーム(while文などの一回り)の終了時に置いて下さい。下の例も参考にしてみてください。

--------------------------------------------------------
example - 命令リファレンス「waitInput 例」より
--------------------------------------------------------
extends SpriteChar;
while (1) {
  r=waitInput("どっちへいきますか","\"L\":←  \"R\":→ "); // rに入力結果をいれる
  if ($InputBox.getStatus()==2) die(); // キャンセル押したら死亡
  if (r=="Left") { // "Left" を入力したら 、左に移動
    for (i=0 ; i<16 ; i++) {
      x--;
      update();
    }
  }
  if (r=="Right") { // "Right" を入力したら 、左に移動
    for (i=0 ; i<16 ; i++) {
      x++;
      update();
    }
  }
  update();
}
--------------------------------------------------------

while()の中にupdate()が3つありますが、「for文の中の1フレーム終了時にupdate()が必ず着いている」ことを理解して頂けるものと思います。