diff --git a/src/main.cpp b/src/main.cpp index 44c8955..ef907f8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -31,9 +31,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() { @@ -51,23 +51,23 @@ 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); + glfwSwapInterval(0); } 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); @@ -78,7 +78,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); @@ -90,7 +90,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); @@ -101,7 +101,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); @@ -162,27 +162,30 @@ GLuint wallTex = 0; void draw_box() { - glBindTexture(GL_TEXTURE_2D, wallTex); - glEnable(GL_TEXTURE_2D); - if (wallTex == 0) { + glGenTextures(1, &wallTex); + glBindTexture(GL_TEXTURE_2D, wallTex); + glEnable( GL_TEXTURE_2D); 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); + glfwLoadTexture2D("data/wall.tga", GLFW_BUILD_MIPMAPS_BIT); + } else { + glBindTexture(GL_TEXTURE_2D, wallTex); + glEnable( GL_TEXTURE_2D); } 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); - glEnable(GL_TEXTURE_2D); + 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); @@ -191,7 +194,7 @@ void draw_box() { glColor4f(1, 1, 1, 1); // Render the front quad - glBegin(GL_QUADS); + glBegin( GL_QUADS); glTexCoord2f(0, t); glNormal3f(0.0, 0.0, 1.0); glVertex3f(-s, s, -s); @@ -299,7 +302,7 @@ private: double phi, theta; double camX, camY, camZ; Schedule accelerate_schudule; - Schedule player_update_schudule; + Schedule game_update_schudule; game_t game; int server; int width, height; @@ -367,12 +370,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); @@ -428,8 +431,8 @@ void Application::initialize(int argc, char ** argv) { accelerate_schudule.setExact(true); accelerate_schudule.setInterval(0.05); - player_update_schudule.setExact(true); - player_update_schudule.setInterval(0.05); + game_update_schudule.setExact(true); + game_update_schudule.setInterval(0.05); loadConsoleFont(); } @@ -452,15 +455,15 @@ void Application::update() { } last_x = x; last_y = y; - - service_network(&game); - game_update(&game, dt); - if (server && player_update_schudule.next(time)) { - send_player_updates(&game); - } double rx = cos(phi) * cos(theta); double ry = sin(theta); double rz = sin(phi) * cos(theta); + service_network(&game); + game_update(&game, dt); + if (server && game_update_schudule.next(time)) { + send_game_updates(&game); + } + if (accelerate_schudule.next(time)) { double t = accelerate_schudule.getInterval(); double v = 50.0 * t; @@ -497,13 +500,12 @@ void Application::update() { camY = 1000.0; camZ = 1000.0; } - prepareFrame(rx, ry, rz); setup_light(); - glEnable(GL_LIGHT0); - glEnable(GL_LIGHTING); - glEnable(GL_CULL_FACE); - glDisable(GL_TEXTURE_2D); + 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]); @@ -524,10 +526,12 @@ void Application::update() { explosion.update(dt * 1000.0, camX, camY, camZ); explosion.render(); oglf_begin(&font, width, height); + size_t fy = 1; if (game.local_player) { std::stringstream sstr; sstr << "Points: " << game.local_player->points; - oglf_print(&font, 10, 10, sstr.str().c_str()); + oglf_print(&font, 10, 25 * fy++, sstr.str().c_str()); + } for (size_t i = 0; i < GAME_TEAM_COUNT; i++) { @@ -537,7 +541,14 @@ void Application::update() { } else { sstr << "Team " << i << " (other) : " << game.team[i].points; } - oglf_print(&font, 10, (i + 2) * 15, sstr.str().c_str()); + oglf_print(&font, 10, 25 * fy++, sstr.str().c_str()); + } + + { + std::stringstream sstr; + sstr << "FPS: " << (int) (1 / dt) << " Time: " << round(dt * 10000.0) + / 10.0; + oglf_print(&font, 10, 25 * fy++, sstr.str().c_str()); } oglf_end(); diff --git a/src/network.cpp b/src/network.cpp index 38e10b2..d2f1ee4 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -8,7 +8,9 @@ #include "network.h" #include + #include +#include ENetHost *host = 0; ENetPeer *client_peer = 0; @@ -16,7 +18,7 @@ ENetPeer *client_peer = 0; void setup_network(const char *remote) { if (enet_initialize() != 0) { fprintf(stderr, "An error occurred while initializing ENet.\n"); - exit(EXIT_FAILURE); + exit( EXIT_FAILURE); } if (remote == NULL) { @@ -30,7 +32,7 @@ void setup_network(const char *remote) { if (host == NULL) { fprintf(stderr, "An error occurred while trying to create an ENet server host.\n"); - exit(EXIT_FAILURE); + exit( EXIT_FAILURE); } } else { fprintf(stdout, "Start client.\n"); @@ -41,7 +43,7 @@ void setup_network(const char *remote) { if (host == NULL) { fprintf(stderr, "An error occurred while trying to create an ENet client host.\n"); - exit(EXIT_FAILURE); + exit( EXIT_FAILURE); } enet_address_set_host(&address, remote); @@ -53,7 +55,7 @@ void setup_network(const char *remote) { if (client_peer == NULL) { fprintf(stderr, "No available peers for initiating an ENet connection.\n"); - exit(EXIT_FAILURE); + exit( EXIT_FAILURE); } /* Wait up to 5 seconds for the connection attempt to succeed. */ @@ -77,7 +79,7 @@ void shutdown_network() { enet_deinitialize(); } -void send_player_updates(game_t *game) { +void send_game_updates(game_t *game) { size_t i; for (i = 0; i < GAME_PLAYER_COUNT; i++) { if (game->player[i].status == 0) @@ -104,6 +106,8 @@ void send_player_updates(game_t *game) { ENetPacket * packet = enet_packet_create(&msg, sizeof(msg), 0); enet_host_broadcast(host, 0, packet); } + + enet_host_flush(host); } void dispatch_message(enet_uint8 *data, size_t length, game_t *game) { @@ -140,9 +144,24 @@ void dispatch_message(enet_uint8 *data, size_t length, game_t *game) { player->vy = um->vy; player->vz = um->vz; } else { - player->vx = um->vx + (um->x - player->x); - player->vy = um->vy + (um->y - player->y); - player->vz = um->vz + (um->z - player->z); + if (fabs(um->x - player->x) < 10.0) { + player->vx = um->vx + (um->x - player->x); + } else { + player->x = um->x; + player->vx = um->vx; + } + if (fabs(um->y - player->y) < 10.0) { + player->vy = um->vy + (um->y - player->y); + } else { + player->y = um->y; + player->vy = um->vy; + } + if (fabs(um->z - player->z) < 10.0) { + player->vz = um->vz + (um->z - player->z); + } else { + player->z = um->z; + player->vz = um->vz; + } } player->points = um->points; break; diff --git a/src/network.h b/src/network.h index dad7680..a7bc251 100644 --- a/src/network.h +++ b/src/network.h @@ -89,7 +89,7 @@ void setup_network(const char *remote); void shutdown_network(); void dispatch_message(uint8_t *data, size_t length, game_t *game); void service_network(game_t *game); -void send_player_updates(game_t *game); +void send_game_updates(game_t *game); void send_message(uint8_t *data, size_t length, game_t *game); #endif /* NETWORK_H_ */