ページ 11

DrawGraphでのエラー

Posted: 2014年5月12日(月) 15:34
by レフェリア
DXLibを使用して簡単なオセロゲームを作ろうしています。
LoadGraph()でオセロの石の画像を読み込み、DrawGraph()で描画するといった感じのプログラムを書いていたのですが、
実際に実行すると画像が描画されません。
Log.txtでは読み込みが失敗したと書いておらず、ブレークポイントでハンドラの値を確認してもちゃんと保持しているのでどうすれば良いか分からなくなってしまいました。
errorを出力するためだけのクラスを作ってGraphic::DrawStoneがエラーを出していることが分かっています。
どなたかアドバイスをよろしくお願いします。

OS : Windows7
コンパイラ : VisualStudio2012 C++

コード:

/------Graph.cpp------/
#include "GANE.h"

bool Graphic::ImageLoad(){
	bool ret = TRUE;
	img[0] = LoadGraph( "Data/image/Board.png"  );
	img[1] = LoadGraph( "Data/image/Black.png"  );
	img[2] = LoadGraph( "Data/image/White.png"  );
	img[3] = LoadGraph( "Data/image/Wall.png"   );
	img[4] = LoadGraph( "Data/image/Corner.png" );

	for( int i = 0; i < 5; i++ ){
		if( img[i] == -1 ){
			r.WriteErrorLog("ERROR -> LoadGraph()    Graphic.cpp\n");
			ret = FALSE;
		}
	}

	return ret;
}

bool Graphic::DrawMain( board b ){
	bool ret = TRUE;
	if( !DrawStone( b ) ){
		r.WriteErrorLog("ERROE -> DrawStone()    Graphic.cpp\n");
		ret = FALSE;
	}

	return ret;
}

bool Graphic::DrawStone( board b ){
	bool ret =TRUE;
	int f = 0;


	for( int i = 0 ; i < BOARDSIZE; i++ ){
		for( int j = 0; j < BOARDSIZE; j++ ){
			f = b.data[i][j];
			if( DrawGraph(img[b.data[i][j]], j * 50, i * 50, FALSE) == -1 ){
				ret = FALSE;
				goto Error;
			}
		}
	}
	Error:
	return ret;
}

コード:

/------Graph.h------/
#pragma once

class Graphic
{
public:

	// コンストラクタ
	Graphic(){
	}

	// 画像の読み込み
	bool ImageLoad();

	// 描画メイン
	bool DrawMain( board b);

private:
	int img[5];			// 画像ハンドルを格納する配列
	Report r;			// エラーログ出力用クラス

	// 石の描画
	bool DrawStone( board b );
};

Re: DrawGraphでのエラー

Posted: 2014年5月12日(月) 15:51
by softya(ソフト屋)
このコードだけだとはっきり分からないですが、b.data[j]が0から4の値の範囲である確認をとったほうが良いと思います。
あとは、固定値を入れたら表示されるのか?とか確認方法は幾つかあります。
DrawGraph(img[0], j * 50, i * 50, FALSE)
とか。

Re: DrawGraphでのエラー

Posted: 2014年5月12日(月) 15:55
by レフェリア
すいません、一応dataに入っている値は#defineで指定していることを書き忘れていました

コード:


// 盤面の大きさ
#define BOARDSIZE 8
#define BOARD_ALL_ARIA ( BOARDSIZE * BOARDSIZE )

// 状態を定義
#define NONE  0
#define BLACK 1
#define WHITE 2
#define WALL  3

// 画面の大きさ
#define CLIENT_WIDTH   500
#define CLIENT_HEIGHT  500

// 円周率(画像回転に使用)
#define PI 3.1415926535897932384626433832795f

// ボードデータを引数・戻り値として使用するために
// 構造体として定義
struct board{
	int data[BOARDSIZE][BOARDSIZE];
};
dataを初期化している関数

コード:

