2011-10-12 3 views
0

그래서 하나의 스프라이트가 다른 스프라이트와 충돌하기를 원하는 아주 간단한 프로그램을 만들고 있습니다. 2 차원 배열을 사용하여 이미지가있는 격자를 만들어 '레벨'을 만들었습니다. 간단한 충돌을 어떻게 구현합니까? 나는 예제를 코딩 해 주시면 고맙겠습니다. 그래서 실제로는 을 볼 수 있습니다. 감사. 여기 코드는 다음과 같습니다 작동하지 않습니다2 차원 배열의 .bmp와의 단순 충돌?

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

pacmanPosX 및 pacmanPosY를 각 사각형의 크기 (32)로 나눈 다음 int로 캐스팅하여 landTitle 배열에 해당하는 팩커의 위치를 ​​계산하는 경우. 그러면 당신 앞에있는 위치가 landTile에서 1 또는 0으로 설정되었는지 간단히 확인할 수 있습니다. 그런 식으로 매우 간단하고 빠른 충돌을 얻을 수 있습니다.

당신이 어떤 방해

편집에 들어갈 경우에 저에게

내 말하는 모든 벽이지도에 있어야 할 곳에 설명 당신이 배열입니다. 따라서 스프라이트 충돌을 수행 할 필요가 없으며 배열에 있어야하는 위치를 기반으로 간단한 충돌 검사를 수행 할 수 있습니다. 맵에 이동 당신이 생각하는 경우를 고려할 수 있습니다 : 당신이 당신의 위치에서 하나 개의 픽셀 위쪽으로 충돌이 충돌에 해당하는

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

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

경우, 먹으 렴 어떤 계산에서 -1colPosY입니다.

편집 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]; 
} 
+0

죄송합니다, 이해가 안 좋아 할 것입니다. 내가 얻을 수있는 것은 다음과 같습니다. bool collision = false; int pacmanposition = (pacmanPosX/32) + (pacmanPosX/32); if (pacmanposition = landTile [1]) // 단색이어야하는 타일입니다. { collision = true; } 나는 그것을 시도조차하지 않을 것이다. 나는 단지 내가 여기서 뭘하는지 모르지만, 그것은 나에게 너무 추상적이다. 나는 이것이 포인터와 수업보다 더 어려울 것이라고 결코 예상하지 못했습니다. – Turbosheep

+0

답변을 편집하여 추가 설명을하겠습니다. – Udrian

+0

밀도가 떨어지면 죄송 합니다만 32 부분으로 나누는 이유는 무엇입니까? 그리고 마지막으로 ... (bool) landtitle [colPosx] [colPosY] 행을 얻지 못합니다. 그런 배열 전에 중괄호에 사용 된 bool을 보지 못했습니다. 이것은 매우 초조한데, 이것은 그렇게 어려운 것이 아닙니다. 나는 아직도 이것들을 얻지 못한다. 오, 제 질문의 끝을 확인하십시오 ... 코드에 논리적 오류가있는 것 같습니다. – Turbosheep

관련 문제