ページ 11

ゲームプログタミングの館22章

Posted: 2009年7月14日(火) 21:53
by もじゃ
C言語初心者で、ゲームプログラミングの館を見ながら覚えていっています。
使用OSはXPで、コンパイラはVC++ 2008 EE です。
これまでは、まずサンプルプログラミングを見ずに自分で考えてみて、答え合わせのような形でサンプルと見比べる・・・と言うようなやり方で、上手く進んでいたのですが、22章にてつまづいてしまいました。
今までは、~行のプログラミングが間違っているよ、と言う表記がでたのですすっといっていて、今回も1回でたので、それを直してコンパイルに成功、と思いきや、以下のメッセージがでました。

test.exe の 0x0056c1bc でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xccdfcb94 を読み込み中にアクセス違反が発生しました。

初めて見たエラーメッセージなので、びっくししたのもあるんですが、これじゃあどこが間違っているか分かりません。
1行目からサンプルプログラミングとかなり長い時間にらめっこしてみても、違いが分かりませんでした。
サンプルプログラミングをコピー&ペーストしてみたら実行できたので、プログラミングの間違いだとは分かったのですが、どこが間違っているかさっぱり分かりません。
これができなかったらどう、という訳ではないのですが、やはりここをきちんと理解して次に進むのと、理解せずに曖昧に次に進むのとではやはり後々つまづく原因になりそうなので、理解して次に進みたいんです。
どこが間違っているかを教えて頂ければ幸いです。

自分が打ち込んだプログラミング
#include "DxLib.h"

typedef struct{
	int x,y,img,muki,walking_flag;
}ch_t;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	
	int image[16];
	char key[256];
	ch_t ch;
	
	if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
	
	ch.x	=320;
	ch.y	=240;

	SetDrawScreen(DX_SCREEN_BACK);
	LoadDivGraph("char.png",16,4,4,32,32,image);

	while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(key) && !key[KEY_INPUT_ESCAPE]){
		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(ch.muki==0)
				ch.y--;
			else if(ch.muki==1)
				ch.x--;
			else if(ch.muki==2)
				ch.y++;
			else if(ch.muki==3)
				ch.x++;
		}
		ch.img = image[(ch.x%32+ch.y%32)/8 + ch.muki*4];	//時に応じた画像をセット
		DrawGraph(ch.x,ch.y,ch.img,TRUE);	//描画
		ScreenFlip();
	}

		WaitKey();
		DxLib_End();
		return 0;
}

Re:ゲームプログタミングの館22章

Posted: 2009年7月14日(火) 22:27
by pooka
ch.mukiが初期化されていないため
>ch.img = image[(ch.x%32+ch.y%32)/8 + ch.muki*4];//時に応じた画像をセット
ここでアクセス違反を起こしているようです。
私の環境ではch.mukiの値は-858993460になっていました。

館の方ではループに入る前に
ch.muki = 3;
となっているので確認してみてください。

Re:ゲームプログタミングの館22章

Posted: 2009年7月15日(水) 13:22
by やそ
確かに館の22章では
ch.x=320;
    ch.y=160;
    ch.walking_flag=0;
    ch.muki=3;
となっておるぞい。
ちょっとした確認ミスじゃの^^;

Re:ゲームプログタミングの館22章

Posted: 2009年7月15日(水) 14:47
by もじゃ
pookaさん、やそさん、アドバイスありがとうございました。
まさか、2行まるまる抜けていたとは・・・、スペルミスばかり確認していました・・・。
しょうもないミスで、本当にすいませんでした。