壁の当たり判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jun3453
記事: 22
登録日時: 13年前
住所: 東京

壁の当たり判定について

#1

投稿記事 by jun3453 » 8年前

現在Dxライブラリでアクションゲームを作っています。

マップを制作するにあたり、map配列にint型データを入れています。
キャラクターは四角い判定で、四隅に判定を持ち、マップと照らし合わせて衝突判定を取っています。

天井、床の当たり判定はうまくいったのですが、
壁の当たり判定がうまくいきません。

当たり判定の条件がいけないと思ったのですが、うまいこと思いつきませんでした。
ここが原因であろうというコードを載せておきます。
助言お願いします!

コード:


/*
現在のマップ配列
static int Map_1[MAP_Y_MAX][MAP_X_MAX] = 
	{
		{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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},
		{0,0,0,0,0,0,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,1,0,0,0,},
		{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,},
		{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},
	};
*/

		// 左上、右上座標に触れるとき
		if( map ->Map1cpy[ luy[i] ] [lux[i] ] == 1 ||
			map ->Map1cpy[ ruy[i] ] [rux[i] ] == 1){
			unit[i] -> y = unit[i] -> y / 64*64 + 64;
		}else		

		// 左下、右下座標に触れるとき
		if( map ->Map1cpy[ ldy[i] ] [ldx[i] ] == 1 ||
			map ->Map1cpy[ rdy[i] ] [rdx[i] ] == 1){
			unit[i] -> y = unit[i] -> y / 64*64 ;
			
			// ブースト徐々に回復
			if(unit[i] -> Boost <= 100){
				unit[i] -> Boost += 3;
			}

		}else

		// 左上、左下座標に触れるとき
		if( map ->Map1cpy[ luy[i] ] [lux[i] ] == 1 ||
			map ->Map1cpy[ ldy[i] ] [ldx[i] ] == 1){
			unit[i] -> x = unit[i] -> x / 64*64 + 64;
			
		}else

		// 右上、右下座標に触れるとき
		if( map ->Map1cpy[ ruy[i] ] [rux[i] ] == 1 ||
			map ->Map1cpy[ rdy[i] ] [rdx[i] ] == 1){
			unit[i] -> x = unit[i] -> x / 64*64;
		}

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

Re: 壁の当たり判定について

#2

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

jun3453 さんが書きました:ここが原因であろうというコードを載せておきます。
提示されたコードにはmap、Map1cpy、lux、luyなどの謎の識別子が用いられており、意味不明です。
デバッグではなるべく余計な思い込みを避け、間違っていない、または間違っていることを確かめていかなければいけません。
コンパイルして実行でき、問題を再現できるコードを提示していただけるとありがたいです。
jun3453 さんが書きました:壁の当たり判定がうまくいきません。
「うまくいきません」とは、具体的にどういうことでしょうか?
入力、期待する動作、実際の動作を具体的に書かないとわかりにくいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

jun3453
記事: 22
登録日時: 13年前
住所: 東京

Re: 壁の当たり判定について

#3

投稿記事 by jun3453 » 8年前

みけCATさん返信ありがとうございます。
問題を再現できるコードを準備しました。

