2015-01-22 1 views
0

SDL 게임 프레임 워크에 픽셀 단위 충돌을 구현하려고합니다. 표면의 특정 픽셀에 대한 알파 값 (RGBA)을 찾는 데 문제가 있습니다. SDL 기능을 사용하고 있습니다.픽셀 색의 알파 값과 SDL을 사용하는 Per-Pixel-Collision

SDL_GetRGBA(pixelColor, pixelFormat, &red, &green, &blue, &alpha); 

게임 충돌 : 게임 충돌은 pixelColor 변수 (코드의 주석을 참조) 초기화 할 것입니다 때. 문제는 * p 포인터와 나중에 SDL_GetRGBA() 메서드에서 매개 변수로 사용되는 pixelColor 변수와 관련이있는 것으로 보입니다.

변수 bpp : 변수 bpp에 대해 108이라는 값을 얻습니다. 때로는 106이고 일부 경우에는 bpp (픽셀 당 바이트)가 255입니다. 그러나이 값들은 완전히 잘못되었습니다. 0x00c1e11c {} ???
pixelFormat :! SDL2.dll 0x6c80d62c {포맷 = 10,746,688 팔레트 = 0x00a3fb40}는 화소 당 1 개 또는 2 또는 3 또는 4 바이트 ...

P (http://wiki.libsdl.org/SDL_PixelFormat)

되어야

여기서 충돌 검출을위한 픽셀의 알파 값을 취득하기위한 제 완전한 기능이다

(사람들은 다른 중요한 변수의 값이다). 이 부분은이 자습서 (http://www.sdltutorials.com/sdl-per-pixel-collision)에서 가져옵니다.

int CollisionHandler::GetAlphaXY(SDL_Surface* surface, int x, int y) 
{ 
    // get the specific pixel for checking the alpha value at x/y 

    SDL_PixelFormat* pixelFormat = surface->format; 
    int bpp = pixelFormat->BytesPerPixel; 

    Uint8* p = (Uint8*)surface->pixels + y * surface->pitch + x * bpp; 

    // ! here the game crashes 
    Uint32 pixelColor = *p;  

    // get the RGBA values 

    Uint8 red, green, blue, alpha; 

    // this function fails, sometimes the game crashes here 
    SDL_GetRGBA(pixelColor, pixelFormat, &red, &green, &blue, &alpha); 

    return alpha; 
} 

코드가 맞다고 생각하지만 테스트를 위해 사용하고있는 두 객체가 충돌 할 때 런타임 오류가 발생합니다. 픽셀 당 충돌이 충돌을 인식해야하지만 사각형이 충돌하는 경우 프로그램이 충돌하지 않습니다.

이 내 픽셀 당-충돌 방법은 같은 모습입니다 :

bool CollisionHandler::Per_Pixel_Collision(GameObject* obj1, GameObject* obj2) 
{ 
    // only do pixel collision if rectangles collide 

    if (Rect_Collision(obj1, obj2)) 
    { 
     int top = max(top1, top2); 
     int left = max(left1, left2); 
     int bottom = min(bottom1, bottom2); 
     int right = min(right1, right2); 

     // from the top to the bottom 

     for (int y = top; y < bottom; y++) 
     { 
      // from the left to the right 

      for (int x = left; x < right; x++) 
      { 
       // if both alpha values are zero -> both pixels transparent 

       if (GetAlphaXY(obj1->getTexture().getSurface(), x, y) == 0 && GetAlphaXY(obj2->getTexture().getSurface(), x, y) == 0) 
       { 
        return false; 
       } 
       else 
       { 
        return true; 
       } 

      } 
     } 
    } 
} 
+0

top1, top2 등은 제공된 코드에서 정의되지 않습니다. 이것들은 매우 중요합니다. 또한 Rect_Collision이 오류를 생성하지 않는다는 것을 어떻게 알 수 있습니까? – Martin

+0

직사각형 충돌 감지가 정상적으로 작동하며 테스트했습니다. Rect_Collision() 메서드에 대한 코드를 붙여 넣기를 원하지 않습니다. 너무 많이 사용하기 때문입니다. 그러나 문제없이 확실히 작동합니다. 충돌은 픽셀 당 충돌로 인해 발생합니다. – huzzm

+0

디버거를 사용하여 어떤 줄 충돌이 발생했는지 확인하는 것이 좋습니다. 그러면 잘못된 점을 쉽게 발견 할 수 있습니다. – HolyBlackCat

답변

2

좋아, 내가 한 실수는 바보입니다. 게임이 추락 한 이유는 표면이 비어 있고 표면의 멤버도 그렇기 때문입니다. 왜냐하면 텍스처의 초기화를 처리하고있는 제 질감 클래스에서 제가 전화했기 때문입니다.
SDL_FreeSurface() 그래서 아무것도 작동하지 않습니다. pixelFormat, pixelColor 값 등은 모두 FeeSurface를 통해 0으로 설정되었습니다. 이제 나는이 문제를 해결했으며, 나는 단지 같은 실수를 저질렀던 다른 사람들을 위해 그것을 적어두고 싶다.

관련 문제