ポインタと画像の表示

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

ポインタと画像の表示

#1

投稿記事 by kaku » 10年前

ゲームプログラマーになるまえに覚えておきたい技術という本を参考にDXライブラリでゲームを作っています。(荷物を運ぶゲーム)

コード:

#include "DxLib.h"

const char gStageData[] = "\
########\n\
#  ..  #\n\
#  oo  #\n\
#  p    #\n\
########";

const int gStageWidth = 8;
const int gStageHeight = 5;

int handle;

enum Object{
	OBJ_SPACE,
	OBJ_WALL,
	OBJ_GOAL,
	OBJ_BLOCK,
	OBJ_BLOCK_ON_GOAL,
	OBJ_MAN,
	OBJ_MAN_ON_GOAL,
	OBJ_UNKNOWN
};

void initialize(Object* state, int width, int height, const char* stageData);
void draw(const Object* state, int width, int height);

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {

	ChangeWindowMode(true);
	DxLib_Init();


	Object* state = new Object[gStageWidth*gStageHeight];

	initialize(state, gStageWidth, gStageHeight, gStageData);

	draw(state, gStageWidth, gStageHeight);

	WaitKey();




	DxLib_End();
	return 0;


}

void initialize(Object* state, int width, int height, const char* stageData) {

	const char* d = stageData;
	int x = 0;
	int y = 0;

	while (*d != '\0') {
		
		Object t;

		switch (*d) {

		case '#':t = OBJ_WALL;
		case ' ':t = OBJ_SPACE;
		case 'o':t = OBJ_BLOCK;
		case 'O':t = OBJ_BLOCK_ON_GOAL;
		case '.':t = OBJ_GOAL;
		case 'p':t = OBJ_MAN;
		case 'P':t = OBJ_MAN_ON_GOAL;
		case '\n':
			x = 0;
			y++;
			t = OBJ_UNKNOWN;
			break;
		default:t = OBJ_UNKNOWN;
		}

		d++;

		if (t != OBJ_UNKNOWN) {
			state[y*width + x] = t;
			x++;
		}
	}
}

void draw(const Object* state, int width, int height) {

	int x = 0;
	int y = 0;
	const Object* s = state;

	for (int i = 0; i < gStageHeight; i++) {


		for (int j = 0; j < gStageWidth; j++) {

			switch (*s) {
			case OBJ_SPACE:handle = LoadGraph("objspace.png");
			case OBJ_WALL:handle = LoadGraph("objwall.png");
			case OBJ_GOAL:handle = LoadGraph("objgoal.png");
			case OBJ_BLOCK:handle = LoadGraph("objblock.png");
			case OBJ_BLOCK_ON_GOAL:handle = LoadGraph("objblockongoal.png");
			case OBJ_MAN:handle = LoadGraph("objman.png");
			case OBJ_MAN_ON_GOAL:handle = LoadGraph("objmanongoal.png");
			default:handle = LoadGraph("objblockongoal.png");
			}

			DrawGraph(x, y, handle, true);

			x = x + 50;
			s++;
		}
		x = 0;
		y = y + 50;

	}

}
そこで以上のようなコードを組みました。
最初にgStageData(マップ)を読み込んでinitialize関数で一つ一つのデータ(enum Object)を配列に格納していきます。
その後draw関数でObjectの値によって異なる画像を表示するようにしたのですがswitchの部分でdefaultの部分だけしか通過せず
objblockongoal.pngばかりが表示されてしまいます。どうすればいいのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ポインタと画像の表示

#2

投稿記事 by みけCAT » 10年前

kaku さんが書きました:switchの部分でdefaultの部分だけしか通過せず
本当ですか?デバッガやMessageBox関数、Beep関数などで本当にそこしか通過していないか確認してください。

【追記】
stateの要素を初期化していない(tがOBJ_UNKNOWN)だとstateの要素に代入されない)ため、不定の値になっており、
0や1になればdefaultの部分以外も通過し、適当なでかい値の場合はdefaultの部分しか通過しないようです。
kaku さんが書きました:objblockongoal.pngばかりが表示されてしまいます。どうすればいいのでしょうか?
  • 毎回LoadGraphしてはいけません。事前(DxLib_Init()を呼び出した後)にそれぞれ1回だけLoadGraphで画像をロードしてハンドルを配列などに格納し、それを参照するようにしてください。
  • C++のswitch文は、break;を用いないとcase文やdefault文があっても次の処理に入ってしまいます。switch文(initialize関数内、draw関数内)ともに適切にbreak;を追加してください。
オフトピック
new[]したstateをdelete[]していないのもよくないと思います。
最後に編集したユーザー みけCAT on 2015年9月10日(木) 10:57 [ 編集 2 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kaku

Re: ポインタと画像の表示

#3

投稿記事 by kaku » 10年前

kakuです。みけCATさん、分かりやすい解説ありがとうございました。
なんとか解決することができました。(^^)

閉鎖

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