• ベストアンサー

DXライブラリについて(ゲームプログラミング)

今までVisualC++.netでWinAPIを使ってアクションゲームを 作っていたのですが、最近DXライブラリを使い出しました。 今までは一定時間ごとにメインループとは別に自動的に行われる 処理はウィンドウプロシージャでSetTimerして case WM_TIMER:に処理を書くことで実現していたのですが、 DXライブラリの場合それにあたる機能はあるのでしょうか。 たとえばメインループとは別に1秒おきにある変数をTRUEにしたり FALSEにしたりしたい場合、ウィンドウプロシージャでやるしかないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • aho0xff
  • ベストアンサー率12% (218/1772)
回答No.3

再度です。 流石にそこから先は、自分で考えてみてください。 どうやら私の認識違いも大きいようなので・・・・ 私自身DirectXを使ったゲームの開発経験はありますが、DXライブラリ自体は 使ったことが無いので・・・・だから「経験者」の意味合いも、たぶん質問者様と ズレがあるはずです。 一通り「DXライブラリ」のページを見ましたが、サンプルプログラムを全て見ていけば 解決できる問題のはずです。 全てのサンプルをまずは実行し、よーく見てください。移動とありますが、移動と、アニメーションの 計算を先にやってから、後でまとめて描画すれば、まあ解決できるはずです。 ・・・もしくは // 裏画面の内容を表画面にコピーする ScreenFlip() ; // Windows 特有の面倒な処理をDXライブラリにやらせる ProcessMessage() ; この2つをループ中に書くだけである程度は解決できるかも知れません。 まあ別の問題が出たらその時は、実際この2つで何をやっているかを調べればいいでしょう。 ソースも公開しているみたいですし・・・・

参考URL:
http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html
amazontester
質問者

お礼

たびたびの解答ありがとうございます。 参考になりそうなサンプルまで見つけていただいて・・。 一応ダブルバッファリングは既にしていたのですが、 キー入力の同期とか課題がまだまだ多いです・・。 これをもとにがんばってみます。ありがとうございました!

その他の回答 (2)

  • aho0xff
  • ベストアンサー率12% (218/1772)
回答No.2

