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 :)
mi dispiace .. Ho fatto un copia incolla errata L'ho modificato nella domanda di cui sopra ora .. Ma il problema rimane ancora –