キー移動で壁にぶつかると下の方に急速に加速してしまいます。
また、斜め入力をしながら壁に突っ込むと壁の中を移動できてしまいます。
斜め入力を離すと下へ加速していきます。
といった現象が発生してしまいました。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	// Dxライブラリ初期設定
	ChangeWindowMode(true);			// 全画面false ウィンドウtrue
	SetGraphMode(960,540,16);		// 画面サイズ(横、縦、カラービット)
	DxLib_Init();					// DXライブラリ初期化
	SetDrawScreen(DX_SCREEN_BACK);	// 裏画面設定
	SetDrawMode(DX_DRAWMODE_BILINEAR); // 描画設定
	SetWindowText("VsSTG");	// ウィンドウタイトル

	// DXライブラリ初期化処理
	if( DxLib_Init() == -1 ){    
         return -1;    // エラーが起きたら直ちに終了
    }

	// map配列
	int Map_1[9][16] = 
	{
		{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,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,0,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,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,1,0,0,0,},
		{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,},
		{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},
	};


	int x,y; // プレイヤー座標

	x = 100;
	y = 400;

	// 各頂点座標変数
	int leftup_x,leftup_y;
	int leftdown_x,leftdown_y;
	int rightup_x,rightup_y;
	int rightdown_x,rightdown_y;




	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
   while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
	   
	   // マップ描画
		for(int i=0;i<9;i++){
			for(int j=0;j<16;j++){		
				if(Map_1[i][j] == 1){
					DrawBox(j*60,i*60, (j*60)+60,(i*60)+60,GetColor(255,255,255),1);
				}
	
			}
		}
		
		// 左上
		leftup_x = x / 60;
		leftup_y = y / 60;

		// 左下
		leftdown_x =  x     / 60;
		leftdown_y = (y+60) / 60;

	
		// 右上
		rightup_x = (x+60) / 60;
		rightup_y =  y     / 60;

		// 右下
		rightdown_x = (x+60)  / 60;
		rightdown_y = (y+60) / 60;



		// 左上、右上座標に触れるとき
		if( Map_1[ leftup_y ] [leftup_x ] == 1 ||
			Map_1[ rightup_y ] [rightup_x ] == 1 ){
			DrawString(50,90,"up col",GetColor(0,255,0));
			y =  y / 60*60 + 60;
		}else

		// 左下、右下座標に触れるとき
		if( Map_1[ leftdown_y ] [leftdown_x ] == 1 ||
			Map_1[ rightdown_y ] [rightdown_x ] == 1 ){
			DrawString(50,90,"down col",GetColor(0,255,0));
			y =  y / 60*60 ;
		}else

		// 左上、左下座標に触れるとき
		if( Map_1[ leftup_y ] [leftup_x ] == 1 ||
			Map_1[ leftdown_y ] [leftdown_x ] == 1 ){
			DrawString(50,90,"left col",GetColor(0,255,0));
			x = x / 60*60 + 60;
		}else

		// 右上、右下座標に触れるとき
		if( Map_1[ rightup_y ] [rightup_x ] == 1 ||
			Map_1[ rightdown_y ] [rightdown_x ] == 1 ){
			DrawString(50,90,"right col",GetColor(0,255,0));
			x = x / 60*60;
		}



		DrawBox(x,y, x+64,y+64,GetColor(255,0,0),1);


		if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
			x+=5;
		}
		
		if(CheckHitKey(KEY_INPUT_LEFT) == 1){
			x-=5;
		}
		
		if(CheckHitKey(KEY_INPUT_UP) == 1){
			y-=5;
		}

		if(CheckHitKey(KEY_INPUT_DOWN) == 1){
			y+=5;
		}



   }
        

	WaitKey();	// キー入力待ち
	DxLib_End();	// DXライブラリ終了処理
	return 0;

}

アバター
usao
記事: 1887
登録日時: 11年前

Re: 壁の当たり判定について

#4

投稿記事 by usao » 8年前

>下の方に急速に

例えば,ある時79,80行目の条件を満たすと,82行目の処理によりyの値が増えますよね.
で,次回も79,80行目の条件を満たしているならば,やはりyの値が増えますよね.
(yを増やして良いのかどうか等は一切考慮されずにとにかくyの値がひたすら増え続けることが可能ですよね.きっと.)

…ということではないでしょうか.

jun3453
記事: 22
登録日時: 13年前
住所: 東京

Re: 壁の当たり判定について

#5

投稿記事 by jun3453 » 8年前

usaoさんありがとうございます。

たしかに条件式が変だなと思ったので修正しました。
また、角にいるときの条件文を追加しました。
そうしたところ下へ加速することはなくなりました!

