コード例 #1
0
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;
}
コード例 #2
0
ファイル: Crate.cpp プロジェクト: PsichiX/XenonCore2
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() ) );
}
コード例 #3
0
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;
}