質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

3889閲覧

バックに画像を入れたいです

METALBOLL616

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2019/08/03 15:16

編集2019/08/04 11:21

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; // ソフトの終了 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/08/03 18:22

なぜゲーム終了時に LoadGraphScreen をしているのでしょう. 背景にするならゲーム開始時に表示しないといけないのではないでしょうか.
METALBOLL616

2019/08/04 03:57

ありがとうございます。もう一度見直してみます。
guest

回答1

0

ベストアンサー

最初のプログラムはループで、
(1) 画面を消去
(2) キー入力によりキャラの向きと位置を決定
(3) キャラを描画

と言うことを繰り返しています。

これに背景をつけたければ、(1)の後に(キャラを描画する前に)背景を描画しなければなりません。

投稿2019/08/04 08:35

Bull

総合スコア986

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

METALBOLL616

2019/08/04 11:17

やってみます!ありがとうございます。
Bull

2019/08/05 02:31 編集

ソースコードを追記したんですね、気づきませんでした。 回答の意図が伝わっていなかったようで、ループを新たに追加しても意味はないですよね。 背景の描画はキャラを移動させているループの中に入れないと意味ないですね。つまり、 (1) 画面を消去 (2) 背景を描画 (3) キー入力によりキャラの向きと位置を決定 (4) キャラを描画 こうすれば良いんじゃないかと思います。 (2) 以外は元々のソースコードにありますので、(2) を追加するだけで良いんじゃないかと思います。
METALBOLL616

2019/08/05 03:22

なんとか自己解決できました。ですが、アドバイスをありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問