, если вы вычислите положение pacman, чтобы оно соответствовало массиву landTitle, разделив pacmanPosX и pacmanPosY на размер каждого квадрата (32), а затем приведите его к int.тогда вы можете просто проверить, установлено ли перед вами положение 1 или 0 в landTile, и таким образом вы можете получить очень простое и быстрое столкновение.
Скажите, попадаете ли вы в какие-либо препятствия
РЕДАКТИРОВАТЬ
Я имею в виду, что вы массив, который объясняет, где все стены должны быть на вашей карте.Из-за этого вам не нужно делать никаких столкновений спрайтов, вместо этого вы можете выполнить простую проверку столкновений в зависимости от того, где вы должны быть в массиве.Давайте рассмотрим случай, когда вы должны двигаться вверх по карте:
int colPosX = pacmanPosX / 32;
int colPosY = (pacmanPosY-1) / 32;
bool collision = (bool)landTitle[colPosX][colPosY];
, если столкновение истинно, тогда у вас есть столкновение на один пиксель вверх от вашей позиции, вот что -1 в расчете colPosY предназначен для.
Изменить 2
Если бы мне нужно было отредактировать ваш код, я бысделай это больше так
int blockSize = 32;
int pacmanPosX = blockSize * 1;
int pacmanPosY = blockSize * 1;
Sprite pacman (new Surface( "assets/tiles/pacman.png"), 1);
Surface* tileSet[2];
int landTile[14][16] = {{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, 1, 1,},
{1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1,},
{1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1,},
{1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1,},
{1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,},
{1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1,},
{1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1,},
{1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1,},
{1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1,},
{1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1,},
{1, 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,}};
void Game::Init()
{
// put your initialization code here; will be executed once
tileSet[0] = new Surface( "assets/tiles/void.bmp" ); // Sets up data for tileSet
tileSet[1] = new Surface( "assets/tiles/wall.bmp" );
}
void Game::Tick( float a_DT )
{
m_Screen->Clear( 0 );
for (int indexX = 0; indexX <= 14; indexX++)
{
for (int indexY = 0; indexY <= 16; indexY++)
{
int tile = landTile[indexY][indexX];
tileSet[tile]->CopyTo( m_Screen, indexX * blockSize, indexY * blockSize );
}
}
if (GetAsyncKeyState( VK_UP ) && CheckCollision(0,-1)) pacmanPosY -=2;
if (GetAsyncKeyState( VK_DOWN ) && CheckCollision(0, 1)) pacmanPosY += 2;
if (GetAsyncKeyState( VK_RIGHT ) && CheckCollision(1, 0)) pacmanPosX += 2;
if (GetAsyncKeyState( VK_LEFT ) && CheckCollision(-1,0)) pacmanPosX -= 2;
Sleep( 10 );
}
bool Game::CheckCollision(int dirX, int dirY){
return (bool)landTile[(pacmanPosX+dirX)/blockSize][(pacmanPosY+dirY)/blockSize];
}