今僕はアクションゲームの、マップチップとキャラクターとの判定の仕方で悩んでいます。
下記コードのようにして、現在キャラクターがいる座標からどこのマップチップの位置にいるか判定し、そこに障害物があれば移動できないようにする、というふうに作ってみたつもりなのですが…。
キャラクターが上または下の障害物に当たった場合に、その場でキャラクターが停止せず右方向に移動してしまいます。
もし、原因わかりましたらご教示お願いします。
(Cに関する知識は、基礎Cを読んだ程度です。
#include "DxLib.h" #define MAP_SIZE 32 // マップチップ一つのドットサイズ #define MAP_WIDTH 20 // マップの幅 #define MAP_HEIGHT 15 // マップの縦長さ // マップのデータ int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] = { { 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0 } , } ; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode( TRUE ) ; // ウインドウモードに変更 if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 SetDrawScreen( DX_SCREEN_BACK ) ; int i , j, imageMap, imageChara, charax, charay; char Key[256]; charax = 320; charay = 240; imageMap = LoadGraph( "map.png" ) ; imageChara = LoadGraph( "robo.png") ; while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]) { // マップを描く for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { if( MapData[ i ][ j ] == 0 ) //0のとき障害物描画 { DrawGraph( j * MAP_SIZE , i * MAP_SIZE , imageMap , FALSE ) ; } } } //------------------ //キャラクターの描画 DrawGraph(charax , charay , imageChara , TRUE ) ; if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら charax--; //左に移動 if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら charax++; //右に移動 if( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら charay--; //上に移動 if( Key[ KEY_INPUT_DOWN] == 1 ) //下ボタンが押されたら charay++; //下に移動 //マップチップとの判定 //左 if(MapData[(int)charay / 32][(int)charax / 32] == 0 || MapData[(int)(charay + 32 - 1) / 32][(int)charax / 32] == 0) { charax = ((int)charax / 32 + 1) * 32; } //右 if(MapData[(int)charay / 32][(int)(charax + 32 - 1) / 32] == 0 || MapData[(int)(charay + 32 - 1) / 32][(int)(charax + 32 - 1) / 32] == 0) { charax = ((int)charax / 32 + 1) * 32 - 32; } // 上 if(MapData[(int)charay / 32][(int)charax / 32] == 0 || MapData[(int)charay / 32][(int)(charax + 32 - 1) / 32] == 0) { charay = ((int)charay / 32 + 1) * 32; } // 下 if(MapData[(int)(charay + 32 - 1) / 32][(int)charax / 32] == 0 || MapData[(int)(charay + 32 - 1) / 32][(int)(charax + 32 - 1) / 32] == 0) { charay = ((int)(charay + 32 + 1) / 32) * 32 - 32; } DrawFormatString(100,100, GetColor( 255 , 255 , 255 ) , "%d" , charax); DrawFormatString(100,120, GetColor( 255 , 255 , 255 ) , "%d" , charay); ScreenFlip(); } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }