void Physics::addCollisionSpriteSprite(CollidableObject *dynamicObjectA, CollidableObject *dynamicObjectB) { // IF WE'VE ALREADY HANDLED A COLLISION BETWEEN THESE TWO OBJECTS THIS // FRAME THEN IGNORE IT //PAULO- MAYBE IMPORTANT*********************** /*set<CollidableObject*> doSprite = spriteToSpriteCollisionsThisFrame[dynamicObjectB]; if (doSprite.find(dynamicObjectB) != doSprite.end()) return;*/ // FIRST WE'RE GOING TO DO A MORE NARROW CHECK TO SEE IF THE dynamicObject // REALLY DOES COLLIDE WITH THE TILE. TO DO SO WE'LL CALCULATE THE TIME // OF COLLISION. IF IT HAPPENS AFTER THIS FRAME IS OVER (> 1), THEN WE // WILL IGNORE IT unsigned int co1Edge, co2Edge; float timeUntilCollision = calculateTimeUntilCollision(dynamicObjectA,dynamicObjectB, co1Edge, co2Edge, 0.0f); if (timeUntilCollision > 1.0f) return; //// NOW LET'S MAKE A COLLISION FOR THE SPRITE-SPRITE Collision *collisionToAdd = recycledCollisions.back(); collisionToAdd->setCO1(dynamicObjectA); collisionToAdd->setCO2(dynamicObjectB); collisionToAdd->setCO1Edge(co1Edge); collisionToAdd->setCO2Edge(co2Edge); collisionToAdd->setCollisionWithSprite(true); collisionToAdd->setCollisionWithTile(false); collisionToAdd->setTimeOfCollision(timeUntilCollision); //collisionToAdd->setTile(tile); recycledCollisions.pop_back(); activeCollisions.push_back(collisionToAdd); }
void Physics::moveAllSpritesUpToBufferedTimeOfCollision(Collision *collision) { unsigned int co1Edge, co2Edge; float correctedCollisionTime = calculateTimeUntilCollision(collision->getCO1(), collision->getCO2(), co1Edge, co2Edge, BUFFER_BETWEEN_OBJECTS); // IF THE correctedCollisionTime is 0, WE HAVE TO BE CAREFUL // BECAUSE IT IS LIKELY A SIMULTAENOUS COLLISION WITH // ANOTHER ONE // if (fabs(correctedCollisionTime) < EPSILON) { collision->setCO1Edge(co1Edge); collision->setCO2Edge(co2Edge); moveAllSpritesUpByTimeStep(correctedCollisionTime); } }
/* Called when a collision is detected between a world tile and a sprite, this records that collision so that it can be resolved later if needed. */ void Physics::addTileCollision(CollidableObject *dynamicObject, Tile *tile, float tileX, float tileY, float tileWidth, float tileHeight) { // IF WE'VE ALREADY HANDLED A COLLISION BETWEEN THESE TWO OBJECTS THIS // FRAME THEN IGNORE IT set<Tile*> doTiles = spriteToTileCollisionsThisFrame[dynamicObject]; if (doTiles.find(tile) != doTiles.end()) return; // GET A DUMMY COLLIABLE OBJECT TO USE FOR THE TILE CollidableObject *tileInfoForCollision = recycledCollidableObjectsList.back(); // FILL IT WITH DATA AABB *bv = tileInfoForCollision->getBoundingVolume(); bv->setCenterX(tileX + (tileWidth/2)); bv->setCenterY(tileY + (tileHeight/2)); bv->setWidth(tileWidth); bv->setHeight(tileHeight); // FIRST WE'RE GOING TO DO A MORE NARROW CHECK TO SEE IF THE dynamicObject // REALLY DOES COLLIDE WITH THE TILE. TO DO SO WE'LL CALCULATE THE TIME // OF COLLISION. IF IT HAPPENS AFTER THIS FRAME IS OVER (> 1), THEN WE // WILL IGNORE IT unsigned int co1Edge, co2Edge; float timeUntilCollision = calculateTimeUntilCollision(dynamicObject, tileInfoForCollision, co1Edge, co2Edge, 0.0f); if (timeUntilCollision > 1.0f) return; // IF IT MADE IT HERE, A COLLISION IS HAPPENING // AND REMOVE IT FROM THE RECYCLING CENTER recycledCollidableObjectsList.pop_back(); // NOW LET'S MAKE A COLLISION FOR THE TILE-SPRITE Collision *collisionToAdd = recycledCollisions.back(); collisionToAdd->setCO1(dynamicObject); collisionToAdd->setCO2(tileInfoForCollision); collisionToAdd->setCO1Edge(co1Edge); collisionToAdd->setCO2Edge(co2Edge); collisionToAdd->setCollisionWithTile(true); collisionToAdd->setTimeOfCollision(timeUntilCollision); collisionToAdd->setTile(tile); recycledCollisions.pop_back(); activeCollisions.push_back(collisionToAdd); }