// 初期化
void Board::Initialize(){

	// 配列を初期化
	for( int i = 0 ; i < BOARDSIZE; i++ ){
		for( int j = 0; j < BOARDSIZE; j++ )
		bd.data[i][j] = NONE;
	}

	// ボードの中央部に4個の石を配置
	bd.data[BOARDSIZE / 2 - 1][BOARDSIZE / 2    ] = BLACK;
	bd.data[BOARDSIZE / 2    ][BOARDSIZE / 2 - 1] = BLACK;
	bd.data[BOARDSIZE / 2    ][BOARDSIZE / 2    ] = WHITE;
	bd.data[BOARDSIZE / 2 - 1][BOARDSIZE / 2 - 1] = WHITE;
}

Re: DrawGraphでのエラー

Posted: 2014年5月12日(月) 15:57
by レフェリア
また、固定値を入れた場合を検証したところやはり描画されませんでした。

Re: DrawGraphでのエラー

Posted: 2014年5月12日(月) 16:01
by softya(ソフト屋)
C/C++の場合、ポインタや配列操作のミスで他の変数の値が書き換えるのは当たり前のように起こりますので、初期化したからといって安心してはいけません。

>また、固定値を入れた場合を検証したところやはり描画されませんでした。

この場合、変数が誰かに書き換えられたか、あるいはロードそのものが行われなかったかを疑ったほうが良いです。

Re: DrawGraphでのエラー

Posted: 2014年5月12日(月) 16:05
by レフェリア
わかりました。
ブレークポイント等を使ってこの位置以外での変数の内容などを調べてみます。
ありがとうございました!

Re: DrawGraphでのエラー

Posted: 2014年5月12日(月) 16:08
by softya(ソフト屋)
もう一つありました。
ロードしたインスタンスと描画したインスタンスが違う可能性としてありますね。

Re: DrawGraphでのエラー

Posted: 2014年5月13日(火) 11:05
by レフェリア
>> ロードしたインスタンスと描画したインスタンスが違う可能性としてありますね。
一応、GraphicクラスのインスタンスはMainで一個だけ生成しています。

>> この場合、変数が誰かに書き換えられたか、あるいはロードそのものが行われなかったかを疑ったほうが良いです。
img配列を static const 指定をして書き換え不可にしてみたところimg[0]が-1でした。
どうもロードが失敗しているみたいでした。
ディレクトリ指定がちゃんとできているはずなのに何故できないのかが未だに不明ですが・・・

Re: DrawGraphでのエラー

Posted: 2014年5月13日(火) 13:27
by レフェリア
自己解決しました。
DrawGraph()の引数が間違えていました。
一応修正後のコード

コード:

/------Graph.cpp------/
#include "GANE.h"
 
bool Graphic::ImageLoad(){
    bool ret = TRUE;
    img[0] = LoadGraph( "Data/image/Board.png"  );
    img[1] = LoadGraph( "Data/image/Black.png"  );
    img[2] = LoadGraph( "Data/image/White.png"  );
    img[3] = LoadGraph( "Data/image/Wall.png"   );
    img[4] = LoadGraph( "Data/image/Corner.png" );
 
    for( int i = 0; i < 5; i++ ){
        if( img[i] == -1 ){
            r.WriteErrorLog("ERROR -> LoadGraph()    Graphic.cpp\n");
            ret = FALSE;
        }
    }
 
    return ret;
}
 
bool Graphic::DrawMain( board b ){
    bool ret = TRUE;
    if( !DrawStone( b ) ){
        r.WriteErrorLog("ERROE -> DrawStone()    Graphic.cpp\n");
        ret = FALSE;
    }
 
    return ret;
}
 
bool Graphic::DrawStone( board b ){
    bool ret =TRUE;
    int f = 0;
 
 
    for( int i = 0 ; i < BOARDSIZE; i++ ){
        for( int j = 0; j < BOARDSIZE; j++ ){
            f = b.data[i][j];
            if( DrawGraph( j * 50, i * 50, img[f], FALSE) == -1 ){
                ret = FALSE;
                goto Error;
            }
        }
    }
    Error:
    return ret;
}

Re: DrawGraphでのエラー

Posted: 2014年5月13日(火) 13:35
by ソフト屋(外出中)
そこは確認もれでした。