2013-08-31 8 views
6

sto cercando di porto il rilevamento dei pixel perfetta collisione Cocos2dx versione originale è stato fatto per Cocos2d e può essere trovato qui: http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/Pixel Perfect Collision Detection in Cocos2dx

Ecco il mio codice per la Cocos2dx versione

 
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; 
} 

Il mio codice funziona perfettamente se invio il parametro "pp" come falso. Cioè se faccio solo una collisione limite, ma non sono in grado di farlo funzionare correttamente per il caso quando ho bisogno di collisione Pixel Perfect. Penso che il codice di mascheramento opengl non funzioni come volevo.

Ecco il codice per "_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 

penso che sto facendo un errore con l'attuazione della presente CCRenderTexture

Qualcuno mi può guidare con quello che sto facendo male?

Grazie per il vostro tempo :)

risposta

1

Non stanno intensificando attraverso il buffer in modo corretto.

// 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; 
    } 
} 

fonte: http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/#post-337907

+0

mi dispiace .. Ho fatto un copia incolla errata L'ho modificato nella domanda di cui sopra ora .. Ma il problema rimane ancora –

3

Infine risolto il problema. È stato necessario utilizzare ombreggiatori di frammenti opengl personalizzati per ombreggiare uno degli sprite completamente ROSSO e l'altro completamente BLU e quindi passare attraverso i valori di glReadPixels per trovare tutti i pixel con i pixel ROSSO e BLU. (Fusione deve essere considerata come bene, non vogliamo sostituire un valore pixel per l'altro)

In-Depth informazioni possono essere trovate nel mio blog http://blog.muditjaju.infiniteeurekas.in/?p=1