壁の判定
Posted: 2008年1月25日(金) 02:17
こんにちは。実は今パックマンを作ってますが、壁の判定が上手くいかず悩んでます。
環境:WindowsXp VC++ 2005 Express
ライブラリはSDLを使ってます。
W100,H100、1ブロック20ピクセルで区切ったとして
int GameMap[5][5]={ 1,1,1,1,1},
{ 1,0,0,0,1},
{ 1,0,0,0,1},
{ 1,0,0,0,1},
{ 1,1,1,1,1},};
bool Key[KEY_MAX];
void GetKey()
{
static Uint8 *keys;
for(int i=0;i<_KEY_MAX;i++)//初期化
Keys=false;
keys=SDL_GetKeyState(NULL);//Key入力を読み取る
if(Key[SDLK_UP]==1)Key[_UP]=1;
if(Key[SDLK_DOWN]==1)Key[_UP]=1;
if(Key[SDLK_LEFT]==1)Key[_UP]=1;
if(Key[SDLK_RIGHT]==1)Key[_UP]=1;
}
void Move_Character(Pac *pacman)
{
static int move = 2;
if((pacman->pos.x%20==0)&&(pacman->pos.y%20==0))
if(pacman->KeyPress==true){//dst パックマンの方向
if(Keys[_UP]==true)pacman->dic=_UP;
if(Keys[_DOWN]==true)pacman->dic=_DOWN;
if(Keys[_LEFT]==true)pacman->dic=_LEFT;
if(Keys[_RIGHT]==true)pacman->dic=_RIGHT;
}
if(MapPos(pacman->pos.x,pacman->pos.y,pacman->dic)==0){//通行可能なら
if (Chara->dst==_UP)pacman->pos.y-=move;
else if(Chara->dst==_DOWN)pacman->pos.y+=move;
else if(Chara->dst==_LEFT)pacman->pos.x-=move;
else if(Chara->dst==_RIGHT)pacman->pos.x+=move;
}
}
Blit_Pac(pacman);//キャラクターイメージ描画
}
int MapPos(int x,int y,int d)//B_S = 20
{
if(d==_UP) return GameMap[(y/B_S)-1][x/B_S];
if(d==_DOWN) return GameMap[(y/B_S)+1][x/B_S];
if(d==_LEFT) return GameMap[y/B_S][(x/B_S)-1];
if(d==_RIGHT)return GameMap[y/B_S][(x/B_S)+1];
return 0;
}
void Blit_Pac(Pac *Chara)
{
SDL_BlitSurface( Chara->Img,&Chara->anime[Chara->dic%4][Chara->motion%2],Screen,&Chara->pos);
Motion(Chara);
}
typedef struct Pac{//パックマン
SDL_Surface *Img;//画像イメージ
SDL_Rect pos;//表示する座標位置 x,y,w,h
Uint8 dic;//Direction キャラクターの方向
Uint8 motion;//モーションパターン
SDL_Rect anime[4][2];
bool KeyPress;//キーが離されてるか
}pac;
キー入力が無ければ最後に入力された方向に向かって動き続けるように作りたいのですが...
何故か画面左端、画面上に到達すると(GameMap[0][...],GameMap[...][0])止まってしまい動かなくなります。(キー入力不可能になる)
それ以外の場所では特に問題なく動ける(画面右端、画面下で動きは止まるが、キー入力出来ます)
<