- ベストアンサー
DXライブラリについて(ゲームプログラミング)
今までVisualC++.netでWinAPIを使ってアクションゲームを 作っていたのですが、最近DXライブラリを使い出しました。 今までは一定時間ごとにメインループとは別に自動的に行われる 処理はウィンドウプロシージャでSetTimerして case WM_TIMER:に処理を書くことで実現していたのですが、 DXライブラリの場合それにあたる機能はあるのでしょうか。 たとえばメインループとは別に1秒おきにある変数をTRUEにしたり FALSEにしたりしたい場合、ウィンドウプロシージャでやるしかないのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
再度です。 流石にそこから先は、自分で考えてみてください。 どうやら私の認識違いも大きいようなので・・・・ 私自身DirectXを使ったゲームの開発経験はありますが、DXライブラリ自体は 使ったことが無いので・・・・だから「経験者」の意味合いも、たぶん質問者様と ズレがあるはずです。 一通り「DXライブラリ」のページを見ましたが、サンプルプログラムを全て見ていけば 解決できる問題のはずです。 全てのサンプルをまずは実行し、よーく見てください。移動とありますが、移動と、アニメーションの 計算を先にやってから、後でまとめて描画すれば、まあ解決できるはずです。 ・・・もしくは // 裏画面の内容を表画面にコピーする ScreenFlip() ; // Windows 特有の面倒な処理をDXライブラリにやらせる ProcessMessage() ; この2つをループ中に書くだけである程度は解決できるかも知れません。 まあ別の問題が出たらその時は、実際この2つで何をやっているかを調べればいいでしょう。 ソースも公開しているみたいですし・・・・
その他の回答 (2)
- aho0xff
- ベストアンサー率12% (218/1771)
再度、No1です。お礼について再度回答します。 while (1){ タイム計測 ↓ 足踏み用の変数の値を入れ替え ↓ 描画(足踏み変数を判定して左右のキャラを描画) ↓ while (時間が前回計測時から1秒経過するまでループ){ if (キー入力() == TRUE ){break;} } } の部分の while (1){ と while (時間が前回計測時から1秒経過するまでループ){ if (キー入力() == TRUE ){break;} がいらない気がするんですよね。つまり タイム計測 ↓ 足踏み用の変数の値を入れ替え ↓ 描画(足踏み変数を判定して左右のキャラを描画) コレだけで十分かと・・・言い方正しいかは分かりませんが、基本的にゲームの描画とかアニメーションって その時その時、瞬間の状態が描画できれば、まあ大体うまくいけます。そもそもゲームループって 1秒間に何回も実行しますよね??だから1回のループだけならコレで十分です。 後だんだん分かってくるとは思いますが、基本的に「描画」ってのは重い処理です。 質問者様の考えている、「キャラのアニメーションにあわせて描画」はありと言えばありですが、 キャラが10、20と増えるにしたがって必然的に追いつかなくなります。 なのでアニメーションの多さや、アクションが多いゲームで、その考え方はあまりオススメしません。 変に待ったりしないで、その瞬間が描画できれば良しとした方がいいです。
補足
すみません、アクションとは言いましたがどちらかというと RPGに近いのかもしれません。キャラの動きに合わせて 描画するのではなく時間に合わせてキャラが描画されるといった 感じです。雰囲気としてはFFやドラクエの勇者や村人の 足踏みみたいな感じです。 ですのでキャラが増えても問題は無いタイプです。 その為while(1)はそれ自体がゲームループです。 後、 タイム計測 ↓ 足踏み用の変数の値を入れ替え ↓ 描画(足踏み変数を判定して左右のキャラを描画) この仕様にした場合キー入力とかの判定がその場でできなくないですか? キー入力があったらすぐに一歩移動したグラフィックを描画しないといけないので。。
- aho0xff
- ベストアンサー率12% (218/1771)
「DXライブラリ」で検索すると、そのままの名前のフリーライブラリがヒットしちゃうんですよね。 それのことを指しているのか、DirevtXそのものを指しているのかいまいち分かりませんので >DXライブラリの場合それにあたる機能はあるのでしょうか コレに関しては保留で。まあ「DXライブラリ」はウインドウプロシージャ周りはかなり内包されているみたいですね。 DirevtXには、その手の機能は無かったはずです。 >たとえばメインループとは別に1秒おきにある変数をTRUEにしたり >FALSEにしたりしたい場合、ウィンドウプロシージャでやるしかないのでしょうか? コレは私なら、そのつどそのつど時間を取得してその時の時間で計算しなおしますけどね。 無理にそういう実装にする必要も無いかと・・・
お礼
回答ありがとうございます。私が言っているのは DirectXでなくDXライブラリです。 そのつど時間を取得するやり方は私も考えたのですが、 例えばキャラが1秒おきに自動的に足踏みをするように したいのですが、 while (1){ タイム計測 ↓ 足踏み用の変数の値を入れ替え ↓ 描画(足踏み変数を判定して左右のキャラを描画) ↓ while (時間が前回計測時から1秒経過するまでループ){ if (キー入力() == TRUE ){break;} } } *但しキー入力は入力が無ければスルーされる と、こんな感じに作ったのですが、while文をノーウェイト で回しているためCPUに激しい負荷がかかります。 かといってSleepなどでとめると止めている間キー入力に 反応できなくなってしまうので、私としては 1秒おきに足踏み変数を入れ替えて自動的に再描画させる サブループとキー入力があるまで何もしないメインループ とを分離したかったのですが、何か解決策は無いものでしょうか・・?
お礼
たびたびの解答ありがとうございます。 参考になりそうなサンプルまで見つけていただいて・・。 一応ダブルバッファリングは既にしていたのですが、 キー入力の同期とか課題がまだまだ多いです・・。 これをもとにがんばってみます。ありがとうございました!