次になのですが、
・床沿いに崖の方まで移動したとき。
・壁沿いに先端の方まで移動したとき。
といった場合はどのように組めばよいのでしょうか?
壁沿いに~の方を実装すると床沿いのものができなくなり、
逆もまたしかりといった感じで迷っています。

そういった場合は床沿いフラグ、壁沿いフラグを作って、条件式に追加した方がよろしいでしょうか・・・?
アドバイスお願いいたします。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	// Dxライブラリ初期設定
	ChangeWindowMode(true);			// 全画面false ウィンドウtrue
	SetGraphMode(960,540,16);		// 画面サイズ(横、縦、カラービット)
	DxLib_Init();					// DXライブラリ初期化
	SetDrawScreen(DX_SCREEN_BACK);	// 裏画面設定
	SetDrawMode(DX_DRAWMODE_BILINEAR); // 描画設定
	SetWindowText("VsSTG");	// ウィンドウタイトル

	// DXライブラリ初期化処理
	if( DxLib_Init() == -1 ){    
         return -1;    // エラーが起きたら直ちに終了
    }

	// map配列
	int Map_1[9][16] = 
	{
		{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,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,0,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,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,1,0,0,0,},
		{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,},
		{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},
	};


	int x,y; // プレイヤー座標

	x = 100;
	y = 400;

	// 各頂点座標変数
	int leftup_x,leftup_y;
	int leftdown_x,leftdown_y;
	int rightup_x,rightup_y;
	int rightdown_x,rightdown_y;




	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
   while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
	   
	   // マップ描画
		for(int i=0;i<9;i++){
			for(int j=0;j<16;j++){		
				if(Map_1[i][j] == 1){
					DrawBox(j*60,i*60, (j*60)+60,(i*60)+60,GetColor(255,255,255),1);
				}
	
			}
		}
		
		// 左上
		leftup_x = x / 60;
		leftup_y = y / 60;

		// 左下
		leftdown_x =  x     / 60;
		leftdown_y = (y+60) / 60;

	
		// 右上
		rightup_x = (x+60) / 60;
		rightup_y =  y     / 60;

		// 右下
		rightdown_x = (x+60)  / 60;
		rightdown_y = (y+60) / 60;


		// 左上、左下、右下座標に触れるとき
		if( Map_1[ leftup_y ] [leftup_x ] == 1 &&
			Map_1[ leftdown_y ] [leftdown_x ] == 1 &&
			Map_1[ rightdown_y ] [rightdown_x ] == 1){
			DrawString(50,90,"left kado col",GetColor(0,255,0));
			x = x / 60*60 + 60;
			y = y / 60*60 ;
		}else

		// 右上、右下、左下座標に触れるとき
		if( Map_1[ rightup_y ] [rightup_x ] == 1 &&
			Map_1[ rightdown_y ] [rightdown_x ] == 1 &&
			Map_1[ leftdown_y ] [leftdown_x ] == 1){
			DrawString(50,90,"right kado col",GetColor(0,255,0));
			x = x / 60*60;
			y = y / 60*60;
		}else
		
		// 左上、左下座標に触れるとき
		if( Map_1[ leftup_y ] [leftup_x ] == 1 &&
			Map_1[ leftdown_y ] [leftdown_x ] == 1 ){
			DrawString(50,90,"left col",GetColor(0,255,0));
			x = x / 60*60 + 60;
		}else

		// 左上のみ触れている時
		if( Map_1[ leftup_y ] [leftup_x ] == 1 &&
			Map_1[ leftdown_y ] [leftdown_x ] == 0 &&
			Map_1[ rightdown_y ] [rightdown_x ] == 0 &&
			Map_1[ rightup_y ] [rightup_x ] == 0){
			DrawString(50,90,"leftup col",GetColor(0,255,0));
			x = x / 60*60 + 60;
		}else

		// 左下のみ触れている時
		if( Map_1[ leftup_y ] [leftup_x ] == 0 &&
			Map_1[ leftdown_y ] [leftdown_x ] == 1 &&
			Map_1[ rightdown_y ] [rightdown_x ] == 0 &&
			Map_1[ rightup_y ] [rightup_x ] == 0){
			DrawString(50,90,"leftdown col",GetColor(0,255,0));
			x = x / 60*60 + 60;
		}else

		// 右上、右下座標に触れるとき
		if( (Map_1[ rightup_y ] [rightup_x ] == 1 &&
			Map_1[ rightdown_y ] [rightdown_x ] == 1)){
			DrawString(50,90,"right col",GetColor(0,255,0));
			x = x / 60*60;
		}else

		// 右上のみ触れている時
		if( Map_1[ leftup_y ] [leftup_x ] == 0 &&
			Map_1[ leftdown_y ] [leftdown_x ] == 0 &&
			Map_1[ rightdown_y ] [rightdown_x ] == 0 &&
			Map_1[ rightup_y ] [rightup_x ] == 1){
			DrawString(50,90,"rightup col",GetColor(0,255,0));
			x = x / 60*60;
		}else

		// 右上のみ触れている時
		if( Map_1[ leftup_y ] [leftup_x ] == 0 &&
			Map_1[ leftdown_y ] [leftdown_x ] == 0 &&
			Map_1[ rightdown_y ] [rightdown_x ] == 1 &&
			Map_1[ rightup_y ] [rightup_x ] == 0){
			DrawString(50,90,"rightdown col",GetColor(0,255,0));
			x = x / 60*60;
		}else

		// 左上、右上座標に触れるとき
		if( Map_1[ leftup_y ] [leftup_x ] == 1 &&
			Map_1[ rightup_y ] [rightup_x ] == 1 ){
			DrawString(50,90,"up col",GetColor(0,255,0));
			y =  y / 60*60 + 60;
		}else

		// 左下、右下座標に触れるとき
		if( Map_1[ leftdown_y ] [leftdown_x ] == 1 &&
			Map_1[ rightdown_y ] [rightdown_x ] == 1 ){
			DrawString(50,90,"down col",GetColor(0,255,0));
			y =  y / 60*60 ;
		}
		

		
		DrawBox(x,y, x+64,y+64,GetColor(255,0,0),1);

		if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
			x+=5;
		}
		
		if(CheckHitKey(KEY_INPUT_LEFT) == 1){
			x-=5;
		}
		
		if(CheckHitKey(KEY_INPUT_UP) == 1){
			y-=5;
		}

		if(CheckHitKey(KEY_INPUT_DOWN) == 1){
			y+=5;
		}



   }
        

	WaitKey();	// キー入力待ち
	DxLib_End();	// DXライブラリ終了処理
	return 0;

}

