ページ 11

画像が表示されなくて困っております

Posted: 2012年1月04日(水) 11:24
by クロすけ
あけましておめでとうございます。
新年早々質問をさせて頂くクロすけと申します。C++を勉強中の身です。
今回は、15パズルというゲームを練習で作成しておりまして、特定の画像が表示されないということで困っております。
パズル自体は画像(puzuru)として表示されるのですが、どれを選択しているのかというターゲットマーカー(mark)がどうしても表示しません。
いろいろとコマンド化して修正場所を特定しようと試みたのですが、何も変化がなく先に進めない状態です。
もちろん、画像の名前と場所はしっかりと確認しました。
もしかしたら、致命的なミスかもしれないので一応、全てのソースコードを載せようと思います。
どなたか分かる方お願いします。

ヘッダーファイル
gv.h

コード:

#include "DxLib.h"
#include "define.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif
GLOBAL int step;

//画像系ハンドル
GLOBAL int pHandle[15] ;
GLOBAL int mark ;

//構造体
GLOBAL mark_s m;

#include "function.h"//関数宣言
function.h

コード:

//main.cppから呼ぶ必要のある他のファイルで宣言した関数

//load.cpp
   //画像読み込み
   GLOBAL void load();
//draw.cpp
   //描画処理
   GLOBAL void draw_main();

//mark.cpp
   //マーカーの移動制御
   GLOBAL void mark_move();
//ini.cpp
   //1度だけの初期化処理
   GLOBAL void first_ini();
   //ゲームの初期化処理
   GLOBAL void ini();
struct.h

コード:

//ターゲットマーカーの構造体(現段階)
typedef struct{
	int x,y;
}mark_s
define.h

コード:

#define PANERU_MAX_X 256
#define PANERU_MAX_Y 256

#include "struct.h"
ソースファイル
load.cpp

コード:

#include "gv.h"

void load(){

	 LoadDivGraph( "img/puzuru.png" , 15 , 5 , 3 , 64 , 64 , pHandle ) ;
	 int mark = LoadGraph("img/mark.png");//←この画像だけが表示されない
}
ini.cpp

コード:

#include "gv.h"
//一番最初の初期化
void first_ini(){
    m.x = 64;
	m.y = 64;
	
}

void ini(){
     memset(&m,0,sizeof(mark_s));
	 //memset(&ta,0,sizeof(tama_s));
     m.x = 64;
	 m.y = 64;
	 //ta.hassyaFlag = 0;
	 //ji.flag = 0;
}
mark.cpp

コード:

#include "gv.h"

void mark_move(){
	   if(CheckHitKey(KEY_INPUT_LEFT)==1)  m.x -=64;
	   if(CheckHitKey(KEY_INPUT_RIGHT)==1) m.x +=64;
	   if(CheckHitKey(KEY_INPUT_UP)==1)    m.y -=64;
	   if(CheckHitKey(KEY_INPUT_DOWN)==1)  m.y +=64;
                //移動範囲の制御
	   if(m.x < 64) {m.x=64;}
	   if(m.x > PANERU_MAX_X-64) {m.x = PANERU_MAX_X-64;}
	   if(m.y < 64) {m.y=64;}
	   if(m.y > PANERU_MAX_Y-64) {m.y = PANERU_MAX_Y-64;}
	   
}
draw.cpp

コード:

#include "gv.h"
//パネル4×4で描画
void draw_paneru(){
	int cnt = 0;
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
		DrawGraph( 64*j+64 , 64*i+64 , pHandle[ cnt ] , FALSE );
		cnt++;
		}
	}

	
}

//ターゲットマーカー描画
void draw_mark(){
     DrawGraph(m.x , m.y , mark , FALSE );
}

//まとめた描画処理
void draw_main(){
	draw_paneru();
	draw_mark();
}
main.cpp

コード:

#define GLOBAL_INSTANCE
#include "gv.h"
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	return 0;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE); // ウィンドウモードに設定
		if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
        while(ProcessLoop()==0){//メインループ
              switch(step){
				  case 0:
					  load();//データのロード
					  first_ini();//初回の初期化
					  step=1;
					  break;
				  case 1:
					  ini();
					  step=2;
				      break;
				  case 2:
					  mark_move();
					  draw_main();
					  break;
				  default:
					   printfDx("step不明\n");
					  break;
			  }


    if(CheckHitKey(KEY_INPUT_ESCAPE)==1) break;//エスケープが入力されたらブレイク
	ScreenFlip();//裏画面反映
	}      // キー入力待ち
        DxLib_End();    // DXライブラリ終了処理
        return 0;
}

Re: 画像が表示されなくて困っております

Posted: 2012年1月04日(水) 11:34
by beatle
インデントさえきちんと出来てないレベルなのでバグがでても不思議では無いと思います.

mark変数はグローバルとローカルがありますが,区別できてますか?

Re: 画像が表示されなくて困っております

Posted: 2012年1月04日(水) 12:16
by non
beatleさんに賛成。
下記方法で自分でデバッグしてみましょう。

デバッグの方法
1 LoadGraphの次の行にブレークポイントを設定し、デバッグ実行
 LoadGraphしたときにmarkが-1ならファイルを読めていない。
 -1以外の値なら読めてる。

2 DrawGraph(m.x , m.y , mark , FALSE );
 の次の行にブレークポイントを設定する。
 ちゃんと、この場所で止まるかチェック。
 止まったなら、各々の引数をチェック。
 m.x,m.yは範囲内か?markは前の時の値と同じか?

3 正常ならDrawGraphは0を返すのでチェック

の順番で見ればいいでしょう。

Re: 画像が表示されなくて困っております

Posted: 2012年1月04日(水) 16:10
by クロすけ
ご指摘のとおり、行った結果、表示することができました。
まだまだ理解が足らない証拠ですね。
一からやり直します。
beatleさん、nonさん ありがとうございました。