- ベストアンサー
ゲームサンプルの敵機出現間隔についての問題
- ゲームサンプルを改造し、敵機の出現間隔を均等にする処理につまずいています。
- 特定のソースコードが問題となっており、その原因を調査しています。
- 特定の処理で、ランダムな数値を用いていることが関係している可能性があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>敵機が3体しかでていないはずなのにデバックには(rand()%WND_W)でやると存在するはずのない4つ目の数字が出てきます。これは一体何なのでしょうか? あなたがそう思っていてもプログラムが、そうなっていないからです。思い込みを出来るだけ排除しましょう。 ここで疑うなら敵の発生じゃなくて消滅も含めて色々あります。 ・等間隔でちゃんと消滅していないのでは? ・発生から消滅までちゃんとトレースしましたか? ・GetCountは信用できますか? ・m_max_enemyが変化する可能性がありませんか? 関連するところは全て疑って掛かるべきでしょう。とりあえず、自分のコード、他人のコード信用するなと言っておきます。
その他の回答 (4)
- zwi
- ベストアンサー率56% (730/1282)
もし、このコード内いだけで問題が起きているなら if(GetCount(ENEMY)<m_max_enemy) で弾かれているとしか思えませんね。 else側を通過してないかOutputDebugString()してみては? if~elseの通過は全て疑ってトレースするほうが良いですよ。 ありえないと思うけど if(m_timer<APPEAR_WAIT) m_timer+=SPF; if(m_timer<APPEAR_WAIT) return; も疑って掛かるのがデバッグです。
お礼
回答ありがとうございます。if(GetCount(ENEMY)<m_maxenemy) をOutputDebugString()したのですが均等で問題はなかったです。ただ 敵機が3体しかでていないはずなのにデバックには(rand()%WND_W)でやると存在するはずのない4つ目の数字が出てきます。これは一体何なのでしょうか? void ControlEnemy::Main(void) { static int i=0; char str[256]; wchar_t str2[256]; i++; if(m_timer<APPEAR_WAIT){ m_timer+=SPF; } if(m_timer<APPEAR_WAIT) return; m_timer=0; i++; if(GetCount(ENEMY)<m_max_enemy) { sprintf(str,"%d\n ",i); mbstowcs(str2,str,256); OutputDebugString(str2); new Enemy((float)(rand()%(WND_W)),ENEMY_CY,ENEMY_SPEED,ENEMY_LIFE); } }
- zwi
- ベストアンサー率56% (730/1282)
OutputDebugString()はVS2008だとパラメータは、UNICODEの文字列しか受け付けません。TCHARや_T()ってヤツですね。 char str[100]; sprintf(str,"xxx %d",x); OutputDebugString(str); とかしませんでした? TCHAR strt[100]; sprintf(strt,_T("xxx %d"),x); OutputDebugString(strt); で表示されると思います。 違ったら補足してください。
お礼
回答ありがとうございます。できました。フレームがずれていました void ControlEnemy::Main(void) { static int fream=0; fream++; if(m_timer<APPEAR_WAIT) m_timer+=SPF; if(m_timer<APPEAR_WAIT) return; m_timer=0; if(GetCount(ENEMY)<m_max_enemy) { char str[256]; wchar_t str2[256]; float f; new Enemy(f=(float)(rand()%(WND_W)),ENEMY_CY,ENEMY_SPEED,ENEMY_LIFE); sprintf(str,"%f\t%d\t%d\n ",f,ENEMY_CY,i); mbstowcs(str2,str,256); OutputDebugString(str2); fream=0; } } とやりました。なぜフレームがずれてしまったのでしょうか?
- zwi
- ベストアンサー率56% (730/1282)
とりあえず、敵に番号つけて、発生と同時に敵に番号、発生フレーム数(プログラム起動からの通算フレーム数)、発生座標をOutputDebugString()でVisualStudioに表示してみてはどうでしょう。 http://msdn.microsoft.com/ja-jp/library/cc428973.aspx これでタイミングとかが分ると思いますが。
お礼
回答ありがとうございます。OutputDebugStringで表示させたら???????・・・と表示されてしまいます。なぜでしょか?
- zwi
- ベストアンサー率56% (730/1282)
全容が分りませんが、X座標を乱数にしているだけですか? X座標が出現間隔に関係しないなら画面全体の座標がいつも固定である場合、いつも同じY座標に出現しますから周期はAPPEAR_WAITとSPFだけで決まるはずです。 なにか問題があるとしたら、ControlEnemy::Main(void)が呼ばれる周期が乱れている可能性があります。rand()%WND_Wは関係ないでしょう。
お礼
回答ありがとうございます。そうです。調べたら多分周期は乱れていないと思うのですが、何か調べる方法があれば教えていただきたいのですが。問題となっているソースを提示します。// 全てのタスクを実行 void Task::RunTask(void) { if(g_buf==NULL) return; // タスクリストが初期化されていない Task *task,*next; for(task=(Task*)m_active; m_active; task=next) { task->Main(); next=task->m_next; if(next==(Task*)m_active) break; } if(g_buf+MEM_SIZE-m_free < DFRG_SIZE) Defrag(); // デフラグ }これだけでは難しいのでしょうか?
お礼
回答ありがとうございます。なんとか均等に表示できるようになりました。rand()%WND_Wがいけなかったみたいです。rand()%WND_Wが640-31か32以下の時表示されないようになってました。それによって表示が遅れてたみたいです。ありがとうございました。