/* Done each frame before collision testing, it updates the "on tile" states and then applies acceleration and gravity to the sprite's velocity. Then it initializes the swept shape for the sprite. */ void Physics::prepSpriteForCollisionTesting(World *world, CollidableObject *sprite) { // THIS GUY HAS ALL THE PHYSICS STUFF FOR THE SPRITE PhysicalProperties *pp = sprite->getPhysicalProperties(); // APPLY ACCELERATION pp->applyAcceleration(); // APPLY GRAVITY pp->incVelocity(0.0f, gravity); // NOW, IF THE SPRITE WAS ON A TILE LAST FRAME LOOK AHEAD // TO SEE IF IT IS ON A TILE NOW. IF IT IS, UNDO GRAVITY. // THIS HELPS US AVOID SOME PROBLEMS if (sprite->wasOnTileLastFrame()) { // FIRST MAKE SURE IT'S SWEPT SHAPE ACCOUNTS FOR GRAVITY sprite->updateSweptShape(1.0f); // WE'LL LOOK THROUGH THE COLLIDABLE LAYERS vector<WorldLayer*> *layers = world->getLayers(); for (int i = 0; i < world->getNumLayers(); i++) { WorldLayer *layer = layers->at(i); if (layer->hasCollidableTiles()) { bool test = layer->willSpriteCollideOnTile(this, sprite); if (test) { sprite->setOnTileThisFrame(true); pp->setVelocity(pp->getVelocityX(), 0.0f); sprite->updateSweptShape(1.0f); return; } else cout << "What Happened?"; } } } // INIT THE SWEPT SHAPE USING THE NEWLY APPLIED // VELOCITY. NOTE THAT 100% OF THE FRAME TIME // IS LEFT, DENOTED BY 1.0f sprite->updateSweptShape(1.0f); }