• 締切済み

DirectXのDIK発進について

chie65535の回答

  • chie65535
  • ベストアンサー率44% (8569/19470)
回答No.4

>すごく解りやすい説明に少し感動致しましたが、まだまだ経験が浅く、上記の条件を満たすプログラムが想像できませんでした。(泣) 以下のプログラムをウィンドゥアプリケーションとしてコンパイルして実行して、キーを押したり離したりしてみて下さい。 //WM_KEYDOWN WM_KEYUPテストプログラム //全角スペースでインデントしてあるので、全角スペースを半角スペース2個に置換してからコンパイルすること #include <stdio.h> #include <windows.h> #define MY_WIN_WIDTH 400 #define MY_WIN_HEIGHT 90 //WM_KEYDOWN、WM_KEYUPイベントが来た時のwParamとlParamを保存して //おくグローバル変数。代入と参照がそれぞれ異なるイベントで行われる //ので、グローバル変数にしないとならない //代入タイミング:WM_KEYDOWN、WM_KEYUPイベント発生時 //参照タイミング:WM_PAINTイベント発生時 WPARAM KDwParam,KUwParam; LPARAM KDlParam,KUlParam; //ウィンドゥプローシジャコールバック関数のプロトタイプ宣言 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //文字を表示する関数のプロトタイプ宣言 void ShowText(HWND hWnd); //このプログラムのクラス名 char MyClassName[] = "WinClass"; //メインプログラム int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) {  HWND hWnd;  MSG msg;  WNDCLASS myProg;  //親のインスタンスが無いなら  if (!hPreInst) {   myProg.style =CS_HREDRAW | CS_VREDRAW;   myProg.lpfnWndProc =WndProc;   myProg.cbClsExtra =0;   myProg.cbWndExtra =0;   myProg.hInstance =hInstance;   myProg.hIcon =NULL;   myProg.hCursor =LoadCursor(NULL, IDC_ARROW);   myProg.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);   myProg.lpszMenuName =NULL;   myProg.lpszClassName =MyClassName;   //クラスを登録する   if (!RegisterClass(&myProg)) return FALSE;  }  //ウィンドゥを作成  hWnd = CreateWindow(MyClassName,   "WM_KEYDOWN WM_KEYUP TEST",   WS_OVERLAPPEDWINDOW,   CW_USEDEFAULT,   CW_USEDEFAULT,   MY_WIN_WIDTH,   MY_WIN_HEIGHT,   NULL,   NULL,   hInstance,   NULL);  //作成したウィンドゥを表示  ShowWindow(hWnd, nCmdShow);  //作成したウィンドゥに描画指示  UpdateWindow(hWnd);  //メッセージループ  while (GetMessage(&msg, NULL, 0, 0)) {   TranslateMessage(&msg);   DispatchMessage(&msg);  }  //終了コードをOSに返して終了  return (msg.wParam); } //文字を表示する関数 void ShowText(HWND hWnd) {  HDC hdc;  PAINTSTRUCT paint;  char buf[256];  //描画開始をウィンドゥに通知し、表示するデバイスコンテキストを取得  hdc = BeginPaint(hWnd, &paint);  //表示する文字列を作成  sprintf(buf,"WM_KEYDOWN:wParam=%3d lParam=0x%08x ",KDwParam,KDlParam);  //デバイスコンテキストに文字を表示  TextOut(hdc, 10, 10, (LPCSTR)buf, strlen(buf));  //表示する文字列を作成  sprintf(buf,"WM_KEYUP:wParam=%3d lParam=0x%08x ",KUwParam,KUlParam);  //デバイスコンテキストに文字を表示  TextOut(hdc, 10, 30, (LPCSTR)buf, strlen(buf));  //描画終了をウィンドゥに通知  EndPaint(hWnd, &paint);  return; } //ウィンドゥプローシジャコールバック関数 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {  switch (msg) {  //[X]ボタンで終了する時  case WM_DESTROY:   PostQuitMessage(0);   return (0L);  //キーが押し下げられた時  case WM_KEYDOWN:   KDwParam = wParam;   KDlParam = lParam;   InvalidateRect(hWnd, NULL, FALSE); //強制的にWM_PAINTを   UpdateWindow(hWnd); //発生させるためのオマジナイを2行   break;  //キーが離された時  case WM_KEYUP:   KUwParam = wParam;   KUlParam = lParam;   InvalidateRect(hWnd, NULL, FALSE); //強制的にWM_PAINTを   UpdateWindow(hWnd); //発生させるためのオマジナイを2行   break;  //ウィンドゥを描画する必要がある時  case WM_PAINT:   ShowText(hWnd);   return (0L);  default:   break;  }  //他のイベントはデフォルトの動作  return(DefWindowProc(hWnd, msg, wParam, lParam)); }