アバター
usao
記事: 1887
登録日時: 11年前

Re: 壁の当たり判定について

#6

投稿記事 by usao » 8年前

壁とか崖とか話がいまいち解らないのですけども,
そんなに膨大な条件式を書かないといけないものでしょうか?

単純な「行けたら行く」方式ではダメですか.

コード:

if(CheckHitKey(KEY_INPUT_RIGHT) == 1)
{
  if( 右に5だけ移動しても問題ないなら )x+=5;
}
みたいな.

jun3453
記事: 22
登録日時: 13年前
住所: 東京

Re: 壁の当たり判定について

#7

投稿記事 by jun3453 » 8年前

一応行けたら行く方式で書いてみました。
すり抜けが多いのでこれから修正していきます。

プログラムの参考にしたサイトが
http://zahyou.6.ql.bz/cgame/act/hit.htm
の方法を取っていて、うまくいかなかったのでif文を増やしてしまいました。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	// Dxライブラリ初期設定
	ChangeWindowMode(true);			// 全画面false ウィンドウtrue
	SetGraphMode(960,540,16);		// 画面サイズ(横、縦、カラービット)
	DxLib_Init();					// DXライブラリ初期化
	SetDrawScreen(DX_SCREEN_BACK);	// 裏画面設定
	SetDrawMode(DX_DRAWMODE_BILINEAR); // 描画設定
	SetWindowText("VsSTG");	// ウィンドウタイトル

	// DXライブラリ初期化処理
	if( DxLib_Init() == -1 ){    
         return -1;    // エラーが起きたら直ちに終了
    }

	// map配列
	int Map_1[9][16] = 
	{
		{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,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,0,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,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,1,0,0,0,},
		{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,},
		{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},
	};


	int x,y; // プレイヤー座標

	x = 100;
	y = 400;

	// 各頂点座標変数
	int left_x;
	int leftup_y,leftdown_y;
	int right_x;
	int rightup_y,rightdown_y;


	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
   while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
	   
	   // マップ描画
		for(int i=0;i<9;i++){
			for(int j=0;j<16;j++){		
				if(Map_1[i][j] == 1){
					DrawBox(j*60,i*60, (j*60)+60,(i*60)+60,GetColor(255,255,255),1);
				}
	
			}
		}

	// 左上
		left_x = (x-5) / 60;
		leftup_y = (y-5) / 60;

		// 左下
		leftdown_y = (y+65) / 60;
	
		// 右上
		right_x = (x+65) / 60;
		rightup_y =  (y+5)   / 60;

		// 右下
		rightdown_y = (y+65) / 60;

		
		DrawBox(x,y, x+64,y+64,GetColor(255,0,0),1);

		if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
			if(Map_1[rightup_y][right_x] == 0 ||
			   Map_1[rightdown_y][right_x] == 0 ){
				x+=5;
			}
		}else
		
		if(CheckHitKey(KEY_INPUT_LEFT) == 1){
			if(Map_1[leftup_y][left_x] == 0 ||
			   Map_1[leftdown_y][left_x] == 0 ){
				x-=5;
			}
		}

		if(CheckHitKey(KEY_INPUT_UP) == 1){
			if(Map_1[leftup_y][left_x] == 0 ||
			   Map_1[rightup_y][right_x] == 0 ){
				y-=5;
			}
		}else

		if(CheckHitKey(KEY_INPUT_DOWN) == 1){
			if(Map_1[leftdown_y][left_x] == 0 ||
			   Map_1[rightdown_y][right_x] == 0 ){
				y+=5;
			}
		}



   }
        

	WaitKey();	// キー入力待ち
	DxLib_End();	// DXライブラリ終了処理
	return 0;

}

