DrawGraphでのエラー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
レフェリア
記事: 33
登録日時: 12年前

DrawGraphでのエラー

#1

投稿記事 by レフェリア » 11年前

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 );
};

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

Re: DrawGraphでのエラー

#2

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

このコードだけだとはっきり分からないですが、b.data[j]が0から4の値の範囲である確認をとったほうが良いと思います。
あとは、固定値を入れたら表示されるのか?とか確認方法は幾つかあります。
DrawGraph(img[0], j * 50, i * 50, FALSE)
とか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

レフェリア
記事: 33
登録日時: 12年前

Re: DrawGraphでのエラー

#3

投稿記事 by レフェリア » 11年前

すいません、一応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;
}

レフェリア
記事: 33
登録日時: 12年前

Re: DrawGraphでのエラー

#4

投稿記事 by レフェリア » 11年前

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

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

Re: DrawGraphでのエラー

#5

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

C/C++の場合、ポインタや配列操作のミスで他の変数の値が書き換えるのは当たり前のように起こりますので、初期化したからといって安心してはいけません。

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

この場合、変数が誰かに書き換えられたか、あるいはロードそのものが行われなかったかを疑ったほうが良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

レフェリア
記事: 33
登録日時: 12年前

Re: DrawGraphでのエラー

#6

投稿記事 by レフェリア » 11年前

わかりました。
ブレークポイント等を使ってこの位置以外での変数の内容などを調べてみます。
ありがとうございました!

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

Re: DrawGraphでのエラー

#7

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

もう一つありました。
ロードしたインスタンスと描画したインスタンスが違う可能性としてありますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

レフェリア
記事: 33
登録日時: 12年前

Re: DrawGraphでのエラー

#8

投稿記事 by レフェリア » 11年前

>> ロードしたインスタンスと描画したインスタンスが違う可能性としてありますね。
一応、GraphicクラスのインスタンスはMainで一個だけ生成しています。

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

レフェリア
記事: 33
登録日時: 12年前

Re: DrawGraphでのエラー

#9

投稿記事 by レフェリア » 11年前

自己解決しました。
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でのエラー

#10

投稿記事 by ソフト屋(外出中) » 11年前

そこは確認もれでした。

閉鎖

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