diff options
Diffstat (limited to 'src/game')
-rw-r--r-- | src/game/game.cc | 50 | ||||
-rw-r--r-- | src/game/game.h | 6 | ||||
-rw-r--r-- | src/game/ship.cc | 55 | ||||
-rw-r--r-- | src/game/ship.h | 31 |
4 files changed, 66 insertions, 76 deletions
diff --git a/src/game/game.cc b/src/game/game.cc index 51bb565..25f8926 100644 --- a/src/game/game.cc +++ b/src/game/game.cc @@ -4,20 +4,28 @@ the terms of the GNU General Public License version 2 */ -// project headers +#include <vector> + #include "game/game.h" #include "game/sector.h" #include "game/ship.h" #include "game/star.h" -#include "filesystem/filesystem.h" +#include "core/entity.h" #include "sys/sys.h" - -// C++ headers -#include <vector> +#include "math/mathlib.h" +#include "filesystem/filesystem.h" namespace game { +Game::Game() +{ +} + +Game::~Game() +{ +} + bool Game::init() { using math::Vector3f; @@ -102,11 +110,6 @@ bool Game::init() star->location = Vector3f(256.0f, 0.0f, 256.0f); star->label = "star: Sabishi Hoshi"; - - ship = new Ship(); - ship->location = Vector3f(0,0,0); - ship->label = "ship: Micron Vector"; - core::Entity *cube = new core::Entity(core::entity::Solid & core::entity::Static); cube->core_shape = core::entity::Cube; cube->core_color = Color(0.0f, 0.8f, 0.0f); @@ -151,7 +154,7 @@ void Game::shutdown() void Game::frame(float seconds) { - ship->update(seconds); + } void Game::event_join(core::Player *player) @@ -160,8 +163,27 @@ void Game::event_join(core::Player *player) return; ship = new Ship(); - ship->location = Vector3f(0,0,0); - ship->label = "ship: Micron Vector"; + ship->location = math::Vector3f(0,0,0); + ship->label = "ship: <"+player->name+"> Micron Vector"; + ship->owner = player; + + player->controled = ship; + + con_print << player->name << " joins" << std::endl; } -}; // namespace game +void Game::event_leave(core::Player *player) +{ + if (!player) + return; + + con_print << player->name << " leaves" << std::endl; + + if (player->controled) { + // player only has one ship for now + core::entity::remove(player->controled->id); + } +} + +} // namespace game + diff --git a/src/game/game.h b/src/game/game.h index abe0c0d..9c993fe 100644 --- a/src/game/game.h +++ b/src/game/game.h @@ -26,6 +26,9 @@ namespace game class Game : public core::GameInterface { public: + Game(); + ~Game(); + /// initialize the game bool init(); /// shutdown the game @@ -36,6 +39,9 @@ public: /// a player joins the game void event_join(core::Player *player); + /// a player leaves the game + void event_leave(core::Player *player); + /// sectors in space std::vector<Sector*> sectors; diff --git a/src/game/ship.cc b/src/game/ship.cc index d6333cd..baa97f1 100644 --- a/src/game/ship.cc +++ b/src/game/ship.cc @@ -17,62 +17,45 @@ using math::degrees180f; namespace game { -Ship::Ship() : core::Entity(0) +Ship::Ship() : core::EntityControlable(0) { type = ship_enttype; - speed = 0; - yaw_current = 0; - yaw_target = yaw_current; - - thrust_current = 0; - // ship specs acceleration = 1.5f; - speed_max = 4.0f; - yaw_speed = 4.0f; + max_speed = 4.0f; + turn_speed = 0.5f; } Ship::~Ship() { } -void Ship::set_yaw(float y) +void Ship::frame(float seconds) { - yaw_target = degrees360f(y); -} -void Ship::set_thrust(float t) -{ - if (t < 0) - thrust_current = 0; - else if (t > 1) - thrust_current = 1; - else - thrust_current = t; -} + if (target_thrust < 0) target_thrust = 0.0f; + else if(target_thrust > 1) target_thrust = 1.0f; -void Ship::update(float elapsed) -{ - // update yaw - float yaw_offset = degrees180f(yaw_target - yaw_current); - float d = yaw_speed * elapsed * yaw_offset; - yaw_current = degrees360f(yaw_current + d); + // update direction + float direction_offset = degrees180f(target_direction - direction); + float d = turn_speed * seconds * direction_offset; + direction = degrees360f(direction + d); - // update thrust - if (speed < thrust_current * speed_max) { - speed += acceleration * elapsed; - if (speed > thrust_current * speed_max) { - speed = thrust_current * speed_max; + // update speed + if (speed < target_thrust * max_speed) { + speed += acceleration * seconds; + if (speed > target_thrust * max_speed) { + speed = target_thrust * max_speed; } - } else if(speed > thrust_current * speed_max) { - speed -= acceleration * elapsed; + } else if(speed > target_thrust * max_speed) { + speed -= acceleration * seconds; if (speed < 0) speed = 0; } // location TODO avoid sin/cos calculations - location.x += cosf(yaw_current * M_PI / 180) * speed * elapsed; - location.z -= sinf(yaw_current * M_PI / 180) * speed * elapsed; + location.x += cosf(direction * M_PI / 180) * speed * seconds; + location.z -= sinf(direction * M_PI / 180) * speed * seconds; } } // namespace game diff --git a/src/game/ship.h b/src/game/ship.h index e919f38..d108223 100644 --- a/src/game/ship.h +++ b/src/game/ship.h @@ -13,43 +13,22 @@ namespace game { -class Ship : public core::Entity +class Ship : public core::EntityControlable { public: Ship(); ~Ship(); /// update the ship state - void update(float elapsed); - - /// speed vector in units/second - float speed; - - /// return the current yaw angle - inline float yaw() const { return yaw_current; } - /// set the target yaw angle - void set_yaw(float y); - - /// return the current thruster power - inline float thrust() const { return thrust_current; } - /// set thruster power - void set_thrust(float t); + void frame(float seconds); /* -- Ship SPECS --*/ /// acceleration float acceleration; /// maximum speed - float speed_max; - /// yaw turn speed - float yaw_speed; -private: - /// current yaw, angle in XZ plane, 0-360 - float yaw_current; - /// target yaw angle, angle in XYplane, 0-360 - float yaw_target; - - /// current thruster power in % [0-1] - float thrust_current; + float max_speed; + /// turn speed in rotations per second + float turn_speed; }; } // namespace game |