From e08d3768644e364f65b10327c5af4e30f8eff753 Mon Sep 17 00:00:00 2001 From: gmueller Date: Wed, 12 Jan 2011 15:28:44 +0100 Subject: [PATCH] some gameplay fixes --- src/game.cpp | 79 ++++++++++++++++++++++++----- src/main.cpp | 139 ++++++++++++++++++++++++++------------------------- 2 files changed, 137 insertions(+), 81 deletions(-) diff --git a/src/game.cpp b/src/game.cpp index fb439dd..b7029ed 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -71,11 +71,21 @@ void game_reset_point(point_t *point) { point->z = 0.0; } +void game_reset_bomb(bomb_t *bomb) { + bomb->status = 0; + bomb->x = 0.0; + bomb->y = 0.0; + bomb->z = 0.0; +} + void game_setup(game_t *game, int master, void(*explosion_callback)(double x, double y, double z)) { size_t i; for (i = 0; i < GAME_TEAM_COUNT; i++) game_setup_team(&game->team[i], i); + for (i = 0; i < GAME_BOMB_COUNT; i++) + game_reset_bomb(&game->bomb[i]); + if (master) { for (i = 0; i < GAME_PLAYER_COUNT; i++) @@ -84,8 +94,8 @@ void game_setup(game_t *game, int master, void(*explosion_callback)(double x, for (i = 0; i < GAME_POINT_COUNT; i++) game_setup_point(&game->point[i]); } else { -// for (i = 0; i < GAME_TEAM_COUNT; i++) -// game_reset_team(&game->team[i], i); + // for (i = 0; i < GAME_TEAM_COUNT; i++) + // game_reset_team(&game->team[i], i); for (i = 0; i < GAME_PLAYER_COUNT; i++) game_reset_player(&game->player[i]); @@ -145,12 +155,12 @@ void game_update_players(game_t *game, double dt) { player_t *player = &game->player[i]; if (player->status == 0) return; - if (player->vx > 500.0) - player->vx = 500.0; - if (player->vy > 500.0) - player->vy = 500.0; - if (player->vz > 500.0) - player->vz = 500.0; + if (player->vx > 1000.0) + player->vx = 1000.0; + if (player->vy > 1000.0) + player->vy = 1000.0; + if (player->vz > 1000.0) + player->vz = 1000.0; player->x += player->vx * dt; player->y += player->vy * dt; player->z += player->vz * dt; @@ -161,6 +171,30 @@ void game_update_players(game_t *game, double dt) { player->team->points += player->points; player->points = 0; } + + if (player->x < (-1000 + 10)) { + player->x = (-1000 + 10); + player->vx *= -1; + } else if (player->x > (5000 - 10)) { + player->x = (5000 - 10); + player->vx *= -1; + } + + if (player->y < (-3000 + 10)) { + player->y = (-3000 + 10); + player->vy *= -1; + } else if (player->y > (3000 - 10)) { + player->y = (3000 - 10); + player->vy *= -1; + } + + if (player->z < (-3000 + 10)) { + player->z = (-3000 + 10); + player->vz *= -1; + } else if (player->z > (3000 - 10)) { + player->z = (3000 - 10); + player->vz *= -1; + } } } @@ -172,7 +206,7 @@ void _explode_bomb(game_t *game, bomb_t *bomb) { continue; double distance2 = pow(player->x - bomb->x, 2) + pow(player->y - bomb->y, 2) + pow(player->z - bomb->z, 2); - if (distance2 < 10000.0) { + if (distance2 < pow(150 , 2)) { game->explosion_callback(player->x, player->y, player->z); player->x = player->team->x + 100; player->y = player->team->y; @@ -201,11 +235,32 @@ void game_update_bombs(game_t *game, double dt) { bomb->y += bomb->vy * dt; bomb->z += bomb->vz * dt; bomb->ttl -= dt; + + if (bomb->x < (-1000 + 10)) { + bomb->x = (-1000 + 10); + bomb->ttl = -0.1; + } else if (bomb->x > (5000 - 10)) { + bomb->x = (5000 - 10); + bomb->ttl = -0.1; + } else if (bomb->y < (-3000 + 10)) { + bomb->y = (-3000 + 10); + bomb->ttl = -0.1; + } else if (bomb->y > (3000 - 10)) { + bomb->y = (3000 - 10); + bomb->ttl = -0.1; + } else if (bomb->z < (-3000 + 10)) { + bomb->z = (-3000 + 10); + bomb->ttl = -0.1; + } else if (bomb->z > (3000 - 10)) { + bomb->z = (3000 - 10); + bomb->ttl = -0.1; + } + if (bomb->ttl < 0) { if (bomb->status == 1) { game->explosion_callback(bomb->x, bomb->y, bomb->z); bomb->status = 2; - } else if (bomb->ttl < 0.8) { + } else if (bomb->ttl < -0.2) { _explode_bomb(game, bomb); bomb->status = 0; } @@ -240,9 +295,9 @@ void game_update_points(game_t *game, double dt) { } void game_update(game_t *game, double dt) { - const double delta = 1. / 60.; + const double delta = 1. / 120.; game->updateTime += dt; - while (game->updateTime > delta * 0.8) { + while (game->updateTime > delta) { game_update_players(game, delta); game_update_bombs(game, delta); game_update_points(game, delta); diff --git a/src/main.cpp b/src/main.cpp index a8e47d2..0343b4b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -32,9 +32,9 @@ void setup_light() { glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient); glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse); glLightfv(GL_LIGHT0, GL_POSITION, LightPosition); - glEnable( GL_LIGHT0); + glEnable(GL_LIGHT0); - glEnable( GL_LIGHTING); + glEnable(GL_LIGHTING); } void setup_opengl() { @@ -57,14 +57,14 @@ void setup_opengl() { glfwEnable(GLFW_STICKY_KEYS); // general settings - glShadeModel( GL_SMOOTH); + glShadeModel(GL_SMOOTH); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - glEnable( GL_CULL_FACE); + glEnable(GL_CULL_FACE); // setup depth buffer glClearDepth(1.0f); - glEnable( GL_DEPTH_TEST); - glDepthFunc( GL_LEQUAL); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); // Enable vertical sync (on cards that support it) glfwSwapInterval(1); @@ -73,7 +73,7 @@ void setup_opengl() { void draw_team(team_t *team) { size_t i = 0; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, team->color); - glMatrixMode( GL_MODELVIEW); + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslated(team->x, team->y, team->z); gluSphere(quadratic, 50.f, 32, 32); @@ -84,7 +84,7 @@ void draw_player(player_t *player) { if (player->status == 0) return; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, player->team->color); - glMatrixMode( GL_MODELVIEW); + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslated(player->x, player->y, player->z); gluSphere(quadratic, 10.f, 32, 32); @@ -96,7 +96,7 @@ void draw_bomb(bomb_t *bomb) { return; GLfloat red[] = { 1.0f, 0.0f, 0.0f, 1.0f }; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); - glMatrixMode( GL_MODELVIEW); + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslated(bomb->x, bomb->y, bomb->z); gluSphere(quadratic, 3.f, 4, 4); @@ -107,7 +107,7 @@ void draw_point(point_t *point) { return; GLfloat red[] = { 0.0f, 0.0f, 1.0f, 1.0f }; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); - glMatrixMode( GL_MODELVIEW); + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslated(point->x, point->y, point->z); gluSphere(quadratic, 3.f, 12, 12); @@ -299,9 +299,9 @@ void dispatch_message(enet_uint8 *data, size_t length, game_t *game) { case MESSAGE_PLAYER_UPDATE: { player_update_message_t *um = (player_update_message_t *) data; player_t *player = game_player(game, um->player_id); - player->x = um->x; - player->y = um->y; - player->z = um->z; + player->x = um->x + um->vx * 0.0001; + player->y = um->y + um->vy * 0.0001; + player->z = um->z + um->vz * 0.0001; player->vx = um->vx; player->vy = um->vy; player->vz = um->vz; @@ -330,9 +330,9 @@ void dispatch_message(enet_uint8 *data, size_t length, game_t *game) { bomb_t *bomb = game_spawn_bomb(game); if (bomb == NULL) return; - bomb->x = m->x; - bomb->y = m->y; - bomb->z = m->z; + bomb->x = m->x + m->vx * 0.0001; + bomb->y = m->y + m->vy * 0.0001; + bomb->z = m->z + m->vz * 0.0001; bomb->vx = m->vx; bomb->vy = m->vy; bomb->vz = m->vz; @@ -541,64 +541,64 @@ GLuint wallTex = 0; void draw_box() { glBindTexture(GL_TEXTURE_2D, wallTex); - glEnable( GL_TEXTURE_2D); + glEnable(GL_TEXTURE_2D); if (wallTex == 0) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glfwLoadTexture2D("data/wall.tga", 0); } - GLfloat red[] = { 0.1f, 0.2f, 0.3f, 1.0f }; + GLfloat red[] = { 1.0f, 1.0f, 1.0f, 1.0f }; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); // Enable/Disable features - glPushAttrib( GL_ENABLE_BIT); + glPushAttrib(GL_ENABLE_BIT); glEnable(GL_TEXTURE_2D); //glDisable( GL_DEPTH_TEST); // glEnable( GL_LIGHTING); // glDisable( GL_BLEND); - glMatrixMode( GL_MODELVIEW); + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslated(2000.0, 0.0, 0.0); //glScaled(5000.0f, 5000.0f, 5000.0f); - float s = 2500.0; + float s = 3000.0f, t = 5.0f; // Just in case we set all vertices to white. glColor4f(1, 1, 1, 1); // Render the front quad - // glBindTexture(GL_TEXTURE_2D, _skybox[0]); - glBegin( GL_QUADS); - - glTexCoord2f(0, 0); - glNormal3f(0.0, 0.0, 1.0); - glVertex3f(s, -s, -s); - - glTexCoord2f(0, 1); - glNormal3f(0.0, 0.0, 1.0); - glVertex3f(s, s, -s); - glTexCoord2f(1, 1); + glBegin(GL_QUADS); + glTexCoord2f(0, t); glNormal3f(0.0, 0.0, 1.0); glVertex3f(-s, s, -s); - glTexCoord2f(1, 0); + glTexCoord2f(0, 0); glNormal3f(0.0, 0.0, 1.0); glVertex3f(-s, -s, -s); + glTexCoord2f(t, 0); + glNormal3f(0.0, 0.0, 1.0); + glVertex3f(s, -s, -s); + + glTexCoord2f(t, t); + glNormal3f(0.0, 0.0, 1.0); + glVertex3f(s, s, -s); glEnd(); // Render the left quad - // glBindTexture(GL_TEXTURE_2D, _skybox[1]); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(s, -s, s); - glTexCoord2f(0, 1); + + glTexCoord2f(0, t); glVertex3f(s, s, s); - glTexCoord2f(1, 1); + + glTexCoord2f(t, t); glVertex3f(s, s, -s); - glTexCoord2f(1, 0); + + glTexCoord2f(t, 0); glVertex3f(s, -s, -s); glEnd(); @@ -607,11 +607,11 @@ void draw_box() { glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(-s, -s, s); - glTexCoord2f(0, 1); + glTexCoord2f(0, t); glVertex3f(-s, s, s); - glTexCoord2f(1, 1); + glTexCoord2f(t, t); glVertex3f(s, s, s); - glTexCoord2f(1, 0); + glTexCoord2f(t, 0); glVertex3f(s, -s, s); glEnd(); @@ -621,24 +621,24 @@ void draw_box() { glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(-s, -s, -s); - glTexCoord2f(0, 1); + glTexCoord2f(0, t); glVertex3f(-s, s, -s); - glTexCoord2f(1, 1); + glTexCoord2f(t, t); glVertex3f(-s, s, s); - glTexCoord2f(1, 0); + glTexCoord2f(t, 0); glVertex3f(-s, -s, s); glEnd(); // Render the top quad //glBindTexture(GL_TEXTURE_2D, _skybox[4]); glBegin(GL_QUADS); - glTexCoord2f(0, 1); + glTexCoord2f(0, t); glVertex3f(-s, s, -s); - glTexCoord2f(1, 1); + glTexCoord2f(t, t); glVertex3f(s, s, -s); - glTexCoord2f(1, 0); + glTexCoord2f(t, 0); glVertex3f(s, s, s); glTexCoord2f(0, 0); @@ -651,11 +651,11 @@ void draw_box() { glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(-s, -s, -s); - glTexCoord2f(0, 1); + glTexCoord2f(0, t); glVertex3f(-s, -s, s); - glTexCoord2f(1, 1); + glTexCoord2f(t, t); glVertex3f(s, -s, s); - glTexCoord2f(1, 0); + glTexCoord2f(t, 0); glVertex3f(s, -s, -s); glEnd(); @@ -719,12 +719,12 @@ void Application::prepareFrame(double rx, double ry, double rz) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Select and setup the projection matrix - glMatrixMode( GL_PROJECTION); + glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0f, (GLfloat) width / (GLfloat) height, 1.0f, 10000.0f); // Select and setup the modelview matrix - glMatrixMode( GL_MODELVIEW); + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(camX, camY, camZ, camX + rx * 10.0f, camY + ry * 10.0f, camZ + rz * 10.0f, 0.0f, 1.0f, 0.0f); @@ -768,7 +768,7 @@ void Application::initialize(int argc, char ** argv) { accelerate_schudule.setInterval(0.05); player_update_schudule.setExact(true); - player_update_schudule.setInterval(0.1); + player_update_schudule.setInterval(0.05); loadConsoleFont(); } @@ -791,23 +791,13 @@ void Application::update() { last_x = x; last_y = y; - if (local_player) { - camX = local_player->x; - camY = local_player->y; - camZ = local_player->z; - } else { - camX = 1000.0; - camY = 1000.0; - camZ = 1000.0; - } + game_update(&game, dt); service_network(&game); if (server && player_update_schudule.next(time)) { send_player_updates(&game); } - game_update(&game, dt); - double rx = cos(phi) * cos(theta); double ry = sin(theta); double rz = sin(phi) * cos(theta); @@ -837,13 +827,24 @@ void Application::update() { drop_bomb(&game, rx, ry, rz, 5.0); } } - service_network(&game); + //service_network(&game); + + if (local_player) { + camX = local_player->x; + camY = local_player->y; + camZ = local_player->z; + } else { + camX = 1000.0; + camY = 1000.0; + camZ = 1000.0; + } prepareFrame(rx, ry, rz); setup_light(); - glEnable( GL_LIGHT0); - glEnable( GL_LIGHTING); - glEnable( GL_CULL_FACE); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHTING); + glEnable(GL_CULL_FACE); + glDisable(GL_TEXTURE_2D); for (size_t i = 0; i < GAME_TEAM_COUNT; i++) draw_team(&game.team[i]);