マップ移動の処理

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

マップ移動の処理

#1

投稿記事 by xxxCLOUDxxx » 13年前

この内容では初の質問です(´ε`;)
マップ移動は画面の端っこまで行ったらキャラクターは来た方向の真逆にいくようにして、その処理と同時に背景のマップを差し替えるという形にしているのですがそこで質問です。
背景を差し替える所まではいいのですが、差し替えたあと 1の部分を壁があるように当たり判定を設定しているのですが、なぜか一番最初のマップの処理が残ったままで何もないのに壁にあたってしまうという現象が起きています(T_T)
ソースコードは以下の通りなのでわかる方はなにがどう処理されて最初のマップの処理が残ってしまているのか教えてもらいたいです。




コード:

#include "DxLib.h"

#define WD 400
#define SCREEN_X    (640)
#define SCREEN_Y    (480)
#define MAPSIZE_X   (32*25)                             //横マップサイズの長さ
#define MAPSIZE_Y   (480)                               //縦マップサイズの長さ
#define CHIPSIZE    (32)                                //一つのブロックサイズ
#define MAP_WIDTH   (MAPSIZE_X/CHIPSIZE)                //横のブロックの数
#define MAP_HEIGHT  (MAPSIZE_Y/CHIPSIZE)                //縦のブロックの数
#define MOVE_FRAME	32			                        // 移動にかけるフレーム数
#define MAP_TATE    45
#define MAP_YOKO    60

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

typedef struct{
	int a,b,img2,muki2,walking_flag2;
	int count;
}cd_t;


int image[16];
int image2[16];
int image3[7];
int image4;
int i,j,k;
int hp=1000;
int hp_max=1000;
int green,white,black;
int count=2;
int x=0;
int y=0;
int w=0;
int map_now_x=0,map_now_y=0;

char Key[256];
ch_t ch;
cd_t cd;

void map();
void player();
void teki();

int hantei[MAP_TATE][MAP_YOKO] = {
	{ 1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
	{ 1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1 },
};

int IsAbleToGo(int x,int y,int muki){//進めるかを判定する
	if(muki==0)//上向きなら
		if(hantei[y/32-1][x/32]==1||hantei[y/32-1][x/32]==2)
			return 1;//エラー
	if(muki==1)//左向きなら
		if(hantei[y/32][x/32-1]==1||hantei[y/32][x/32-1]==2)
			return 1;
	if(muki==2)//下向きなら
		if(hantei[y/32+1][x/32]==1||hantei[y/32+1][x/32]==2)
			return 1;
	if(muki==3)//右向きなら
		if(hantei[y/32][x/32+1]==1||hantei[y/32][x/32+1]==2)
			return 1;
	return 0;//正常
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

ch.x    =320;
ch.y    =160;
cd.a    =160;
cd.b    =192;
ch.walking_flag=0;
cd.walking_flag2=0;
ch.muki=3;
cd.muki2=3;
cd.count=GetRand(30);
green=GetColor(0,255,0);
white=GetColor(255,255,255);
black=GetColor(0,0,0);

PlaySoundFile("music/Skyrim.mp3",DX_PLAYTYPE_LOOP);
SetDrawScreen(DX_SCREEN_BACK);                                                 //描画先を裏画面に設定
LoadDivGraph( "pic/char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
LoadDivGraph( "pic/char1.png" , 16 , 4 , 4 , 32 , 32 , image2 ) ;//画像を分割してimage配列に保存
LoadDivGraph( "pic/TileA.png" , 7 , 7 , 1 , 32 , 32 , image3 ) ;
image4=LoadGraph("pic/mainmap1.png");

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
	//↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了

	map();
	player();
	teki();

	DrawFormatString( 0,0,GetColor(16,16,16),"MapDrawPoint(%d,%d)", ch.x,ch.y );

	ScreenFlip();
}
DxLib_End();
return 0;
}
void map(){

	/*壁を描画*/
	for(i=0;i<MAP_TATE;i++){
		for(j=0;j<MAP_YOKO;j++){
			if(hantei[i+15*map_now_y][j+20*map_now_x]==0)
				DrawGraph(j*32,i*32,image3[0],TRUE);
			if(hantei[i+15*map_now_y][j+20*map_now_x]==1)
				DrawGraph(j*32,i*32,image3[1],TRUE);
			if(hantei[i+15*map_now_y][j+20*map_now_x]==2)
				DrawGraph(j*32,i*32,image3[2],TRUE);
			if(hantei[i+15*map_now_y][j+20*map_now_x]==3)
				DrawGraph(j*32,i*32,image3[3],TRUE);
			if(hantei[i+15*map_now_y][j+20*map_now_x]==4)
				DrawGraph(j*32,i*32,image3[4],TRUE);
			if(hantei[i+15*map_now_y][j+20*map_now_x]==5)
				DrawGraph(j*32,i*32,image3[5],TRUE);
			if(hantei[i+15*map_now_y][j+20*map_now_x]==6)
				DrawGraph(j*32,i*32,image3[6],TRUE);
		}
	}	
	switch(w){
	case 0:
		if(ch.x<0)
			ch.x=0;
		if(ch.y<0)
			ch.y=0;
		break;
	case 1:
		if(ch.y<0)
			ch.y=0;
		break;
	case 2:
		if(ch.x>608)
			ch.x=608;
		if(ch.y<0)
			ch.y=0;
		break;
	case 3:
		if(ch.x<0)
			ch.x=0;
		break;
	case 5:
		if(ch.x>608)
			ch.x=608;
		break;
	case 6:
		if(ch.x<0)
			ch.x=0;
		if(ch.y>448)
			ch.y=448;
		break;
	case 7:
		if(ch.y>448)
			ch.y=448;
		break;
	case 8:
		if(ch.x>608)
			ch.x=608;
		if(ch.y>448)
			ch.y=448;
		break;
	}
}
void player(){

	if(ch.x>624){
		ch.x=-16;
		w++;
		map_now_x++;
	}
	if(ch.x<-16){
		ch.x=624;
		w--;
		map_now_x--;
	}
	if(ch.y>464){
		ch.y=-16;
		w+=3;
		map_now_y++;
	}
	if(ch.y<-16){
		ch.y=464;
		w-=3;
		map_now_y--;
	}

	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(IsAbleToGo(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
				ch.walking_flag=0;                  //歩かないフラグを立てる。


		/*if(hantei[ch.y/32][ch.x/32]==1){
			DrawGraph(0,0,image3[5],TRUE);
			DrawFormatString(420,10,black,"%d受けた!",GetRand(50)+50);
			DrawBox(10,10,10+WD,30,GetColor(0,255,255),FALSE);//メーターの枠を描画
			DrawBox(10,10,10+WD*hp/hp_max,30,GetColor(0,255,255),TRUE );//メーターの中身を描画
			if(hp>0) hp--;
			count++;
			if(count>1)
				DrawBox(0,0,640,480,white,TRUE);
			if(count>3)
				count=0;
		}*/
	}
	if(ch.walking_flag==1){        //歩くフラグが立っていたら
		if     (ch.muki==0)        //上向きならch.y座標を減らす
			ch.y-=2;
		else if(ch.muki==1)        //左向きならch.x座標を減らす
			ch.x-=2;
		else if(ch.muki==2)        //下向きならch.y座標を増やす
			ch.y+=2;
		else if(ch.muki==3)        //右向きならch.x座標を増やす
			ch.x+=2;
	}

	ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];            //画像をセット

	DrawGraph(ch.x,ch.y,ch.img,TRUE); //画像を描写

}
void teki(){
	if(cd.a%32==0 && cd.b%32==0 && cd.count==0){
		cd.muki2 = GetRand( 3 );
	}else{
		cd.walking_flag2=1;
	}

	if(cd.walking_flag2==1){        //歩くフラグが立っていたら
		if     (cd.muki2==0)        //上向きならch.y座標を減らす
			cd.b-=2;
		else if(cd.muki2==1)        //左向きならch.x座標を減らす
			cd.a-=2;
		else if(cd.muki2==2)        //下向きならch.y座標を増やす
			cd.b+=2;
		else if(cd.muki2==3)        //右向きならch.x座標を増やす
			cd.a+=2;
		if ( cd.a%32==0 && cd.b%32==0 ) {
			cd.walking_flag2=0;
			cd.count = GetRand(30);
		}
	}
	if ( cd.count )
		cd.count--;

	cd.img2=image2[(cd.a%32+cd.b%32)/8+ cd.muki2*4];

	DrawGraph(cd.a,cd.b,cd.img2,TRUE);
}

non
記事: 1097
登録日時: 15年前

Re: マップ移動の処理

#2

投稿記事 by non » 13年前

コード:

void map(){
 
    /*壁を描画*/
    for(i=0;i<MAP_TATE;i++){
        for(j=0;j<MAP_YOKO;j++){
            if(hantei[i+15*map_now_y][j+20*map_now_x]==0)
                DrawGraph(j*32,i*32,image3[0],TRUE);
よくわからないので、教えて欲しいのですが、画面サイズとhanteiとの関係はどうなってますか?
MAP_YOKOが60だとすると、横サイズは60*32になるのですがこんな場所にDrawGraphするの?
non

conio
記事: 9
登録日時: 13年前
連絡を取る:

Re: マップ移動の処理

#3

投稿記事 by conio » 13年前

詳しくソースコードを追っていないので間違っているかもしれません。
とりあえず以下の部分ですが、

コード:

 
   /*壁を描画*/
    for(i=0;i<MAP_TATE;i++){
        for(j=0;j<MAP_YOKO;j++){
            if(hantei[i+15*map_now_y][j+20*map_now_x]==0)
                DrawGraph(j*32,i*32,image3[0],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==1)
                DrawGraph(j*32,i*32,image3[1],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==2)
                DrawGraph(j*32,i*32,image3[2],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==3)
                DrawGraph(j*32,i*32,image3[3],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==4)
                DrawGraph(j*32,i*32,image3[4],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==5)
                DrawGraph(j*32,i*32,image3[5],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==6)
                DrawGraph(j*32,i*32,image3[6],TRUE);
        }
    } 
map_now_xが4とかになると範囲外アクセスしませんか?

■map_now_x = 4、 map_now_y = 4 とする。
hantei[i+15*map_now_y][j+20*map_now_x]
→hantei[i+60][j+80]

あと、上記のコードは範囲外の添え字にならないのであれば、
以下のように記載した方がすっきりすると思います。

コード:

 
   /*壁を描画*/
    for(i=0;i<MAP_TATE;i++){
        for(j=0;j<MAP_YOKO;j++){
                DrawGraph(j*32,i*32,image3[ hantei[i+15*map_now_y][j+20*map_now_x] ],TRUE);
        }
    } 

xxxcloudxxx

Re: マップ移動の処理

#4

投稿記事 by xxxcloudxxx » 13年前

non さんが書きました:

コード:

void map(){
 
    /*壁を描画*/
    for(i=0;i<MAP_TATE;i++){
        for(j=0;j<MAP_YOKO;j++){
            if(hantei[i+15*map_now_y][j+20*map_now_x]==0)
                DrawGraph(j*32,i*32,image3[0],TRUE);
よくわからないので、教えて欲しいのですが、画面サイズとhanteiとの関係はどうなってますか?
MAP_YOKOが60だとすると、横サイズは60*32になるのですがこんな場所にDrawGraphするの?
回答ありがとうございます。
私も今気づきました(´ε`;)

