for文
投稿者 : メリッサ(p210.net059086013.tnc.ne.jp)
- 2006/08/07(Mon) 16:49
No.10195
|
|
|
|
|
for(t in $chars){ if(t is teki) } 上のような文での質問です。 「tのaが1だったら」の条件は if(t.a==1) で書けるのですが、 「tのaが1で、かつ、teki全員のaが2以外だったら」 のような条件の書き方ががうまく浮かびません tが誰を指しているのかさっぱりになってしまいました
おねがいします
|
汚いですが
投稿者 : 迦葉(F004227.ppp.dion.ne.jp)
- 2006/08/07(Mon) 17:17
No.10196
|
|
|
|
while(1){ cnt=0; for(t in $chars){ if(t is teki && t.a==2){cnt++;} } //敵全員のaを調べます。このforループ内に下のif文を入れてしまうと、敵全員のaを調べている途中で判定することになり、上手く動きません。
for(t in $chars){ if(t is teki && t.a==1 && cnt==0){//命令} } //もう一度ループで敵全員を調べ、命令をさせます。 update();}
二個も並べるのが非常に不愉快ですが、動くことは動きます。 綺麗に書くにはもう少しエライひとのアドバイスが欲しいところです。
|
Re: for文
投稿者 : メリッサ(p076.net059086014.tnc.ne.jp)
- 2006/08/07(Mon) 17:44
No.10197
|
|
|
|
Re: for文
投稿者 : 大月(160.230.192.61.east.flets.alpha-net.ne.jp)
- 2006/08/07(Mon) 17:49
No.10198
|
|
|
|
迦葉さんので動きそうですね。 似たようなループが二つ並ぶのがお気に召さないようですが、僕は別に構わないと思います。わかりやすいですし。
工夫するなら事前判定の部分に少し追記して cnt = 0; for( t in $chars ){ if( t is teki && t.a==2 ){ cnt = 1; break; } } a==2のオブジェクトがひとつでもあったら条件は成り立たないので、breakですぐにループを抜けるようにします。 さらに下のループの所も if( cnt==0 ){ for( t in $chars ){ if( t is teki && t.a==1 ){ //命令 } } } a==2のオブジェクトがひとつでもあったら(cnt==1)、a==1であるかどうかを調べる必要がないので、for文を通らないようにしてしまっても良いと思います。
ただまぁ、この工夫で実行速度にどれだけの差が出るかは我ながら疑問が残ります(笑 これで差が出るほどオブジェクトが多い場合は描画にも相応の時間が掛かっちゃってそうですからね。
|
Re: for文
投稿者 : メリッサ(p076.net059086014.tnc.ne.jp)
- 2006/08/07(Mon) 18:02
No.10199
|
|
|
|
for文って意外と難しいですね。 t がどのオブジェクトを指しているのかちょっとわかりにくいですね。 始めたばかりの頃は苦労しました.
|
Re: for文
投稿者 : たく(ntchba080155.chba.nt.adsl.ppp.infoweb.ne.jp)
- 2006/08/07(Mon) 20:03
No.10202
|
|
|
|
tekiにif(a==2)$a=1; と付け足して if($a==0 ){ for(t in $chars){ if(t is teki&&t.a==1)){
} } こうしたらすこしは軽くなると思います
|
うーん
投稿者 : 迦葉(L149003.ppp.dion.ne.jp)
- 2006/08/08(Tue) 17:36
No.10203
|
|
|
|
たく さんの
tekiにif(a==2)$a=1; と付け足して if($a==0 ){ for(t in $chars){ if(t is teki&&t.a==1)){
} } について、
グローバル変数を使うことも考えたんですが、これだと$aを0にすることができない(というか、どのオブジェクトの何処に$a=0を入れても、上手いこと判定できない可能性が出てくる)ので無理だと思ったのです。
やはり二重は必須でしょうか。なんかfor文はものすごい重いイメージがあるんですが、そんなことも無いのでせうか。
|
for(t in $chars)文について
投稿者 : fumo(PPPa138.hiroshima-ip.dti.ne.jp)
- 2006/08/08(Tue) 18:21
No.10204
|
|
|
|
話がそれますが、 for(t in $chars){ if(t is teki){
} } この文自体で、たいして重くならないと思います。 ただ、無駄があって、それが気になるのかと。特にtekiクラスのオブジェクトが少なく、画面上のオブジェクトが多い場合は。
for(t in $chars){} の文で、$charsは配列です。 $charsにあたる配列を自分で作れば無駄は出ません。 作り方はいろいろあると思いますが、
teki_chars=new array(); teki_chars.add(appear(new teki() ) );
基本はこんな形です。 tekiクラスがxという変数を持っていれば、
teki_chars.get(0).x
という形でアクセスできます。
teki_chars.add(appear(new teki() ) );
これを繰り返し、いっぱいaddさせて、配列にオブジェクト(のアドレス)を代入させれば、
for(t in teki_chars){ t.x; } この文が使えます。
何というか、処理速度という点ではたいしたことないのですが、tonyuっぽいというか・・・使いやすいなぁと感じるところです。 teki_charsをグローバル変数(配列)にすると、どのオブジェクトからもアクセスできて便利です。$charsもグローバルですし。
|
Re: for文
投稿者 : 大月(237.255.192.61.east.flets.alpha-net.ne.jp)
- 2006/08/09(Wed) 11:38
No.10208
|
|
|
|
tonyuにおいてfor(in)文が重いかどうかは、テストプログラムを組んで計ってみるのが一番良いかと思います。 実際に10万回ループとかを走らせて時間を計り、他の文を使ったテストプログラムも組んで速度を比較し、著しく差が出るようなら変更を考えればいいでしょう。
これがゲームに載せるコードだと言うとを考えると、ゲーム中特に不満なほど重くならなければ、最初に思いついた方法で処理してしまえば良いと思います。 これひとつの速度をいつまでも研究していても、ゲームの開発においては脱線でしかないと思うのです。
ただ、見直しの必要があるかも知れないということは、コメント文なり開発資料なりにメモしておいた方が良いとは思います。 あとでどこを改善すべきなのか、全ソースコードを見て探すのは大変ですからね(^^;
ではではがんばってくださいませー。
|
|