Простое столкновение с .bmp в двумерном массиве? - PullRequest
0 голосов
/ 12 октября 2011

поэтому я делаю действительно простую программу, в которой я хочу, чтобы один спрайт сталкивался с другим.Я сделал «уровень», сделав сетку с изображениями, используя двумерный массив.Как бы я реализовал простое столкновение?Я был бы признателен за примеры кодирования, поэтому я действительно могу видеть, что происходит.Благодарю.Вот код:

int pacmanPosX = 32;
int pacmanPosY = 32;

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 * 32, indexY * 32 );
        }
    }

    pacman.Draw(pacmanPosX, pacmanPosY, m_Screen);



    Sleep( 10 );

int colPosX =  pacmanPosX    / 32; 
int colPosY = (pacmanPosY-1) / 32; 

bool collision = (bool)landTile[colPosX][colPosY]; 


int direction;

if(collision = false)
{
    if (GetAsyncKeyState( VK_UP )) pacmanPosY -=2;
    if (GetAsyncKeyState( VK_DOWN ))  pacmanPosY += 2;
    if (GetAsyncKeyState( VK_RIGHT )) pacmanPosX += 2;
    if (GetAsyncKeyState( VK_LEFT ))  pacmanPosX -= 2;
}


}

Это не работает, персонаж теперь не может двигаться вообще.К вашему сведению, каждый спрайт имеет размер 32x32, включая символ.

1 Ответ

1 голос
/ 12 октября 2011

, если вы вычислите положение 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];
}
...