2013-08-31 8 views
6

usiłuję portu wykrywanie kolizji na piksel doskonały Cocos2dx oryginalna wersja została wykonana dla Cocos2d i można znaleźć tutaj: http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/Pixel Idealne Collision Detection w Cocos2dx

Oto mój kod na Cocos2dx wersja

 
bool CollisionDetection::areTheSpritesColliding(cocos2d::CCSprite *spr1, cocos2d::CCSprite *spr2, bool pp, CCRenderTexture* _rt) { 
    bool isColliding = false; 
    CCRect intersection; 
    CCRect r1 = spr1->boundingBox(); 
    CCRect r2 = spr2->boundingBox(); 
    intersection = CCRectMake(fmax(r1.getMinX(),r2.getMinX()), fmax(r1.getMinY(), r2.getMinY()) ,0,0); 
    intersection.size.width = fmin(r1.getMaxX(), r2.getMaxX() - intersection.getMinX()); 
    intersection.size.height = fmin(r1.getMaxY(), r2.getMaxY() - intersection.getMinY()); 

    // Look for simple bounding box collision 
    if ((intersection.size.width>0) && (intersection.size.height>0)) { 
     // If we're not checking for pixel perfect collisions, return true 
     if (!pp) { 
      return true; 
     } 

     unsigned int x = intersection.origin.x; 
     unsigned int y = intersection.origin.y; 
     unsigned int w = intersection.size.width; 
     unsigned int h = intersection.size.height; 
     unsigned int numPixels = w * h; 
     //CCLog("Intersection X and Y %d, %d", x, y); 
     //CCLog("Number of pixels %d", numPixels); 

     // Draw into the RenderTexture 
     _rt->beginWithClear(0, 0, 0, 0); 

     // Render both sprites: first one in RED and second one in GREEN 
     glColorMask(1, 0, 0, 1); 
     spr1->visit(); 
     glColorMask(0, 1, 0, 1); 
     spr2->visit(); 
     glColorMask(1, 1, 1, 1); 

     // Get color values of intersection area 
     ccColor4B *buffer = (ccColor4B *)malloc(sizeof(ccColor4B) * numPixels); 
     glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 

     _rt->end(); 

     // Read buffer 
     unsigned int step = 1; 
     for(unsigned int i=0; i 0 && color.g > 0) { 
       isColliding = true; 
       break; 
      } 
     } 

     // Free buffer memory 
     free(buffer); 
    } 


    return isColliding; 
} 

Mój kod działa idealnie, jeśli wyślę parametr "pp" jako false. Dzieje się tak, jeśli zrobię tylko kolizję obwiedni, ale nie jestem w stanie sprawić, by działała poprawnie w przypadku, gdy potrzebuję kolizji Pixel Perfect. Myślę, że kod maskujący OpenGL nie działa tak, jak zamierzałem.

Oto kod dla „_rt”

 
    _rt = CCRenderTexture::create(visibleSize.width, visibleSize.height); 
    _rt->setPosition(ccp(origin.x + visibleSize.width * 0.5f, origin.y + visibleSize.height * 0.5f)); 
    this->addChild(_rt, 1000000); 
    _rt->setVisible(true); //For testing 

myślę, że jestem popełnienia błędu przy realizacji niniejszego CCRenderTexture

Może ktoś poprowadzi mnie z tego, co robię źle?

Dziękuję za poświęcony czas :)

Odpowiedz

1

Nie jesteś krokowym przez bufor prawidłowo.

// Read buffer 
unsigned int step = 1; 
for(unsigned int i=0; i<numPixels; i+=step) 
{ 
    ccColor4B color = buffer; 

    if (color.r > 0 && color.g > 0) 
    { 
     isCollision = YES; 
     break; 
    } 
} 

źródło: http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/#post-337907

+0

mi przykro .. zrobiłem niewłaściwa pasta do kopiowania. Zmieniłem to w powyższym pytaniu. Ale problem nadal istnieje –

3

Wreszcie rozwiązano ten problem. Musiałem użyć niestandardowych shaderów fragmentów OpenGL, aby odcień jednego z duszków całkowicie CZERWONY, a drugi całkowicie NIEBIESKI, a następnie zapętlając wartości glReadPixels, aby znaleźć dowolny piksel posiadający zarówno CZERWONE, jak i NIEBIESKIE piksele. (Mieszanie musi być uważane za dobrze, nie chcemy, aby zastąpić jedną wartość piksela przez drugą)

szczegółowych informacji można znaleźć na moim blogu http://blog.muditjaju.infiniteeurekas.in/?p=1

Powiązane problemy