アバター
usao
記事: 1887
登録日時: 11年前

Re: 壁の当たり判定について

#8

投稿記事 by usao » 8年前

各キー押下時判定が
||ではなく&&であるべきでは?

jun3453
記事: 22
登録日時: 13年前
住所: 東京

Re: 壁の当たり判定について

#9

投稿記事 by jun3453 » 8年前

条件を&&にしたところ、
床にぶつかったときに右、左に行けなくなってしまいました。
壁の時は上下に行けなくなってしまいました。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 壁の当たり判定について

#10

投稿記事 by usao » 8年前

例えば,右キーを押されたときに調べるべきは,
「右上にいける」且つ「右下に行ける」ではなく,「右にいけるかどうか」であるべきかと思います.


「右にいけるかどうか」
 =   「現在のキャラクタ矩形の右上座標 が右に動いた先が壁ではない」
   &&「現在のキャラクタ矩形の右下座標 が右に動いた先が壁ではない」


なので,
rightup_y(←66行目の式が+-間違っている?) や rightdown_y を判定に用いるのは間違っているのではないでしょうか.

jun3453
記事: 22
登録日時: 13年前
住所: 東京

Re: 壁の当たり判定について

#11

投稿記事 by jun3453 » 8年前

確かに間違っていました!
条件式に付ける変数を細かく分けてみました。

コード:

		// 左
		left_x = (x-8) / 60;
		leftup_y = y / 60;
		leftdown_y = (y+60) / 60;
	
		// 右
		right_x = (x+68) / 60;
		rightup_y =  y   / 60;
		rightdown_y = (y+60) / 60;

		// 上
		up1_x = x / 60;
		up2_x =  (x+60)   / 60;
		up_y = (y-8) / 60;

		// 下
		down1_x = x / 60;
		down2_x =  (x+60)   / 60;
		down_y = (y+68) / 60;
