画像の表示

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

画像の表示

#1

投稿記事 by bon » 14年前

RPGのようなものを作ろうと思っているのですが、問題が発生しました。

#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,1,1,1,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,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,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,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( "yusya.bmp" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存



while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了

/*白い壁を描画*/
for(i=0;i<15;i++)
for(j=0;j<20;j++)
if(hantei[j]==1)
DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,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(GetRand(4)==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;
}


上記のプログラムで白い壁を描画するのではなく、実際の画像を描画したいです。
たとえばDrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);
をDrawGraph(j*32,i*32,"ki.bmp",TRUE);
なんかに変えてみたんですがエラーが発生しました。
また、LoadGraphで書いてみても表示されませんでした。

どのような書き方をすれば正しくマップの1の部分に画像を表示できるのか教えてください。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 画像の表示

#2

投稿記事 by beatle » 14年前

DrawGraph関数とかLoadGraph関数の使い方を間違えているみたいですから、まず
DrawGraph
LoadGraph
で2つの関数について学んでください。

bonさんの質問の仕方には幾つか問題があります。
まず、ソースコードはcodeタグで囲んでください。投稿する前にプレビューを忘れずに。
それから、エラーが出たならそのエラーメッセージを載せてください。

アバター
沖 滉均
記事: 237
登録日時: 15年前
住所: K県F市

Re: 画像の表示

#3

投稿記事 by 沖 滉均 » 14年前

まず、コードを貼る際はcodeタグで囲んで下さい。
bon さんが書きました:たとえばDrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);
をDrawGraph(j*32,i*32,"ki.bmp",TRUE);
なんかに変えてみたんですがエラーが発生しました。
DrawGraphの第3引数に指定するのはファイル名ではなく画像ハンドルなのでエラーが発生して当然ですが、
コード中はちゃんと画像ハンドルを指定しているように見えます。(サラっとしか見ていませんが…)

画像が本当に読み込めているかなどは確認されましたか?
There is no royal road to learning.
codeタグで指定できる言語
画像

bon

Re: 画像の表示

#4

投稿記事 by bon » 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,1,1,1,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,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,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,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;
    int Handle01;
    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( "yusya.bmp" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
    int Handel01=LoadGraph("ki.bmp") 
    
    
     while(ProcessMessage() && ClearDrawScreen() && GetHitKeyStateAll( Key ) && Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
        /*白い壁を描画*/
	 for(i=0,j=0;i<15&&j<20;i++,j++){
           
                if(hantei[i][j]==1)
                  DrawGraph(j*32,i*32,Handle01,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(GetRand(4)==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;
}
61: 宣言の構文エラー(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)
ソースの書き方、画像の表示が誤ってましたすいません^^
ご指摘を頂き訂正しましたが上記のようにエラー表示がでました

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

Re: 画像の表示

#5

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

今回は直しておきました。フォーラムルールでcodeタグについては説明してあります。
http://dixq.net/board/board.html
投稿前にプレビューでちゃんと確認してから投稿しましょう。

私は別の所でエラーが出ますが、本当に61行ですか?
あとコンパイラも明記して下さい。bcc5.5でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
沖 滉均
記事: 237
登録日時: 15年前
住所: K県F市

Re: 画像の表示

#6

投稿記事 by 沖 滉均 » 14年前

開発環境(コンパイラなど)はなんでしょうか?
本当にそのようなエラーが出ていますか?
私の環境(Visual Studio 2008)では違う箇所でエラーが出ています。
書き込み時に書きなおしたりせずに、実際のコードからのコピペでしょうか?

[追記]
あぁ、なんかsoftyaさんと内容かぶってますね…すいません。
書き込みタイミングで見落としました…
There is no royal road to learning.
codeタグで指定できる言語
画像

閉鎖

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