再度、No1です。お礼について再度回答します。 while (1){  タイム計測    ↓  足踏み用の変数の値を入れ替え    ↓  描画(足踏み変数を判定して左右のキャラを描画)    ↓  while (時間が前回計測時から1秒経過するまでループ){   if (キー入力() == TRUE ){break;}  } } の部分の while (1){ と  while (時間が前回計測時から1秒経過するまでループ){   if (キー入力() == TRUE ){break;} がいらない気がするんですよね。つまり  タイム計測    ↓  足踏み用の変数の値を入れ替え    ↓  描画(足踏み変数を判定して左右のキャラを描画) コレだけで十分かと・・・言い方正しいかは分かりませんが、基本的にゲームの描画とかアニメーションって その時その時、瞬間の状態が描画できれば、まあ大体うまくいけます。そもそもゲームループって 1秒間に何回も実行しますよね??だから1回のループだけならコレで十分です。 後だんだん分かってくるとは思いますが、基本的に「描画」ってのは重い処理です。 質問者様の考えている、「キャラのアニメーションにあわせて描画」はありと言えばありですが、 キャラが10、20と増えるにしたがって必然的に追いつかなくなります。 なのでアニメーションの多さや、アクションが多いゲームで、その考え方はあまりオススメしません。 変に待ったりしないで、その瞬間が描画できれば良しとした方がいいです。

amazontester
質問者

補足

すみません、アクションとは言いましたがどちらかというと RPGに近いのかもしれません。キャラの動きに合わせて 描画するのではなく時間に合わせてキャラが描画されるといった 感じです。雰囲気としてはFFやドラクエの勇者や村人の 足踏みみたいな感じです。 ですのでキャラが増えても問題は無いタイプです。 その為while(1)はそれ自体がゲームループです。 後、  タイム計測    ↓  足踏み用の変数の値を入れ替え    ↓  描画(足踏み変数を判定して左右のキャラを描画) この仕様にした場合キー入力とかの判定がその場でできなくないですか? キー入力があったらすぐに一歩移動したグラフィックを描画しないといけないので。。

  • aho0xff
  • ベストアンサー率12% (218/1772)
回答No.1

「DXライブラリ」で検索すると、そのままの名前のフリーライブラリがヒットしちゃうんですよね。 それのことを指しているのか、DirevtXそのものを指しているのかいまいち分かりませんので >DXライブラリの場合それにあたる機能はあるのでしょうか コレに関しては保留で。まあ「DXライブラリ」はウインドウプロシージャ周りはかなり内包されているみたいですね。 DirevtXには、その手の機能は無かったはずです。 >たとえばメインループとは別に1秒おきにある変数をTRUEにしたり >FALSEにしたりしたい場合、ウィンドウプロシージャでやるしかないのでしょうか? コレは私なら、そのつどそのつど時間を取得してその時の時間で計算しなおしますけどね。 無理にそういう実装にする必要も無いかと・・・

amazontester
質問者

お礼

回答ありがとうございます。私が言っているのは DirectXでなくDXライブラリです。 そのつど時間を取得するやり方は私も考えたのですが、 例えばキャラが1秒おきに自動的に足踏みをするように したいのですが、 while (1){  タイム計測    ↓  足踏み用の変数の値を入れ替え    ↓  描画(足踏み変数を判定して左右のキャラを描画)    ↓  while (時間が前回計測時から1秒経過するまでループ){   if (キー入力() == TRUE ){break;}  } } *但しキー入力は入力が無ければスルーされる と、こんな感じに作ったのですが、while文をノーウェイト で回しているためCPUに激しい負荷がかかります。 かといってSleepなどでとめると止めている間キー入力に 反応できなくなってしまうので、私としては 1秒おきに足踏み変数を入れ替えて自動的に再描画させる サブループとキー入力があるまで何もしないメインループ とを分離したかったのですが、何か解決策は無いものでしょうか・・?

関連するQ&A

  • じゃんけんゲーム(DXライブラリ使用)

    今大学の授業で簡単なゲームのプログラミングを習っているのですが、『じゃんけんゲーム』で詰まってしまったのでお力を借りたいです。 使用しているソフトは『Microsoft Visual C++ 6.0』と『DXライブラリ』です。 授業を聞く限り、多分C++で書いた物をDXライブラリで起こしているような感じなんですができないです。 じゃんけんゲームで最低の条件として 1:画像を画面に表示し、キーで操作できる。 2:ループの処理。 3:勝ち負けの判定。 4:CPUの処理。 となっています。 できれば、『DXライブラリ』で動く方式でプログラム自体を教えてほしいです。 それに、要所要所での解説などをお願いします。

  • DXライブラリを使用した画像表示について

    ゲームプログラミングを始めたいと考えている初心者です。 Borland C++ 5.5.1,BCC Developer,DXライブラリを使用しています。 下記のプログラムをメイクして実行すると、ウィンドウは表示されるのですが、画像が表示されません。画像の保存場所はプロジェクトの中のDebugフォルダです。どんな原因が考えられるでしょうか?ウィンドウは表示されていて実行できているのでプログラムの記述の問題ではないと考えます。 使用しているOSがMeです。Meではできないのでしょうか? お詳しい方、ぜひご回答お願いします。 ---------------------------------------------------------------- #include "DxLib.h" // プログラムは WinMain から始まります int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; // ウインドウモードに変更 if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1 ; // エラーが起きたら直ちに終了 } /*--ここから下に処理を記述--*/ LoadGraphScreen( 0 , 0 , "char.png" , TRUE ) ; /*--ここまでが処理--*/ WaitKey() ; // キー入力待ち DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

  • DXライブラリでの画像表示

    ゲームプログラミング初心者です。 DXライブラリを用いて画像を表示させようと以下のプログラムを組んで実行してみたのですが、ウィンドウは表示されるのに画像が表示されません。 使用しているのはBorland C++ 5.5.,BCC Developer,DXライブラリです。 ちゃんと画像もプロジェクトファイルの中に入っていると思います。 OSはwindows8です。 考えられる原因を教えてもらえないでしょうか。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(TRUE); if( DxLib_Init() == -1 ) { return -1; } LoadGraphScreen(0,0,"image.png",TRUE); WaitKey(); DxLib_End(); return 0; }

  • SetTimer関数について。

    プログラム初心者です。質問させてください! 現在私はWin32APIを用いて、簡単なプログラムを作成しています。 そこで例えばイベントAが起きた10秒後にあるアクション(1)をさせたくて、 WM_イベントAの時: SetTimer(hWnd,ID_MYTIMER1, 10000, NULL); というようにプログラムを書きました。 そのSetTimer関数が実行されることより、 WM_TIMER:イベントが発生するので、WM_TIMER:イベントのところにあるアクション(1)をさせるプログラムを書きました。 しかし、イベントAが起きた100秒後には、あるアクション(1)とは違うあるアクション(2)をさせたいのですが、 この場合、WM_イベントAが起きたときに、 SetTimer(hWnd,ID_MYTIMER1, 10000, NULL); SetTimer(hWnd,ID_MYTIMER2, 100000, NULL); のようにプログラムをかいてしまうと、 二つともWM_TIMERイベントがおこるので、 あるアクション(1)も(2)も100秒後には実行されてしまいます。 100秒後にはアクション(1)はおこらず、アクション(2)だけおこる。 10秒後にはアクション(2)はおこらず、アクション(1)だけおこる。 このようにするには、どのようにすればいいのでしょうか? アドバイスよろしくお願いいたします。

  • WinAPIにてWM_SIZE以外の方法で最大化を検出したい

    環境:WinXP, VS2005 WinAPIでウィンドウプロシージャのWM_SIZEメッセージを使えば 最大化状態などウィンドウの状態を調べることができますが、 プロシージャを直接使わないでするような方法はあるのでしょうか?

  • VC6.0++でDXライブラリが上手くいかない!

    Windows10で家に昔買った VC6.0++があったのでインストールして DXライブラリのプログラムコードを入力して 実行してみたのですが、 VC6.0++上のビルドでは画像を表示するプログラムなら画像が表示されるし 音を鳴らすプログラムなら音がなるんですが、 作成したexeファイルを実行した場合、プログラムが実行されません なぜでしょうか? 何が悪いのでしょうか? 教えてくださいよろしくお願いします。

  • VC++ のマウス入力

    visual c++のAPIでアクションゲームをつくっていてアクションはWM_TIMERに50ミリ秒に設定しておいています。マウスも使いたいのでWM_LBUTTONDOWNで左クリックが押されたフラグを立てるようにしたのですが効かない時があります。 WM_TIMERの処理の最後にフラグをfalseにするようにしています。 WM_LBUTTONDOWNの代わりにWM_TIMERでGetKeyStateでフラグをたてるとちゃんと動きます。 どうすればマウスがちゃんと効くようにできますか? よろしくお願いします。 

  • メッセージ機構とマルチスレッド

    windowsのメッセージは、元のスレッドと関係なしに勝手に実行されますよね? たとえばSetTimerを呼びだした状態でウィンドウプロシージャ内で case WM_TIMER:    MessageBox(NULL,"","",MB_OK);    break; とすれば、メッセージボックスを閉じようが、閉じまいが一定時間ごとに、新たにメッセージボックスが生成されます。 しかし、Win32の本などを見ると、プロシージャからただのグローバル変数にアクセスするなど、通常のマルチスレッドではやってはいけないとされる事を平気でやっています。 この点で、マルチスレッドとメッセージ機構はどのように違うのか、ご存知の方、教授お願いします。 ナンセンスな疑問でしたらすいません。

  • DXライブラリの、マウスを使ったゲームメニュー操作

    現在、ゲームでも作ってみようかな。という軽い気持ちでプログラミングをはじめました。 Cの入門サイトに一通り目を通したような状態です。 DXライブラリとC言語(C++ではない)を用いてちょこちょこやってるのですが、 スタート画面のNEW GAME! やら CONTINUE、とかの選択についてお聞きしたいのです。 私が今考えている方法は、マウスが【NEWGAME】という画像のある範囲に来たとき、 左クリックをすれば次の画面に移る。という物です。 その場合、画像のサイズを確認して30x30の画像なら、仮に120,150をスタート地点にした時、 150,180までの範囲内で左クリックされた時、という条件になります。 それでやろうかな。と思ったのですが、ふとHTMLを思い出しまして、 画像をクリックしたら別のページに飛ぶような動作があったような気がするのですが。 C言語、もしくはDXライブラリでこういったメニュー選択をする場合、この画像をクリックしたら、という指定はできるんでしょうか? また、メニュー画面を作るならそんなのより、こういう考えのがいいんじゃない? とか、 そういった事があったら聞かせてください。 よろしくお願いします。

  • TimerProc コールバック関数を利用する方法

    タイマを使いたくてメッセージマップでOnTimerを追加しましたが、 CWnd::SetTimerの第3パラメタに何を設定したらよいかわかりません。 lpfnTimer WM_TIMER メッセージを処理するためのアプリケーションが用意した、 TimerProc コールバック関数のアドレスを指定します。 このパラメータが NULL の場合は、WM_TIMER メッセージはアプリケーションの メッセージ キューに置かれ、CWnd オブジェクトによって処理されます。 とあり、NULL指定のサンプルはあるのですが、 「TimerProcコールバック関数のアドレスを指定する法」を試したいのです。 関数のアドレスというのが何をいっているのか理解できないのですが 試しに void CXXXCtrl::method1() { SetTimer(timerID, 10000, &OnTimer); } void CXXXCtrl::OnTimer(UINT nIDEvent) { // 処理 COleControl::OnTimer(nIDEvent); } としたところ error C2276: '&' : 仮想関数のアドレスを取ろうとしました。 のエラーになってしまいます。

専門家に質問してみよう