struct Vector2d* collisionPixelPerfect(const struct Entity *entity1, const struct Entity *entity2, unsigned int* pixels_len) { if (!collisionBoundingBox(entity1, entity2)) { return 0; } struct Vector2i topLeft, bottomRight; if (entity1->position.y > entity2->position.y) { topLeft.y = (int)floor(entity1->position.y); } else { topLeft.y = (int)floor(entity2->position.y); } if ((entity1->position.y + entity1->sprite->h) < (entity2->position.y + entity2->sprite->h)) { bottomRight.y = (int)floor(entity1->position.y + entity1->sprite->h); } else { bottomRight.y = (int)floor(entity2->position.y + entity2->sprite->h); } if (entity1->position.x > entity2->position.x) { topLeft.x = (int)floor(entity1->position.x); } else { topLeft.x = (int)floor(entity2->position.x); } if (entity1->position.x + entity1->sprite->w < entity2->position.x + entity2->sprite->w) { bottomRight.x = (int)floor(entity1->position.x + entity1->sprite->w); } else { bottomRight.x = (int)floor(entity2->position.x + entity2->sprite->w); } *pixels_len = 0; struct Vector2d* pixels = NULL; CHAR_INFO empty_pixel; empty_pixel.Attributes = 0; empty_pixel.Char.AsciiChar = 0; for (int y = topLeft.y; y < bottomRight.y; y++) { for (int x = topLeft.x; x < bottomRight.x; x++) { CHAR_INFO pixel1 = spriteAt(entity1->sprite, x - (int)floor(entity1->position.x), y - (int)floor(entity1->position.y)); CHAR_INFO pixel2 = spriteAt(entity2->sprite, x - (int)floor(entity2->position.x), y - (int)floor(entity2->position.y)); if (!eq_charinfo(pixel1, empty_pixel) && !eq_charinfo(pixel2, empty_pixel)) { (*pixels_len)++; pixels = (struct Vector2d*)realloc(pixels, sizeof(struct Vector2d) * (*pixels_len)); pixels[(*pixels_len) - 1].x = x; pixels[(*pixels_len) - 1].y = y; } } } if (pixels) { int sek = 0; } return pixels; }
void Enemy::checkForAndResolveCollisions() { CCPoint playerPos = getPosition(); CCArray* tiles = getSurroundingTilesAtPosition(playerPos); CCObject* obj; _onGround = false; bool isSideHit = false; CCARRAY_FOREACH(tiles,obj) { CCDictionary* dict = (CCDictionary*)obj; Integer* x = (Integer*)dict->objectForKey("x"); Integer* y = (Integer*)dict->objectForKey("y"); float height = _map->getTileSize().height; float width = _map->getTileSize().width; //_debugDraw->appendRect(ccp(x->getValue(), y->getValue()), width, height); CCRect pRect = collisionBoundingBox(); //_debugDraw->appendRect(ccp(pRect.getMinX(), pRect.getMinY()), pRect.getMaxX() - pRect.getMinX() , pRect.getMaxY() - pRect.getMinY(), 1.0f, 0.0f, 0.0f); Integer* gid = (Integer*)dict->objectForKey("gid"); if(gid->getValue()) { CCRect tileRect = CCRectMake((float)x->getValue(),(float)y->getValue(), _map->getTileSize().width, _map->getTileSize().height); if(pRect.intersectsRect(tileRect)) { CCRect intersectRect = pRect.intersectsWithRect(tileRect); int tileIndx = tiles->getIndexOfObject(obj); //CCLOG("tileIndx %d : " ,tileIndx); if(tileIndx == 0) { //CCLOG("0 intersect "); //_debugDraw->appendRect(ccp(intersectRect.getMinX(), intersectRect.getMinY()), intersectRect.getMaxX() - intersectRect.getMinX() , intersectRect.getMaxY() - intersectRect.getMinY(), 1.0f, 0.0f, 0.0f); _onGround = true; setVelocity(ccp(getVelocity().x, 0.0f)); setDesiredPosition(ccp(getDesiredPosition().x, getDesiredPosition().y + intersectRect.size.height)); //_player->setDesiredPosition(ccp(_player->getDesiredPosition().x, 13)); //CCLOG("Player box %f", tileRect.getMaxY() - pRect.getMinY()); //CCLOG("tile box %f", tileRect.getMaxY()); //CCLOG("intersectRect box %f", intersectRect.size.height); } else if(tileIndx == 1) { //CCLOG("1 intersect "); setDesiredPosition(ccp(getDesiredPosition().x, getDesiredPosition().y - intersectRect.size.height)); } else if(tileIndx == 2) { //CCLOG("2 intersect "); isSideHit = true; setVelocity(ccp(0.0f,getVelocity().y)); setDesiredPosition(ccp(getDesiredPosition().x + intersectRect.size.width, getDesiredPosition().y)); } else if(tileIndx == 3) { //CCLOG("3 intersect "); isSideHit = true; setVelocity(ccp(0.0f,getVelocity().y)); setDesiredPosition(ccp(getDesiredPosition().x - intersectRect.size.width, getDesiredPosition().y)); } else { if(intersectRect.size.width > intersectRect.size.height) { float resolutionHeight; if(tileIndx > 5) { resolutionHeight = intersectRect.size.height; setVelocity(ccp(getVelocity().x, 0.0f)); _onGround = true; } else { resolutionHeight = -intersectRect.size.height; } setDesiredPosition(ccp(getDesiredPosition().x, getDesiredPosition().y + resolutionHeight )); } else { float resolutionWidth; if (tileIndx == 6 || tileIndx == 4) { resolutionWidth = intersectRect.size.width; } else { resolutionWidth = -intersectRect.size.width; } setDesiredPosition(ccp(getDesiredPosition().x + resolutionWidth, getDesiredPosition().y )); } //if((tileIndx == 5 || tileIndx == 4) && getVelocity().y > 0 && !isSideHit) } } } }