C言語とC++の Dx を使ってゲームを作ろうとしました。
そこで VisualStudio_2019用.slnを2019年版から開いて、**https://bituse.info/game/21**を実行してうまくいきました。そこで背景に意図した画像を入れるために二つのサイトのプログラムを使おうとしたのですが、組み込み方がわかりません。
一つ目のプログラムは同じDXのプログラムです。
**http://shumat.toypark.in/progtext/action_04.html **の
// 背景の画像を読み込む int imgBack = LoadGraph( "media/back_01.png" );
です。
もう一つは載せましたプログラムに加えた
LoadGraphScreen(0,0, "ステージ.bmp", FALSE);
LoadGraphScreen(0,0, "charall.png", TRUE);
です。どちらかのプログラムを入れたいのですが、大丈夫であろう部分に組み込んでも影響してくれません。
できればなぜそのように組み込めるのかの理由を添えて以上の二つを組み込む方法を教えてほしいです。
二つ目はOPENCVのプログラムなのですが、もし**http://taishoh-lab.net/?p=337**のプログラムを**https://bituse.info/game/21**に組み込むとしたらどのようにすればいいでしょうか?
一つ目と二つ目に関して、なぜそのように組み込もうと考えたのか過程の考えを詳しく教えてください。また、どのように基礎のC++を勉強して、二つ目の解答を考え付いたのか教えてください。
以下は今回使わせて頂いたプログラムです。
#include "DxLib.h" // プログラムは WinMain から始まります int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } //キー取得用配列 char key[256]; //x座標 int x = 100, y = 240; //グラフィックハンドル格納用配列 int gh[12]; //画像読み込み LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh); //移動係数 float move = 1.0f; //横方向と縦方向のカウント数。 int xcount = 0, ycount = 0; //添字用変数 int ix = 0, iy = 0, result = 0; while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll(key) == 0) { if (key[KEY_INPUT_LEFT] == 1 || key[KEY_INPUT_RIGHT] == 1) { if (key[KEY_INPUT_UP] == 1 || key[KEY_INPUT_DOWN] == 1) { //移動係数を0.71に設定 move = 0.71f; } else { //斜めじゃなければ1.0に設定 move = 1.0f; } } else if (key[KEY_INPUT_UP] == 1 || key[KEY_INPUT_DOWN] == 1) { move = 1.0f; } if (key[KEY_INPUT_LEFT] == 1) { x -= (int)4 * move; } if (key[KEY_INPUT_RIGHT] == 1) { x += (int)4 * move; } if (key[KEY_INPUT_UP] == 1) { y -= (int)4 * move; } if (key[KEY_INPUT_DOWN] == 1) { y += (int)4 * move; } //左キーが押されてて、かつxcountが0以上なら0にしてから1引く。 //それ以外は1引く if (key[KEY_INPUT_LEFT] == 1) { if (xcount > 0) xcount = 0; --xcount; } //右キーが押されてて、かつxcountが0以下なら0にしてから1足す。 //それ以外は1引く if (key[KEY_INPUT_RIGHT] == 1) { if (xcount < 0) xcount = 0; ++xcount; } //上キーが押されてて、かつycountが0以上なら0にしてから1引く。 //それ以外は1引く if (key[KEY_INPUT_UP] == 1) { if (ycount > 0) ycount = 0; --ycount; } //下キーが押されてて、かつycountが0以下なら0にしてから1足す。 //それ以外は1足す if (key[KEY_INPUT_DOWN] == 1) { if (ycount < 0) ycount = 0; ++ycount; } //カウント数から添字を求める。 ix = abs(xcount) % 30 / 10; iy = abs(ycount) % 30 / 10; //xカウントがプラスなら右向きなので2行目の先頭添字番号を足す。 if (xcount > 0) { ix += 3; result = ix; } else if (xcount < 0) { //マイナスなら左向きなので、4行目の先頭添字番号を足す。 ix += 9; result = ix; } //yカウントがプラスなら下向きなので、3行目の先頭添字番号を足す。 if (ycount > 0) { iy += 6; result = iy; } else if (ycount < 0) { //1行目の先頭添字番号は0なので何もする必要なし。(分かりやすくするために書いときました) iy += 0; result = iy; } //斜め移動の場合は横顔を優先 if (move == 0.71f) result = ix; //描画 DrawGraph(x, y, gh[result], TRUE); //押されてなければカウントをゼロにする。 if (key[KEY_INPUT_LEFT] != 1 && key[KEY_INPUT_RIGHT] != 1) { xcount = 0; } if (key[KEY_INPUT_UP] != 1 && key[KEY_INPUT_DOWN] != 1) { ycount = 0; } if (key[KEY_INPUT_ESCAPE] == 1) { break; } } LoadGraphScreen(0,0, "ステージ.bmp", FALSE); LoadGraphScreen(0,0, "charall.png", TRUE); DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
以下のように直したところ画像は表示されるのですが、キャラが登場せず、移動キーを押すとキャラが動いて現れると同時に画像が消えてしまいます。これはループ関数などを使えば解決できるのでしょうか?
//キー取得用配列 char key[256]; //x座標 int x = 300, y = 240; //グラフィックハンドル格納用配列 int gh[12]; //画像読み込み LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh); LoadGraphScreen(0, 0, "back.bmp", FALSE);
編集、キャラの描画の前に組み込んでみたのですが、背景が前に出てしまいうまくいきません。
#include "DxLib.h" // プログラムは WinMain から始まります int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(true); // ウィンドウモードにする SetGraphMode(1000, 1480, 32); // ウィンドウの大きさを指定 if (DxLib_Init() == -1) // DXライブラリ初期化処理 { ChangeWindowMode(TRUE); return -1; // エラーが起きたら直ちに終了 } int imgBack = LoadGraph("back.bmp"); while (!ProcessMessage()) { // 画面をクリア ClearDrawScreen(); // 背景の画像を描画 DrawGraph(0, 0, imgBack, false); // 画面に出力 ScreenFlip(); } //キー取得用配列 char key[256]; //x座標 int x = 300, y = 240; //グラフィックハンドル格納用配列 int gh[12]; //画像読み込み LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh); // 背景の画像を読み込む //LoadGraphScreen(0, 0, "charall.png", TRUE); WaitKey(); // 結果を見るためにキー待ち(『WaitKey』を使用) //移動係数 float move = 1.0f; //横方向と縦方向のカウント数。 int xcount = 0, ycount = 0; //添字用変数 int ix = 0, iy = 0, result = 0; while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll(key) == 0) { if (key[KEY_INPUT_LEFT] == 1 || key[KEY_INPUT_RIGHT] == 1) { if (key[KEY_INPUT_UP] == 1 || key[KEY_INPUT_DOWN] == 1) { //移動係数を0.71に設定 move = 0.71f; } else { //斜めじゃなければ1.0に設定 move = 1.0f; } } else if (key[KEY_INPUT_UP] == 1 || key[KEY_INPUT_DOWN] == 1) { move = 1.0f; } if (key[KEY_INPUT_LEFT] == 1) { x -= (int)4 * move; } if (key[KEY_INPUT_RIGHT] == 1) { x += (int)4 * move; } if (key[KEY_INPUT_UP] == 1) { y -= (int)4 * move; } if (key[KEY_INPUT_DOWN] == 1) { y += (int)4 * move; } //左キーが押されてて、かつxcountが0以上なら0にしてから1引く。 //それ以外は1引く if (key[KEY_INPUT_LEFT] == 1) { if (xcount > 0) xcount = 0; --xcount; } //右キーが押されてて、かつxcountが0以下なら0にしてから1足す。 //それ以外は1引く if (key[KEY_INPUT_RIGHT] == 1) { if (xcount < 0) xcount = 0; ++xcount; } //上キーが押されてて、かつycountが0以上なら0にしてから1引く。 //それ以外は1引く if (key[KEY_INPUT_UP] == 1) { if (ycount > 0) ycount = 0; --ycount; } //下キーが押されてて、かつycountが0以下なら0にしてから1足す。 //それ以外は1足す if (key[KEY_INPUT_DOWN] == 1) { if (ycount < 0) ycount = 0; ++ycount; } //カウント数から添字を求める。 ix = abs(xcount) % 30 / 10; iy = abs(ycount) % 30 / 10; //xカウントがプラスなら右向きなので2行目の先頭添字番号を足す。 if (xcount > 0) { ix += 3; result = ix; } else if (xcount < 0) { //マイナスなら左向きなので、4行目の先頭添字番号を足す。 ix += 9; result = ix; } //yカウントがプラスなら下向きなので、3行目の先頭添字番号を足す。 if (ycount > 0) { iy += 6; result = iy; } else if (ycount < 0) { //1行目の先頭添字番号は0なので何もする必要なし。(分かりやすくするために書いときました) iy += 0; result = iy; } //斜め移動の場合は横顔を優先 if (move == 0.71f) result = ix; //描画 DrawGraph(x, y, gh[result], TRUE); //押されてなければカウントをゼロにする。 if (key[KEY_INPUT_LEFT] != 1 && key[KEY_INPUT_RIGHT] != 1) { xcount = 0; } if (key[KEY_INPUT_UP] != 1 && key[KEY_INPUT_DOWN] != 1) { ycount = 0; } if (key[KEY_INPUT_ESCAPE] == 1) { break; } } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
回答1件
あなたの回答
tips
プレビュー