Tonyu System 1 - wiki


命令リファレンスWikiトップ

for (xx in $chars)

画面上のすべてのオブジェクトに対して処理を行います

書式

for (変数名 in $chars) 処理

変数名で表される変数に画面上のオブジェクトを順番に代入していき、処理を行います。

例1

Enemy.tonyu

extends SpriteChar;
while (1) {
  y=y+1;
  update();
}

Jiki.tonyu

extends SpriteChar;
while (1) {
  if (getkey(39)>0) x+=3;
  if (getkey(37)>0) x-=3;
  if (getkey(40)>0) y+=3;
  if (getkey(38)>0) y-=3;
  for (e in $chars) {
    if (e is Enemy && crashTo(e)) die();
  }
  update();
}

▲ Jikiは、画面上のEnemyクラスのオブジェクトeのうちのどれかに対して、 crashTo(e)が成立すればdie();を呼び出します。
すなわち、Enemyクラスのいずれかに当たると死亡します。

例2

新たにEnemy2を増やして、別クラスの当たり判定を増やす場合です。

以下は悪い例です。

Jiki.tonyu

extends SpriteChar;
while (1) {
  if (getkey(39)>0) x+=3;
  if (getkey(37)>0) x-=3;
  if (getkey(40)>0) y+=3;
  if (getkey(38)>0) y-=3;
  for (e in $chars) {
    if (e is Enemy && crashTo(e)) die();
  }
  for (e in $chars) {
    if (e is Enemy2 && crashTo(e)) die();
  }
  update();
}

for (e in $chars) を2回実行しています。これでも判定はできますが、
全オブジェクトを2回判定しているので、オブジェクトが増えると処理落ちしやすくなってしまいます。
これにEnemy3, Enemy4, ... などと増やしていくと、ちょっとオブジェクトを増やしただけで、かなり重くなるかもしれません。

以下の実装の方が処理が軽くなります。

Jiki.tonyu

extends SpriteChar;
while (1) {
  if (getkey(39)>0) x+=3;
  if (getkey(37)>0) x-=3;
  if (getkey(40)>0) y+=3;
  if (getkey(38)>0) y-=3;
  for (e in $chars) {
    if (e is Enemy || e is Enemy2) {
      if (crashTo(e)) {
        die();
      }
    }
  }
  update();
}

▲ この書き方であれば、for (e in $chars) は1回だけで済むので、判定処理が軽くなります。

関連


命令リファレンスWikiトップ