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

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

ただいまの
回答率

87.37%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,474

score 7

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


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/08/04 03:22

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

    キャンセル

  • METALBOLL616

    2019/08/04 12:57

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/04 20:17

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

    キャンセル

  • 2019/08/05 11:30 編集

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

    (2) 以外は元々のソースコードにありますので、(2) を追加するだけで良いんじゃないかと思います。

    キャンセル

  • 2019/08/05 12:22

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

    キャンセル

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る