アクションゲームにおける、マップチップとキャラクターとの当たり判定について
Posted: 2009年6月11日(木) 18:18
はじめまして。
今僕はアクションゲームの、マップチップとキャラクターとの判定の仕方で悩んでいます。
下記コードのようにして、現在キャラクターがいる座標からどこのマップチップの位置にいるか判定し、そこに障害物があれば移動できないようにする、というふうに作ってみたつもりなのですが…。
キャラクターが上または下の障害物に当たった場合に、その場でキャラクターが停止せず右方向に移動してしまいます。
もし、原因わかりましたらご教示お願いします。
(Cに関する知識は、基礎Cを読んだ程度です。
今僕はアクションゲームの、マップチップとキャラクターとの判定の仕方で悩んでいます。
下記コードのようにして、現在キャラクターがいる座標からどこのマップチップの位置にいるか判定し、そこに障害物があれば移動できないようにする、というふうに作ってみたつもりなのですが…。
キャラクターが上または下の障害物に当たった場合に、その場でキャラクターが停止せず右方向に移動してしまいます。
もし、原因わかりましたらご教示お願いします。
(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 ; // ソフトの終了
}