関連するQ&A

  • DirectInputについて

    C++でDirectinputの事なのですが。 デバッグには成功するのに、起動した後すぐ強制終了してしまいます。 VOID KeyCheck() { BYTE KeyState[256]; HRESULT hr; hr = g_lpDIDevice->GetDeviceState(256,KeyState); if (SUCCEEDED(hr)) { if (KeyState[DIK_LEFT]&0x80) muki=0; } else hr = g_lpDIDevice->Acquire(); } directxの勉強に簡単なものを書いてみようと思ったのですが、どの辺りがいけないのでしょうか?

  • Internet Explorerのキー入力受付

    お世話になります。 例えば、 googleのサイトを開いて、検索ワードを自動で打ち込むようなプログラムを作ろうとしているのですが、 googleを立ち上げ,keybd_event()で打ち込もうとしているのですが、 googleがキー入力を受け付け可能か否かが分からないため、上手くいきません。 キー入力の受付可能かどうかの判定の仕方を教えてください。

  • DirectX環境下での方向キー同時押しについて

    現在、DirectXでゲームを作っているのですが、上と右や下と左の方向キー同時押しを認識させたいのですがやり方がわかりません。 現在は、VK_UP,VK_DOWN,VK_LEFT,VK_RIGHTで4方向は認識できるのですが。右上,左上,右下,左下も含めた8方向を認識させたいのです。 やり方や方法がわかるサイトでもかまいませんのでお願いします。

  • キーイベントに関してなのですが・・・

    C#を使用しているんですが、テキストボックスをひとつ設置して、KeyDownイベントが発生した時に、同じキーが2度入力されたようにできませんか? aと入力したらテキストボックスにはaaと入力される感じです。 sendKeyメソッドを使用しようとしたら、大文字になってしまいます・・・ KeyCodeからキーボード判定はできたりしませんか? よろしければ教えてください><

  • DirectInputについて再

    前に回答してくださった方すみません。 directinputで、デバックに成功して実行してみるとすぐに強制終了してしまう問題なのですが。 VOID KeyCheck() { BYTE KeyState[256]; HRESULT hr; hr = g_lpDIDevice->GetDeviceState(256,KeyState); if (SUCCEEDED(hr)) { if (KeyState[DIK_LEFT]&0x80) muki=0; } } 強制終了が出なくなったのはこの処理が実行されていなかっただけらしく、まだおかしいみたいなんです。 hr = g_lpDIDevice->GetDeviceState(256,KeyState); この文辺りが怪しいと思って256をsizeof(KeyState)にしたりなどいろいろなサイトで違った方法を試したりなどしたのですが、解決しませんでした。 OSはVistaの32bitなのですが、どのようにすれば治るでしょうか?

  • DirectXのアクセラレータが突然利用できなくなりました

    昨日、普段できていたオンラインゲームが突然起動できなくなってしまったので、DirectX診断ツールにて異常を調べてみたところアクセラレータが全て「利用できません」となっており、右のボタンも「無効」と薄い灰色の文字になって押すことができない状態になっています。 試しにwindowsを再インストールして、DirectX9.0cと公式サイトからドライバをインストールしたのですがやはり同じ結果になっています。 下にシステム情報を記載してあります。 大変ご面倒をおかけしますが、対処法の分かる方はご返答をよろしくお願い致します。 ------------------ System Information ------------------ Time of this report: 9/3/2007, 15:52:46 Machine name: WWOJ95LMS8H9P87 Operating System: Windows XP Professional (5.1, Build 2600) Service Pack 1 (2600.xpsp1.020828-1920) Language: Japanese (Regional Setting: Japanese) System Manufacturer: ECS System Model: K7S5A BIOS: Version 1.00 Processor: AMD Athlon(tm) Processor, ~1.2GHz Memory: 512MB RAM Page File: 263MB used, 987MB available Windows Dir: C:\WINDOWS DirectX Version: DirectX 9.0c (4.09.0000.0904) DX Setup Parameters: Not found DxDiag Version: 5.03.0001.0904 32bit Unicode ------------ DxDiag Notes ------------ DirectX Files Tab: No problems found. Display Tab 1: No problems found. Direct3D functionality not available. You should verify that the driver is a final version from the hardware manufacturer. Sound Tab 1: The file sis7012.sys is not digitally signed, which means that it has not been tested by Microsoft's Windows Hardware Quality Labs (WHQL). You may be able to get a WHQL logo'd driver from the hardware manufacturer. Music Tab: No problems found. Input Tab: No problems found. Network Tab: No problems found. -------------------- DirectX Debug Levels -------------------- Direct3D: 0/4 (n/a) DirectDraw: 0/4 (retail) DirectInput: 0/5 (n/a) DirectMusic: 0/5 (n/a) DirectPlay: 0/9 (retail) DirectSound: 0/5 (retail) DirectShow: 0/6 (retail) --------------- Display Devices --------------- Card name: RADEON 9200 SERIES Manufacturer: ATI Technologies Inc. Chip type: RADEON 9250/9200 Series AGP (0x5964) DAC type: Internal DAC(400MHz) Device Key: Enum\PCI\VEN_1002&DEV_5964&SUBSYS_017018BC&REV_01 Display Memory: n/a Current Mode: 1280 x 1024 (32 bit) (60Hz) Monitor: Monitor Max Res: 1600,1200 Driver Name: ati2dvag.dll Driver Version: 6.14.0010.6614 (English) DDI Version: unknown Driver Attributes: Final Retail Driver Date/Size: 5/4/2006 01:51:00, 258048 bytes WHQL Logo'd: Yes WHQL Date Stamp: n/a VDD: Mini VDD: ati2mtag.sys Mini VDD Date: 5/4/2006 01:50:42, 1540608 bytes Device Identifier: {D7B71EE2-1A24-11CF-DA62-7A21A0C2CB35} Vendor ID: 0x1002 Device ID: 0x5964 SubSys ID: 0x017018BC Revision ID: 0x0001 Revision ID: 0x0001 Video Accel: Deinterlace Caps: n/a Registry: OK DDraw Status: Not Available D3D Status: Not Available AGP Status: Not Available DDraw Test Result: Not run D3D7 Test Result: Not run D3D8 Test Result: Not run D3D9 Test Result: Not run

  • プログラムからTera Termに文字を入力するには?

    初めて質問させていただきます。 Visual C++暦まだ2ヶ月の初心者が身の丈知らずかも知れない質問をすることをご容赦ください。 Tera Termを起動し、そこにmakeやCtrl-Cなどのキー入力情報を送るプログラムを作りたいと思っています。 具体的には、ダイアログベースのプログラムで、プッシュボタンをコマンド別にいくつか用意し、それらが押されると、Tera Termにキー入力があったと同じメッセージを送りたいのです。 例えば、[コンパイル]というボタンが押されたら、Tera Term上で"make"とキー入力したのと同じような処理をさせたいのです。 ここを含めいろいろなサイトを見て、起動まではなんとかできるようになりました。 ただ、起動したTera Termのハンドルの取得がうまくいかないのか、SendMessageでメッセージを送ろうとしても、::IsWindow(hWnd)というエラーが出て強制終了してしまいます。 ウィンドウにフォーカスを与えてkeybd_eventを用いると記述しているサイトもありましたが、フォーカスの与え方が分かりません……。 どなたか教えていただければ幸いです。お願いいたしますm(__)m

  • C#で壁の当たり判定と自キャラの移動で困っています

    初投稿です。C#のコンソールアプリケーションでゲーム作りをしているC#初心者です。 GraphicsExというフォームを作ってそこに壁を描画するところまではできたのですが、画像を自キャラとして動かせるとよいのですが、できないので今はとりあえず丸を描画して動かしています。 質問なのですが、自キャラを丸で描画して動かすと、壁の当たり判定が分からないので、キャラ(ただの丸ですが)が壁をすり抜けてしまいます。壁にぶつかった時にそれ以上進めないようにするために壁の当たり判定をどなたか教えてほしいです。 あとGraphicsを使っているからか、プログラムがおかしいのか分かりませんが(おそらく後者(汗)キャラの移動はキー入力でやっていて、数秒は意図した通りに移動できるのですが何故かキャラを移動しても、しなくても数秒後にフォームがとまってしまい動かなくなります。どのようにプログラムを記述をするとうまく自キャラの操作をできるのかも教えていただけるとすごく嬉しいです。 重ね重ね恐縮ですが、できればソース付でお願いします。 そもそも、コンソールアプリケーションでゲームを作るべきではない、DirectXを使うべきだ、とかあると加えてアドバイスほしいです。 (ウインドウズフォームもDirectXもあまり詳しくないですが。。。orz) 一応いままでのおおまかなプログラムを載せておきます。長文失礼しました。

  • 頭の中で自由に人体を動かし描けるようになりたい

    私の描く絵はほとんど漫画絵です。子供の頃から顔ばっかり描いてきたので、顔しか描けません。それでも、何だか平面的なかんじです。 デッサン力をつけよう!と思いいろいろ検索もしましたが行き詰ってます。 とにかくひたすら模写、という事で、あるサイトにあった方法、「ニッ○ンのカタログのモデルを模写する」を初めてみようと思いました。 しかし、これではいつまでたっても「模写した格好」しか描けませんよね?気付けば、模写したモデルの、腰に手をあてたポーズばかり上達してました・・・。 自分の思うままに描けるようになるためには、人体を立体的に意識でき、頭の中で自由に動かせなければ意味が無いんだと思うのです。 しかし!これがさっぱりなのです!よく紹介されてるサイト↓ ttp://www.asahi-net.or.jp/~zm5s-nkmr/ も拝見したのですが、私には高度すぎるのかさっぱり理解できませんでした・・・・。 立体を意識するためにはどうしたら良いのでしょうか? 紙の上の人物じゃなく、生身の人間をデッサンできれば良いのでしょうがなかなか容易なことではありません。 3Dとしてイメージする、それを紙におこせるようになる・・・・そうなりたいのですが、何からはじめてよいものか途方に暮れています。 出来れば、順を追って修行できるようなサイトか本などあれば良いのですが。Aが上達したら、B、次はC・・・というかんじで、全てやり終えたころにはばっちり! ・・・そんな都合の良いものは無いですかね?

  • スムーズに動かすにはどうしたらいいでしょうか?

    ここで教えて頂いたサイトでJavaScriptを勉強していたら、なんと私が今困っている問題そのものにぶつかり、驚きです! http://www.openspc2.org/reibun/javascript/move/018/index.html ここで紹介してあるサンプルなんですが、動きがカクカクしています! これをスムーズにさせたいのですが、どうすればよろしいでしょうか? <html> <head> <title>キャラクタをキー入力に応じて上下左右に動かす</title> <script Language="JavaScript"><!-- x = 50; y = 100; function moveChar() { kc = event.keyCode; c = String.fromCharCode(kc); if (c == "A") x = x -2; if (c == "D") x = x +2; if (c == "W") y = y -2; if (c == "X") y = y +2; document.images["myChar"].style.left = x; document.images["myChar"].style.top = y; } // --></script> </head> <body onKeydown="moveChar()"> <img src="char.gif" name="myChar" style="position:absolute;left:50px;top:100px;"> </body> </html>