今までVisualC++.netでWinAPIを使ってアクションゲームを
作っていたのですが、最近DXライブラリを使い出しました。
今までは一定時間ごとにメインループとは別に自動的に行われる
処理はウィンドウプロシージャでSetTimerして
case WM_TIMER:に処理を書くことで実現していたのですが、
DXライブラリの場合それにあたる機能はあるのでしょうか。
たとえばメインループとは別に1秒おきにある変数をTRUEにしたり
FALSEにしたりしたい場合、ウィンドウプロシージャでやるしかないのでしょうか?
No.1
- 回答日時:
「DXライブラリ」で検索すると、そのままの名前のフリーライブラリがヒットしちゃうんですよね。
それのことを指しているのか、DirevtXそのものを指しているのかいまいち分かりませんので
>DXライブラリの場合それにあたる機能はあるのでしょうか
コレに関しては保留で。まあ「DXライブラリ」はウインドウプロシージャ周りはかなり内包されているみたいですね。
DirevtXには、その手の機能は無かったはずです。
>たとえばメインループとは別に1秒おきにある変数をTRUEにしたり
>FALSEにしたりしたい場合、ウィンドウプロシージャでやるしかないのでしょうか?
コレは私なら、そのつどそのつど時間を取得してその時の時間で計算しなおしますけどね。
無理にそういう実装にする必要も無いかと・・・
回答ありがとうございます。私が言っているのは
DirectXでなくDXライブラリです。
そのつど時間を取得するやり方は私も考えたのですが、
例えばキャラが1秒おきに自動的に足踏みをするように
したいのですが、
while (1){
タイム計測
↓
足踏み用の変数の値を入れ替え
↓
描画(足踏み変数を判定して左右のキャラを描画)
↓
while (時間が前回計測時から1秒経過するまでループ){
if (キー入力() == TRUE ){break;}
}
}
*但しキー入力は入力が無ければスルーされる
と、こんな感じに作ったのですが、while文をノーウェイト
で回しているためCPUに激しい負荷がかかります。
かといってSleepなどでとめると止めている間キー入力に
反応できなくなってしまうので、私としては
1秒おきに足踏み変数を入れ替えて自動的に再描画させる
サブループとキー入力があるまで何もしないメインループ
とを分離したかったのですが、何か解決策は無いものでしょうか・・?
No.2
- 回答日時:
再度、No1です。
お礼について再度回答します。while (1){
タイム計測
↓
足踏み用の変数の値を入れ替え
↓
描画(足踏み変数を判定して左右のキャラを描画)
↓
while (時間が前回計測時から1秒経過するまでループ){
if (キー入力() == TRUE ){break;}
}
}
の部分の
while (1){
と
while (時間が前回計測時から1秒経過するまでループ){
if (キー入力() == TRUE ){break;}
がいらない気がするんですよね。つまり
タイム計測
↓
足踏み用の変数の値を入れ替え
↓
描画(足踏み変数を判定して左右のキャラを描画)
コレだけで十分かと・・・言い方正しいかは分かりませんが、基本的にゲームの描画とかアニメーションって
その時その時、瞬間の状態が描画できれば、まあ大体うまくいけます。そもそもゲームループって
1秒間に何回も実行しますよね??だから1回のループだけならコレで十分です。
後だんだん分かってくるとは思いますが、基本的に「描画」ってのは重い処理です。
質問者様の考えている、「キャラのアニメーションにあわせて描画」はありと言えばありですが、
キャラが10、20と増えるにしたがって必然的に追いつかなくなります。
なのでアニメーションの多さや、アクションが多いゲームで、その考え方はあまりオススメしません。
変に待ったりしないで、その瞬間が描画できれば良しとした方がいいです。
この回答への補足
すみません、アクションとは言いましたがどちらかというと
RPGに近いのかもしれません。キャラの動きに合わせて
描画するのではなく時間に合わせてキャラが描画されるといった
感じです。雰囲気としてはFFやドラクエの勇者や村人の
足踏みみたいな感じです。
ですのでキャラが増えても問題は無いタイプです。
その為while(1)はそれ自体がゲームループです。
後、
タイム計測
↓
足踏み用の変数の値を入れ替え
↓
描画(足踏み変数を判定して左右のキャラを描画)
この仕様にした場合キー入力とかの判定がその場でできなくないですか?
キー入力があったらすぐに一歩移動したグラフィックを描画しないといけないので。。
No.3ベストアンサー
- 回答日時:
再度です。
流石にそこから先は、自分で考えてみてください。
どうやら私の認識違いも大きいようなので・・・・
私自身DirectXを使ったゲームの開発経験はありますが、DXライブラリ自体は
使ったことが無いので・・・・だから「経験者」の意味合いも、たぶん質問者様と
ズレがあるはずです。
一通り「DXライブラリ」のページを見ましたが、サンプルプログラムを全て見ていけば
解決できる問題のはずです。
全てのサンプルをまずは実行し、よーく見てください。移動とありますが、移動と、アニメーションの
計算を先にやってから、後でまとめて描画すれば、まあ解決できるはずです。
・・・もしくは
// 裏画面の内容を表画面にコピーする
ScreenFlip() ;
// Windows 特有の面倒な処理をDXライブラリにやらせる
ProcessMessage() ;
この2つをループ中に書くだけである程度は解決できるかも知れません。
まあ別の問題が出たらその時は、実際この2つで何をやっているかを調べればいいでしょう。
ソースも公開しているみたいですし・・・・
参考URL:http://homepage2.nifty.com/natupaji/DxLib/dxprog …
たびたびの解答ありがとうございます。
参考になりそうなサンプルまで見つけていただいて・・。
一応ダブルバッファリングは既にしていたのですが、
キー入力の同期とか課題がまだまだ多いです・・。
これをもとにがんばってみます。ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- C言語・C++・C# ペーパーマリオみたいにドット絵でない2Dのイラストを作ったりするには何のソフトを使えばいいでしょうか 2 2023/05/29 11:28
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- 数学 『Cの微分.2』 3 2023/02/15 19:47
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PCで「使用可能な場合はグラフ...
-
MFCのタイマーのつかい方を教え...
-
NVIDIAのシェーダーキャッシュ
-
[VB.net] DataGridViewの列ヘッ...
-
SHGetFileInfoでアイコンが取得...
-
C#のタブコントロールについて...
-
VBAにGDI+を参照させる方法
-
この二つの違いは・・・?
-
ウインドウサイズを変更しても...
-
アプリケーションのデザイン
-
VB6,リストボックスの特定行の...
-
最前面に無理やりフォームを持...
-
TextBoxに文字を書いても表示さ...
-
VB.netでのライン描画方法がわ...
-
OpenOffice Calcで株価チャート...
-
MFCでOnPaintのタイミング
-
ドローソフトのダブルバッファ...
-
CS_HREDRAW|CS_VREDRAWについて
-
ClistBoxでオーナードローがよ...
-
扇形などを描く方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
TextBoxに文字を書いても表示さ...
-
word
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
InvalidateRectの使い方について
-
OneNote 2010 文字と描画がずれる
-
StretchBlt関数について
-
C# ラバーバンドの描画を快適に...
-
エクセルでガンチャートを作成...
-
C++にて、塗りつぶされた円を描...
-
VBAにGDI+を参照させる方法
-
GDI+で高速な描画
-
MFC DrawText 背景色とフォント
-
FlexGridの一部のみ表示を更新...
-
MFCのタイマーのつかい方を教え...
-
Labelの文字をスクロールする際...
おすすめ情報