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 :)
mi przykro .. zrobiłem niewłaściwa pasta do kopiowania. Zmieniłem to w powyższym pytaniu. Ale problem nadal istnieje –