code=cpp]void map(){

/*壁を描画*/
for(i=0;i<MAP_TATE;i++){
for(j=0;j<MAP_YOKO;j++){
if(hantei[i+45*map_now_y][j+60*map_now_x]==0)
DrawGraph(j*32,i*32,image3[0],TRUE);[/code]
に直しましたがやはり状況はおなじでした(T_T)

xxxcloudxxx

Re: マップ移動の処理

#5

投稿記事 by xxxcloudxxx » 13年前

コード:

conio さんが書きました:詳しくソースコードを追っていないので間違っているかもしれません。
とりあえず以下の部分ですが、

コード:

 
   /*壁を描画*/
    for(i=0;i<MAP_TATE;i++){
        for(j=0;j<MAP_YOKO;j++){
            if(hantei[i+15*map_now_y][j+20*map_now_x]==0)
                DrawGraph(j*32,i*32,image3[0],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==1)
                DrawGraph(j*32,i*32,image3[1],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==2)
                DrawGraph(j*32,i*32,image3[2],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==3)
                DrawGraph(j*32,i*32,image3[3],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==4)
                DrawGraph(j*32,i*32,image3[4],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==5)
                DrawGraph(j*32,i*32,image3[5],TRUE);
            if(hantei[i+15*map_now_y][j+20*map_now_x]==6)
                DrawGraph(j*32,i*32,image3[6],TRUE);
        }
    } 
map_now_xが4とかになると範囲外アクセスしませんか?

■map_now_x = 4、 map_now_y = 4 とする。
hantei[i+15*map_now_y][j+20*map_now_x]
→hantei[i+60][j+80]

あと、上記のコードは範囲外の添え字にならないのであれば、
以下のように記載した方がすっきりすると思います。

コード:

 
   /*壁を描画*/
    for(i=0;i<MAP_TATE;i++){
        for(j=0;j<MAP_YOKO;j++){
                DrawGraph(j*32,i*32,image3[ hantei[i+15*map_now_y][j+20*map_now_x] ],TRUE);
        }
    } 
回答ありがとうございます♫
conioさんの言うとおり

コード:


   /*壁を描画*/
    for(i=0;i<MAP_TATE;i++){
        for(j=0;j<MAP_YOKO;j++){
                DrawGraph(j*32,i*32,image3[hantei[i+45*map_now_y][j+60*map_now_x]],TRUE);
        }
    }
と書き換えました^^
ですがやはりマップ移動した時にその最初のマップの処理が残ったまま当たり判定がのこっています(T_T)

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: マップ移動の処理

#6

投稿記事 by beatle » 13年前

xxxCLOUDxxx さんが書きました:この内容では初の質問です(´ε`;)
マップ移動は画面の端っこまで行ったらキャラクターは来た方向の真逆にいくようにして、その処理と同時に背景のマップを差し替えるという形にしているのですがそこで質問です。
背景を差し替える所まではいいのですが、差し替えたあと 1の部分を壁があるように当たり判定を設定しているのですが、なぜか一番最初のマップの処理が残ったままで何もないのに壁にあたってしまうという現象が起きています(T_T)
ソースコードは以下の通りなのでわかる方はなにがどう処理されて最初のマップの処理が残ってしまているのか教えてもらいたいです。
マップ移動というのは、旧マップから新マップへ、マップ画像だけでなく、マップの壁などの当たり判定用情報も切り替えるということでしょうか。
だとすると、hantei配列の中身を、新しいマップ用の当たり判定用情報へ切り替える必要があると思うのですが、そこの処理が無いように思います。

xxxcloudxxx

Re: マップ移動の処理

#7

投稿記事 by xxxcloudxxx » 13年前

beatle さんが書きました: マップ移動というのは、旧マップから新マップへ、マップ画像だけでなく、マップの壁などの当たり判定用情報も切り替えるということでしょうか。
だとすると、hantei配列の中身を、新しいマップ用の当たり判定用情報へ切り替える必要があると思うのですが、そこの処理が無いように思います。
回答ありがとうございます。
確かに背景の画像を動かしているだけで当たり判定用の情報はきりかえてなかったです(T_T)
そこであらたに質問なのですがどこの部分に[もし画面が切り替わったら新しいMAPの情報を読み込むようにできるのでしょうか?]
できればサンプルソースコードなどを貼っていただけると幸いです^^

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: マップ移動の処理

#8

投稿記事 by beatle » 13年前

xxxcloudxxx さんが書きました:回答ありがとうございます。
確かに背景の画像を動かしているだけで当たり判定用の情報はきりかえてなかったです(T_T)
気づいて良かったですね。
そこまで分かったのでしたら、もう少しご自分で試行錯誤なさるというのはどうでしょうか。すぐに質問してしまうのではなくて。
数日くらい格闘して、それでも無理そうだったらまた質問なさるほうが、僕は良いと思います。

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

Re: マップ移動の処理

#9

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

スタート時のマップから当たり判定データを別の配列やファイルから取得する仕組みにまず変えてみてはどうでしょうか?そうすれば2マップ目の処理も自然と出来るようになります。
マップサイズは可変するでしょうから配列の動的確保(malloc)なども必要でしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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