121 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "Engine.h"
 | |
| 
 | |
| #include "Model.h"
 | |
| 
 | |
| #include "ShipEntity.h"
 | |
| #include "RocketEntity.h"
 | |
| #include "Controller.h"
 | |
| #include "AsteroidsEvents.h"
 | |
| 
 | |
| #include "coll2d.h"
 | |
| 
 | |
| namespace asteroids {
 | |
| 
 | |
| static Engine::Variable var_ship_acceleration ("ship_acceleration", "10");
 | |
| static Engine::Variable var_ship_maxspeed ("ship_maxspeed", "10");
 | |
| static Engine::Variable var_ship_rotationspeed ("ship_rotationspeed", "180");
 | |
| 
 | |
| void ShipEntity::Update (float delta_sec) {
 | |
| 	if (!mPhysicState || !mControllerState)
 | |
| 		return;
 | |
| 
 | |
| 	// If we die, we have to decrease the fade timer
 | |
| 	if (!mAlive) {
 | |
| 		mFadeTimer -= delta_sec;
 | |
| 
 | |
| 		if (mFadeTimer <= 0.) {
 | |
| 			Model *model = (Model*) Engine::EngineGetModel();
 | |
| 			model->SetGameState (GameStatePlayerDied);
 | |
| 		}
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	mState = Idle;
 | |
| 
 | |
| 	// the local velocity
 | |
| 	vector3d local_velocity = mPhysicState->mVelocity;
 | |
| 	mPhysicState->LocalizeRotation (local_velocity);
 | |
| 
 | |
| 	// set the local velocity as the current state of the keys are
 | |
| 	if (mControllerState->GetKey (EntityKeyStateForward)) {
 | |
| 		local_velocity[0] += delta_sec * var_ship_acceleration.GetFloatValue();
 | |
| 		mState = Accelerating;
 | |
| 	}
 | |
| 
 | |
| 	// now transform these to global velocities
 | |
| 	mPhysicState->GlobalizeRotation (local_velocity);
 | |
| 
 | |
| 	// now we can update the new global velocity
 | |
| 	mPhysicState->SetVelocity(local_velocity);
 | |
| 
 | |
| 	if (mControllerState->GetKey (EntityKeyStateTurnLeft)) {
 | |
| 		mPhysicState->mOrientation[1] += delta_sec * var_ship_rotationspeed.GetFloatValue();
 | |
| 	}
 | |
| 	if (mControllerState->GetKey (EntityKeyStateTurnRight)) {
 | |
| 		mPhysicState->mOrientation[1] -= delta_sec * var_ship_rotationspeed.GetFloatValue();
 | |
| 	}
 | |
| 
 | |
| 	// Check for the maximum speed
 | |
| 	float speed = mPhysicState->mVelocity.length();
 | |
| 	if (speed > var_ship_maxspeed.GetFloatValue()) {
 | |
| 		mPhysicState->mVelocity *= var_ship_maxspeed.GetFloatValue() / speed;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| bool ShipEntity::CollisionEvent (Engine::EntityBase* entity) {
 | |
| 	GameEntityType other_type = (GameEntityType) entity->mType;
 | |
| 
 | |
| 	if (other_type == GameEntityTypeAsteroid) {
 | |
| 		Engine::LogMessage ("You died!");
 | |
| 
 | |
| 		mPhysicState->mStatic = true;
 | |
| 
 | |
| 		mAlive = false;
 | |
| 		mFadeTimer = 3.;
 | |
| 		mState = Dying;
 | |
| 
 | |
| 		Engine::EventBasePtr explode_event (new Engine::EventBase());
 | |
| 		explode_event->mEventType = EventShipExplode;
 | |
| 		explode_event->mEventUnsignedInt = mId;
 | |
| 		QueueEvent (explode_event);
 | |
| 
 | |
| 		return true;
 | |
| 	} else if (other_type == GameEntityTypeRocket) {
 | |
| 		Engine::LogMessage ("You just killed yourself!");
 | |
| 
 | |
| 		mPhysicState->mStatic = true;
 | |
| 
 | |
| 		mAlive = false;
 | |
| 		mFadeTimer = 1.;
 | |
| 		mState = Dying;
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	return false;
 | |
| }
 | |
| 
 | |
| void ShipEntity::Attack () {
 | |
| 	if (!mAlive)
 | |
| 		return;
 | |
| 
 | |
| 	Engine::EntityPhysicState* entity_physic = Engine::GetEntityPhysicState (mId);
 | |
| 	vector3d attack_dir (1., 0., 0.);
 | |
| 
 | |
| 	entity_physic->GlobalizeRotation (attack_dir);
 | |
| 
 | |
| 	RocketEntity *rocket_entity = (RocketEntity*) Engine::CreateEntity (GameEntityTypeRocket);
 | |
| 
 | |
| 	rocket_entity->mSecToLive = 1.75;
 | |
| 
 | |
| 	RocketEntityPhysicState *rocket_physics = (RocketEntityPhysicState*) rocket_entity->mPhysicState;
 | |
| 	rocket_physics->mPosition = attack_dir;
 | |
| 	rocket_physics->mPosition *= mPhysicState->mRadius;
 | |
| 	rocket_physics->mPosition += entity_physic->mPosition;
 | |
| 	rocket_physics->mOrientation = entity_physic->mOrientation;
 | |
| 	rocket_physics->mVelocity = attack_dir.normalize();
 | |
| 	rocket_physics->mVelocity *= var_ship_maxspeed.GetFloatValue() + 0.1;
 | |
| }
 | |
| 
 | |
| }
 |