CCSceneCollideable* CCSceneMoveable::applyVerticalVelocity(const float increment) { position.y += increment; CCSceneCollideable *collidedWith = CCBasicOctreeCollisionCheck( this, &position, true ); if( collidedWith != NULL ) { position.y -= increment; const float originalPosition = position.y; // Since basic collision check doesn't return the actual closest collision, keep re-running the check until we're collision free CCSceneCollideable *currentlyCollidingWith = collidedWith; while( currentlyCollidingWith != NULL ) { position.y = originalPosition; collidedWith = currentlyCollidingWith; position.y = getCollisionPosition( &position.y, &collisionBounds.y, &collidedWith->positionPtr->y, &collidedWith->collisionBounds.y ); if( position.y == originalPosition ) { currentlyCollidingWith = NULL; } else { currentlyCollidingWith = CCBasicOctreeCollisionCheck( this, &position ); } } } return collidedWith; }
void Crate::update() { if( ICollisional::collisionChange() ) { if( ICollisional::isCollide() ) m_sprite->setColor( XeCore::XeHalfVector( 1.0f, 0.0f, 0.0f ) ); else m_sprite->setColor( XeCore::XeHalfVector( 1.0f, 1.0f, 1.0f ) ); } XeCore::XeHalfVector t = getCollisionPosition() + XeCore::XeHalfVector( m_spd.X * GLOBAL.engine->getDeltaTime(), m_spd.Y * GLOBAL.engine->getDeltaTime() ); if( t.X < -getCollisionRange() * 2.0f ) t.X = 1024.0f + getCollisionRange() * 2.0f; if( t.Y < -getCollisionRange() * 2.0f ) t.Y = 576.0f + getCollisionRange() * 2.0f; if( t.X > 1024.0f + getCollisionRange() * 2.0f ) t.X = -getCollisionRange() * 2.0f; if( t.Y > 576.0f + getCollisionRange() * 2.0f ) t.Y = -getCollisionRange() * 2.0f; setCollisionPosition( t ); m_sprite->setPosition( t ); m_sprite->setRotation( XeCore::XeAngleHalfVector( m_sprite->getRotation().Alpha + m_rot * GLOBAL.engine->getDeltaTime() ) ); }
CCSceneCollideable* CCSceneMoveable::applyHorizontalVelocity(const float velocityX, const float velocityZ) { position.x += velocityX; position.z += velocityZ; CCSceneCollideable *collidedWith = CCBasicOctreeCollisionCheck( this, &position, true ); if( collidedWith != NULL ) { position.x -= velocityX; CCSceneCollideable *collidedWithZ = collidedWith; if( velocityZ != 0.0f ) { collidedWithZ = CCBasicOctreeCollisionCheck( this, &position ); } if( collidedWithZ != NULL ) { position.z -= velocityZ; position.x += velocityX; CCSceneCollideable *collidedWithX = collidedWith; if( velocityX != 0.0f ) { collidedWithX = CCBasicOctreeCollisionCheck( this, &position ); } if( collidedWithX != NULL ) { position.x -= velocityX; // Moving failed // Kill the additional velocity additionalVelocity.x = 0.0f; additionalVelocity.z = 0.0f; } // Moving X passed else { float collisionZ = getCollisionPosition( &position.z, &collisionBounds.z, &collidedWith->positionPtr->z, &collidedWith->collisionBounds.z ); position.z = collisionZ; // Kill the z additional velocity additionalVelocity.z = 0.0f; } } // Moving Z passed else { float collisionX = getCollisionPosition( &position.x, &collisionBounds.x, &collidedWith->positionPtr->x, &collidedWith->collisionBounds.x ); position.x = collisionX; // Kill the x additional velocity additionalVelocity.x = 0.0f; } } return collidedWith; }