From d7abbcb5c7056952ba133d9b17f98f1d0fd05636 Mon Sep 17 00:00:00 2001 From: gmueller Date: Tue, 8 Feb 2011 23:06:43 +0100 Subject: [PATCH] switch to player bullet state --- src/client/Client.cpp | 18 +++---- src/common/Game.cpp | 104 +++++++++++++---------------------------- src/common/Game.h | 7 +-- src/common/Network.cpp | 8 ++-- 4 files changed, 50 insertions(+), 87 deletions(-) diff --git a/src/client/Client.cpp b/src/client/Client.cpp index 743c29d..33114da 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -78,7 +78,7 @@ void Client::drawPlayer(player_t *player) { glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, player->team->color); glMatrixMode( GL_MODELVIEW); glPushMatrix(); - glTranslated(player->x, player->y, player->z); + glMultMatrixf(player->m); glEnableClientState( GL_VERTEX_ARRAY); glEnableClientState( GL_TEXTURE_COORD_ARRAY); glEnableClientState( GL_NORMAL_ARRAY); @@ -328,7 +328,7 @@ void Client::accelerate(double x, double y, double z) { m << msg; network.send(m); } - +#if 0 void Client::drop_bomb(double rx, double ry, double rz, double ttl) { bomb_drop_meesage_t msg; msg.x = game.local_player->x + rx * 20; @@ -342,7 +342,7 @@ void Client::drop_bomb(double rx, double ry, double rz, double ttl) { m << msg; network.send(m); } - +#endif void Client::loadConsoleFont() { GLuint font_id = 0; @@ -453,23 +453,25 @@ void Client::update() { } else if (glfwGetKey('D')) { accelerate(-rz * v, 0, rx * v); } - +#if 0 if (glfwGetKey(GLFW_KEY_SPACE)) { accelerate(game.local_player->vx * -0.1, game.local_player->vy * -0.1, game.local_player->vz * -0.1); } +#endif } +#if 0 if (glfwGetKey(GLFW_KEY_LCTRL)) { if (time - last_bomb > 1.0) { last_bomb = time; drop_bomb(rx, ry, rz, 5.0); } } - +#endif if (game.local_player) { - camX = game.local_player->x; - camY = game.local_player->y; - camZ = game.local_player->z; + camX = game.local_player->m[12]; + camY = game.local_player->m[13]; + camZ = game.local_player->m[14]; } else { camX = 1000.0; camY = 1000.0; diff --git a/src/common/Game.cpp b/src/common/Game.cpp index bd09a1a..0b8fdd3 100644 --- a/src/common/Game.cpp +++ b/src/common/Game.cpp @@ -36,18 +36,15 @@ void reset_team(Team *team) { } void reset_player(player_t *player) { + if (player->body.get() == 0) + return; if (player->team) { - player->x = player->team->x; - player->y = player->team->y; - player->z = player->team->z; + player->body->getWorldTransform().setOrigin(btVector3(player->team->x, + player->team->y, player->team->z)); } else { - player->x = 0; - player->y = 0; - player->z = 0; + player->body->getWorldTransform().setOrigin(btVector3(0, 0, 0)); } - player->vx = 0.; - player->vy = 0.; - player->vz = 0.; + player->body->setLinearVelocity(btVector3(0, 0, 0)); } void reset_point(point_t *point) { @@ -76,12 +73,12 @@ void setup_player(player_t *player) { player->id = 0; player->status = 0; player->team = NULL; - player->x = 0.0; - player->y = 0.0; - player->z = 0.0; - player->vx = 0.0; - player->vy = 0.0; - player->vz = 0.0; + // player->x = 0.0; + // player->y = 0.0; + // player->z = 0.0; + // player->vx = 0.0; + // player->vy = 0.0; + // player->vz = 0.0; } void setup_point(point_t *point) { @@ -224,25 +221,24 @@ player_t *Game::spawnPlayer(Team *team) { player->team = team; player->status = 1; player->id = max_player_id++; - reset_player(player); if (player->body.get() == 0) { std::cout << "[Game] create body" << std::endl; /// Create Dynamic Objects - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(player->x, player->y, player->z)); btScalar mass(1.f); btVector3 localInertia(0, 0, 0); shipShape->calculateLocalInertia(mass, localInertia); player->state.reset(new btDefaultMotionState()); - player->state->setWorldTransform(startTransform); + player->state->setWorldTransform(btTransform::getIdentity()); btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, player->state.get(), shipShape.get(), localInertia); player->body.reset(new btRigidBody(rbInfo)); player->body->setCcdSweptSphereRadius(1.5); dynamicsWorld->addRigidBody(player->body.get()); } + + reset_player(player); + return player; } @@ -253,25 +249,24 @@ player_t *Game::spawnPlayerWithId(Team *team, uint16_t id) { if (max_player_id < id) max_player_id = id; player->status = 1; - reset_player(player); if (player->body.get() == 0) { /// Create Dynamic Objects std::cout << "[Game] create body" << std::endl; - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(player->x, player->y, player->z)); btScalar mass(1.f); btVector3 localInertia(0, 0, 0); shipShape->calculateLocalInertia(mass, localInertia); player->state.reset(new btDefaultMotionState()); - player->state->setWorldTransform(startTransform); + player->state->setWorldTransform(btTransform::getIdentity()); btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, player->state.get(), shipShape.get(), localInertia); player->body.reset(new btRigidBody(rbInfo)); player->body->setCcdSweptSphereRadius(1.5); dynamicsWorld->addRigidBody(player->body.get()); } + + reset_player(player); + return player; } @@ -281,58 +276,22 @@ void Game::update_players(double dt) { player_t *p = &player[i]; if (p->status == 0) return; - if (master || true) { - btTransform wt; - p->state->getWorldTransform(wt); - p->x = wt.getOrigin().x(); - p->y = wt.getOrigin().y(); - p->z = wt.getOrigin().z(); - btVector3 v = p->body->getLinearVelocity(); - p->vx = v.x(); - p->vy = v.z(); - p->vz = v.z(); - } else { - std::cout << "update player " << p->id << ": " << p->x << " += " - << p->vx << " * " << dt << std::endl; - p->x += p->vx * dt; - p->y += p->vy * dt; - p->z += p->vz * dt; - } + btVector3 team_position(p->team->x, p->team->y, p->team->z); + btTransform player_transform; + p->state->getWorldTransform(player_transform); + player_transform.getOpenGLMatrix(p->m); - double distance2 = pow(p->x - p->team->x, 2) - + pow(p->y - p->team->y, 2) + pow(p->z - p->team->z, 2); + double distance2 = + player_transform.getOrigin().distance2(team_position); if (distance2 < 10000) { p->team->points += p->points; p->points = 0; } - - // if (p->x < (-1000 + 10)) { - // p->x = (-1000 + 10); - // p->vx *= -1; - // } else if (p->x > (5000 - 10)) { - // p->x = (5000 - 10); - // p->vx *= -1; - // } - // - // if (p->y < (-3000 + 10)) { - // p->y = (-3000 + 10); - // p->vy *= -1; - // } else if (p->y > (3000 - 10)) { - // p->y = (3000 - 10); - // p->vy *= -1; - // } - // - // if (p->z < (-3000 + 10)) { - // p->z = (-3000 + 10); - // p->vz *= -1; - // } else if (p->z > (3000 - 10)) { - // p->z = (3000 - 10); - // p->vz *= -1; - // } } } +#if 0 void Game::explode_bomb(bomb_t *bomb) { size_t i, j; for (i = 0; i < GAME_PLAYER_COUNT; i++) { @@ -430,6 +389,7 @@ void Game::update_points(double dt) { update_point(p); } } +#endif void Game::update(double time, double dt) { if (master || true) { @@ -437,13 +397,13 @@ void Game::update(double time, double dt) { if (steps > 0) { double timeStep = dt; Game::update_players(timeStep); - Game::update_bombs(timeStep); - Game::update_points(timeStep); + //Game::update_bombs(timeStep); + //Game::update_points(timeStep); } } else if (slaveUpdate.next(time)) { Game::update_players(slaveUpdate.getInterval()); - Game::update_bombs(slaveUpdate.getInterval()); - Game::update_points(slaveUpdate.getInterval()); + //Game::update_bombs(slaveUpdate.getInterval()); + //Game::update_points(slaveUpdate.getInterval()); } } diff --git a/src/common/Game.h b/src/common/Game.h index 3905462..bc23e4f 100644 --- a/src/common/Game.h +++ b/src/common/Game.h @@ -31,13 +31,14 @@ class Game; struct player_t { uint16_t id; uint16_t status; - double x, y, z; - double rx, ry, rz, rw; - double vx, vy, vz; +// double x, y, z; +// double rx, ry, rz, rw; +// double vx, vy, vz; Team *team; uint16_t points; std::auto_ptr state; std::auto_ptr body; + float m[16]; }; struct bomb_t { diff --git a/src/common/Network.cpp b/src/common/Network.cpp index 740e9bf..89ef940 100644 --- a/src/common/Network.cpp +++ b/src/common/Network.cpp @@ -352,11 +352,11 @@ void Network::dispatch(enet_uint8 *data, size_t length) { player_accelerate_message_t m; doc >> m; player_t *player = game->getPlayer(m.player_id); - player->vx += m.x; - player->vy += m.y; - player->vz += m.z; + btVector3 v = player->body->getLinearVelocity(); + v += btVector3(m.x, m.y, m.z); + player->body->setLinearVelocity(v); player->body->activate(true); - player->body->applyCentralImpulse(btVector3(m.x, m.y, m.z)); + //player->body->applyCentralImpulse(btVector3(m.x, m.y, m.z)); break; } case MESSAGE_BOMB_DROP: {