背景画面について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
蒼天

背景画面について

#1

投稿記事 by 蒼天 » 14年前

コード:

#include "DxLib.h"

typedef struct{
        int x,y,img,muki,walking_flag;
}ch_t;
 
int hantei[15][20] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1 },
        { 1,0,0,0,0,0,1,2,1,1,1,0,0,0,1,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
 
int IsAbleToGo(int x,int y,int muki){//進めるかを判定する
        if(muki==0)//上向きなら
                if(hantei[y/32-1][x/32]==1)//進めるか判定
                        return 1;//エラー
        if(muki==1)//左向きなら
                if(hantei[y/32][x/32-1]==1)
                        return 1;
        if(muki==2)//下向きなら
                if(hantei[y/32+1][x/32]==1)
                        return 1;
        if(muki==3)//右向きなら
                if(hantei[y/32][x/32+1]==1)
                        return 1;
        return 0;//正常
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        




    int image[16],i,j;
    char Key[256];
    ch_t ch;
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
    ch.x    =320;
    ch.y    =160;
    ch.walking_flag=0;
    ch.muki=3;
  
    SetDrawScreen( DX_SCREEN_BACK ) ;  //描画先を裏画面に設定


    
LoadDivGraph( "画像/キャラクタ10.png" , 16 , 4 , 4 , 32 , 32 , image );//画像を分割してimage配列に保存



    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
 /*白い壁を描画*/
                for(i=0;i<15;i++){
                        for(j=0;j<20;j++){
                                if(hantei[i][j]==1)
                                        DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);
                                if(hantei[i][j]==2)
                                        DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(  0,255,255),TRUE);
                        }
                }

                
 if(ch.x%32==0 && ch.y%32==0){         //座標が32で割り切れたら入力可能
                
            ch.walking_flag=1;         //歩くフラグを立てる。
            if     ( Key[ KEY_INPUT_UP   ]  == 1 )  //上ボタンが押されたら
                    ch.muki=0;         //上向きフラグを立てる
            else if( Key[ KEY_INPUT_LEFT ]  == 1 )  //左ボタンが押されたら
                    ch.muki=1;         //左向きフラグを立てる
            else if( Key[ KEY_INPUT_DOWN ]  == 1 )  //下ボタンが押されたら
                    ch.muki=2;         //下向きフラグを立てる
            else if( Key[ KEY_INPUT_RIGHT]  == 1 )  //右ボタンが押されたら
                    ch.muki=3;         //右向きフラグを立てる
            else                                    //何のボタンも押されてなかったら
                    ch.walking_flag=0; //歩かないフラグを立てる
            if(ch.walking_flag==1)    //もし歩くなら
                if(IsAbleToGo(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
                    ch.walking_flag=0;                  //歩かないフラグを立てる。
  if(ch.walking_flag==1)
                if(hantei[ch.y/32][ch.x/32]==2)
                printfDx("敵");
if(ch.walking_flag==1)
                if(GetRand(15)==0)
                    printfDx("敵");



 }
 
        if(ch.walking_flag==1){        //歩くフラグが立っていたら
            if     (ch.muki==0)        //上向きならch.y座標を減らす
                    ch.y--;
            else if(ch.muki==1)        //左向きならch.x座標を減らす
                    ch.x--;
            else if(ch.muki==2)        //下向きならch.y座標を増やす
                    ch.y++;
            else if(ch.muki==3)        //右向きならch.x座標を増やす
                    ch.x++;
        }
 
        ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];            //画像をセット
 
        DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

↑のコードに背景画面を描画する処理を書きたいのですがどこに何のコードを書けばいいか分かりません。


初心者ながら頑張って書いてみても駄目みたいなのでここで質問させていただきます。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 背景画面について

#2

投稿記事 by h2so5 » 14年前

壁を描画する直前にDrawGraphなどで背景画像を描画すれば出来ると思います。

あと、コードのインデントや行間がバラバラで見にくいので、
もうちょっと綺麗に書いてください。

蒼天

Re: 背景画面について

#3

投稿記事 by 蒼天 » 14年前

壁というのは白い壁ということでいいのでしょうか?


あとDrawGraphなんですがいままでこの関数に触れていなかったので使い方がよく分かりません。


とりあえず調べて真似して使ってみたんですが上手くいきません、どのような使い方をすればいいのでしょうか?

勝手な質問すいません、回答よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 背景画面について

#4

投稿記事 by h2so5 » 14年前

蒼天 さんが書きました:壁というのは白い壁ということでいいのでしょうか?
そうです。白い壁の後ろに背景を表示したい場合の話ですが。
蒼天 さんが書きました: あとDrawGraphなんですがいままでこの関数に触れていなかったので使い方がよく分かりません。
http://www.dixq.net/g/01_04.html
ここが参考になると思います。

蒼天

Re: 背景画面について

#5

投稿記事 by 蒼天 » 14年前

コード:

int Handle;     // データハンドル格納用変数
        Handle = LoadGraph( "画像/背景.bmp" ); // 画像をロード
        DrawGraph( 50, 100, Handle, TRUE ); // データハンドルを使って画像を描画



    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
 /*白い壁を描画*/
                for(i=0;i<15;i++){
                        for(j=0;j<20;j++){
                                if(hantei[i][j]==1)
                                        DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);
                                if(hantei[i][j]==2)
                                        DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(  0,255,255),TRUE);
                        }
                }
↑のような感じでいいと思うんですが、このままデバッグしても背景が黒いままで変化がありません。

何故でしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 背景画面について

#6

投稿記事 by h2so5 » 14年前

DrawGraphはループの中に入れないといけません。

Re: 背景画面について

#7

投稿記事 by » 14年前

なんとか表示することが出来ました^^

ありがとうございます。


おそらく最後の質問です。

背景の画像を実行画面全体に表示するにはどうすればいいですか?


単純に座標を指定すればいいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 背景画面について

#8

投稿記事 by softya(ソフト屋) » 14年前

途中で名前を変えるのはやめてくださいね。

>背景の画像を実行画面全体に表示するにはどうすればいいですか?
画面サイズ分の画像である必要がありますね。標準だと640 x 480ドットです。
あと座標は0,0にすれば左上からに位置づけされます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

蒼天

Re: 背景画面について

#9

投稿記事 by 蒼天 » 14年前

すいません、気が付いたら名前の文字がかけていました。

申し訳ありません。


いま言われた通りにやってみましたら無事に解決しました^^


最後まで丁寧に回答してくださってありがとうございました^^


これで解決とさせていただきます。

閉鎖

“C言語何でも質問掲示板” へ戻る