• 締切済み

ゲームプログラミングで

VC++ 2008でwin32apiを使ってゲームをつくっているのですが キャラクタのキー入力に対する描画が上手くいきません。 キー入力の際にX座標に移動ピクセル量を加算しているのですが WM_PAINTメッセージ内のInvalidateRectが実行された際に 現座標から加算後のX座標にキャラクタが飛んでしまいます。 加算後のX座標までの過程も描画したいんです。 いろいろ試したのですがいい案が浮かびませんでした。 できれば歩行中のように足踏みしながら移動させたいので どこかにアクションゲームのソースコードがあるサイトなど ありましたら教えてください。

みんなの回答

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

ついでに… [技術者向] コンピューター > プログラミング > C&C++ のカテの方がよいかと思われます。 # アドベンチャー向けのスクリプトシステムで疑似シューティングなんか作ってみたことも。かなり無理があった…。

flicker
質問者

お礼

すみません、カテのアドバイスまで有り難うございます。 WM_PAINT内にInvalidateRectは記述しませんね(笑)。 書き間違えてしまいました。すみません。 書籍の紹介有り難うございます。 「アクションゲームプログラミング」は売ってなかったので、 評判がよくゲームプログラミングの基本となるシューティングゲーム について書かれた同シリーズ「シューティングゲームプログラミング」を 早速購入してきました。 これでビットマップの描画や当たり判定など勉強していこうと思います。 ご丁寧に有り難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>キー入力の際にX座標に移動ピクセル量を加算しているのですが >WM_PAINTメッセージ内のInvalidateRectが実行された際に >現座標から加算後のX座標にキャラクタが飛んでしまいます。 WM_PAINTでInvalidateRectするのは間違っていませんか? >加算後のX座標までの過程も描画したいんです。 >いろいろ試したのですがいい案が浮かびませんでした。 メッセージの遅延や、描画に掛かる時間を無視するとして… 秒間60フレームとして、1秒間の移動距離を60で割って、 SetTimer()で33msのタイマーを設定。(分解能は適宜設定を) WM_TIMERで算出した移動距離を座標に加減算、InvalidateRect()で無効領域を設定して、次のタイマーに備える。 WM_PAINTで描画。 とか…… # かなり大ざっぱなのでコレでは使えないと思いますが。メッセージ遅延するし。 >どこかにアクションゲームのソースコードがあるサイトなど >ありましたら教えてください。 サイトではなく、本ですが… http://www.google.co.jp/search?hl=ja&source=hp&q=%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=&aq=f&oq= 他にもゲームプログラミング系の書籍はあるでしょう。 ダブルバッファリング使ったり、マルチスレッドにしたりしないと使い物にならないでしょう。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • クライアント領域を再描画させない方法

    クライアント領域で左クリックを押したままマウスを移動させた時の処理 (WM_MOUSMOVE)として、マウスの位置情報を、 InvalidateRect(hWnd, NULL, FALSE); でWM_PAINTに送り、WM_PAINTで描画処理をさせます。 右クリックでの処理として、 case WM_RBUTTONDOWN:    InvalidateRect(NULL, NULL, TRUE);    return 0; とした時、WM_PAINTでは 右クリックによるWM_PAINTでは、クライアント領域を 再描画させない様にしたいのですが、 どのようにしたら良いのでしょうか? クライアント領域に描画されたのを再描画させないことで、 消したいのです。 MS VC++ & Win98 の環境で作成しています。

  • Win32APIを使って入力されたキーによって表示する画像を変えるプログラムについて

    Win32APIを使って入力されたキーによって表示する画像を変えるプログラムを今、VisualSutudio2005のVC++で作っている最中なのですが、 上手く画像が表示されず困っています。具体的には、キーボードからキーが入力されたらTranslateMessage関数でWM_CHARメッセージを送って、その値(wParam)をWM_CHARメッセージ内でTCHAR型の変数に代入し、InvalidateRect関数を使ってWM_PAINTメッセージを送って、再描画処理を行ってその中で、if(tchar == 'a') { hbitmap = (HBITMAP)LoadImage(NULL,BMP,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); SelectObject(hMemdc,hbitmap); GetObject(hbitmap,sizeof(BITMAP),&bitmap); BitBlt(painthdc,0,0,350,467,hMemdc,0,0,SRCCOPY); } という処理をしてaが入力されたら読み込んだ画像を表示!という形にしたいのですが、実際ウィンドウには表示されなくて悩んでいます。わかりにくくて誠に申し訳ありませんが、どなたかどうかご教授願えないでしょうか。何卒よろしくお願い致します。

  • ゲームプログラミング クラス構造について

    現在、ソフトウェアエンジニアめざしてプログラミング勉強中の者です。 とりあえず、"The C Programing Language"(Kernighan&Ritchie) をようやく読み終え、最近C++の勉強を始めました。 そこで! 楽しくオブジェクト指向を身につけようと、簡単なゲームプログムを作りながら勉強する事にしたのですが、例えばマリオのような横スクロールアクションゲームの場合、どのようにオブジェクトを分類したら良いのでしょう? たとえば、どのような基底クラスを作り、そこからどのような派生クラスを作ったら良いのでしょうか? かんたんな構成の用な物を作っていただけるとうれしいです。 (例) キャラクター(X,Y座標が常に変化し動きまわる)  主役(ボタン操作によってX,Y座標が変化)   敵(プレイヤーのボタン操作とは関係なく動き回る) Action  重力(キャラクターX,Y座標にy方向加速度をくわえる)  MAP  床(重力によりキャラクターが下へ行き過ぎないようよう、Y座標の移動制限を制限)   ブロック 例は適当に作った物ですが、こんな感じにキャラクターのX,Y座標は重力などに対してPrivate:にするべきなのか?などもかいてあるとうれしいです^^

  • 文字のちらつきを抑えるには

    VisualStudio2005でAPIをを使ってマウスの位置を表示するソフトを作っています。WM_MOUSEMOVEメッセージがきたら位置を取得して、InvalidateRect関数を使って再描画しています。再描画する際に文字のちらつきが気になります。HPを調べたりいろいろやってみたのですが、ちらつきを起こす原因と対処法(ダブルバッファリング)の大まかな部分しか分かりませんでした。もし、参考になるサイトや詳しい方がいらっしゃったらご教授ください。※MFCは使っていません。

  • キーリピート?(Javaプログラミング)

    こんにちは。 Javaの基礎を一通り勉強したので、簡単なゲームでも作ってみようと思ったのですが、早速問題にぶつかってしまいました。 キーを入力して左右にキャラを移動させたいのですが、 キーを押し続けると最初の1歩はすぐに移動してくれるのですが、 そのあとワンテンポ遅れてから、「ズダダダダダ」ってな感じ?で動いてしまいます。 調べてみたら、キーリピートというのが問題になっていることは分かったのですが、 どうすれば普通のゲームのように動いてくれるのでしょうか? 今はまだ下のような感じなんですが・・・。(右に動くとき) public void keyPressed(KeyEvent e) {   if(e.getKeyCode() == e.VK_RIGHT){     muki = 1; // キャラの向き     px += 10; // キャラのx座標   } } よろしくお願いします。

    • ベストアンサー
    • Java
  • Win32 APIを使ったWindowsプログラミング製作について質問です

    只今、VisualStudio2005のVC++でWin32 APIを使ってWindowsアプリケーション製作の練習をしています。今、ドラゴンクエストIのようなゲームを作りたいと思っており、画面に画像を表示し、キーボードの十字キーで操作できるようにしていますが、ここまでやっていて一つ不思議に思ったことがあります。それは、画像の読み込みや表示・キーボードの入力などすべてをウィンドウプロシージャ内にコーディングしています。WinMain()関数内には、ウィンドウの登録・生成・表示という当たり前の処理しかありません。これから、戦闘の処理なども加えていきますが、それを考えてもWM_PAINTやWM_KEYDOWNなどのメッセージ内で事足りるような気がします。アプリの製作の経験はほとんどない初心者なので、C言語みたいにMain()関数内にほとんど処理を記述しないのが不安に思います。自分の書き方は間違っているのかどうなのか、何か参考になる意見をいただけないでしょうか?どうかよろしくお願い致します。

  • XNAでのゲーム制作で困っています

    2Dゲームの衝突判定なのですが、 キャラクターサイズの半分がめり込んだ形になってしまいます。 原因は基準座標点の取る位置です。 キャラクターは中心で、マップチップは左上になっており、今いる座標をマップサイズで割ったとしてもずれが生じるみたいです。 キャラクターが中心なのは、敵との衝突判定をやりやすくするためです。 補正をかけたとしても直りそうにないのですが、何かアイディアはありませんか? マップ描画の基準座標が中心になるように設定できればいいのか、 若しくは別の方法があればご教授お願いします。

  • タイトルバーに画像を貼り付ける。&閉じるボタンを左側に移動できるか?

    VC++で作っています。 タイトルバーのデザインをいろいろ変更したいと思っています。 具体的にいうと、 タイトルバーの背景(青色の部分)に画像を貼り付けたりできるのでしょうか? 縮小ボタンとか閉じるボタンをマックみたいに左側に移動できるでしょうか? アイコンを非表示にすることができるでしょうか? などです。 もし無理な場合は、WM_PAINTなどでタイトルバーらしき絵を描画して、ある座標をクリックしたら、”閉じるボタン”などと同じような動作をするように作ろうかなと思っているのですが、これは非効率的でしょうか? どんなことでもいいので、どなたかよろしくおねがいします。

  • エディットでEnterキーでのTAB移動

    Win32APIを使ってプログラミングしています。 通常はTABでフォーカスを移動するのが良いと思うのですが、Enterキーで移動させたいと思います。 ところが、一行のエディットだとEnterキーを押すとビープ音が鳴ってしまいます。 フォーカス移動はできるのですが、ビープ音を鳴らないようにするにはどうすればいいのでしょう? 多分WM_KEYDOWNかWM_KEYUP、WM_CHARのどれかで書けばいいと思ってるんですが… よろしくお願いします。

  • Windows API ペンを作るタイミング

    ゲームのプログラミングをしています。 テキストのサンプルプログラムではペンやブラシをWM_CREATEの中で hPen[1] = CreatePen(PS_SOLID, 2, RGB(50,70,0));    :    : のような感じで生成して WM_PAINT内でSelectObject(hdc, hPen[i]); として使っているのですが 自分のプログラムはPaintという関数を使っています。 その場合Paint(~)にそれらの配列を渡す形で良いのでしょうか? 一応今はそれで動いてます。 ただ描画の処理は1つの関数にまとめると書いてあったので Paint内で生成&削除をした方がよいのかとも思いまして・・・ どっちが一般的なのか、どういう場合はどうすればいいのかっていうのが 経験がなくて全然わからないので教えて欲しいです。 一応落ち物ゲームやシューティングゲームを想定してます。