これで一つ一つ細かく設定したところ無事に当たり判定の実装ができました。
もう少し簡単な実装ができるような気がしますが、自分には思いつきませんでしたw

サポートしてくださったusaoさんありがとうございました!

また質問があれば投稿いたしますのでその時はよろしくお願いします。

コード:


#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	// Dxライブラリ初期設定
	ChangeWindowMode(true);			// 全画面false ウィンドウtrue
	SetGraphMode(960,540,16);		// 画面サイズ(横、縦、カラービット)
	DxLib_Init();					// DXライブラリ初期化
	SetDrawScreen(DX_SCREEN_BACK);	// 裏画面設定
	SetDrawMode(DX_DRAWMODE_BILINEAR); // 描画設定
	SetWindowText("VsSTG");	// ウィンドウタイトル

	// DXライブラリ初期化処理
	if( DxLib_Init() == -1 ){    
         return -1;    // エラーが起きたら直ちに終了
    }

	// map配列
	int Map_1[9][16] = 
	{
		{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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},
		{0,0,0,0,0,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,1,0,0,0,},
		{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,},
		{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},
	};


	int x,y; // プレイヤー座標

	x = 100;
	y = 400;

	// 各頂点座標変数
	int left_x;
	int leftup_y,leftdown_y;
	int right_x;
	int rightup_y,rightdown_y;

	int up1_x,up2_x,up_y;
	int down1_x,down2_x,down_y;
	
	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
   while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
	   
	   // マップ描画
		for(int i=0;i<9;i++){
			for(int j=0;j<16;j++){		
				if(Map_1[i][j] == 1){
					DrawBox(j*60,i*60, (j*60)+60,(i*60)+60,GetColor(255,255,255),1);
				}
	
			}
		}


		// 左
		left_x = (x-8) / 60;
		leftup_y = y / 60;
		leftdown_y = (y+60) / 60;
	
		// 右
		right_x = (x+68) / 60;
		rightup_y =  y   / 60;
		rightdown_y = (y+60) / 60;

		// 上
		up1_x = x / 60;
		up2_x =  (x+60)   / 60;
		up_y = (y-8) / 60;

		// 下
		down1_x = x / 60;
		down2_x =  (x+60)   / 60;
		down_y = (y+68) / 60;



		DrawBox(x,y, x+64,y+64,GetColor(255,0,0),1);

		// 右
		if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
			if(Map_1[rightup_y][right_x] == 0 &&
			   Map_1[rightdown_y][right_x] == 0 ){
				   
				x+=5;
			}else{
				DrawString(50,90,"right col",GetColor(0,255,0));
			}
		}
		
		// 左
		if(CheckHitKey(KEY_INPUT_LEFT) == 1){
			if(Map_1[leftup_y][left_x] == 0 &&
			   Map_1[leftdown_y][left_x] == 0 ){
				  
				x-=5;
			}else{
				 DrawString(50,100,"left col",GetColor(0,255,0));
			}
		}

		// 上
		if(CheckHitKey(KEY_INPUT_UP) == 1){
			if(Map_1[up_y][up1_x] == 0 &&
			   Map_1[up_y][up2_x] == 0 ){
				   
				y-=5;
			}else{
				DrawString(50,110,"up col",GetColor(0,255,0));
			}
		}

		// 下
		if(CheckHitKey(KEY_INPUT_DOWN) == 1){
			if(Map_1[down_y][down1_x] == 0 &&
			   Map_1[down_y][down2_x] == 0 ){
				  
				y+=5;
			}else{
				 DrawString(50,120,"down col",GetColor(0,255,0));
			}
		}
		
   }
        

	WaitKey();	// キー入力待ち
	DxLib_End();	// DXライブラリ終了処理
	return 0;

}

閉鎖

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