From 4d7c01f0782132adcbae7b428c173753b7d4f61d Mon Sep 17 00:00:00 2001 From: Allanis <allanis@saracraft.net> Date: Tue, 5 Feb 2013 23:10:46 +0000 Subject: [PATCH] [Add] Basic Gui. -- Minimap. -- Health bars. --- gfx/gui/frame.png | Bin 0 -> 4079 bytes gfx/gui/frame.xcf | Bin 0 -> 23076 bytes src/main.c | 4 + src/main.h | 5 +- src/opengl.c | 22 +++--- src/pilot.c | 25 ++++++- src/pilot.h | 5 ++ src/player.c | 187 +++++++++++++++++++++++++++++++++++++++++++++- src/player.h | 3 + src/ship.c | 6 +- src/ship.h | 2 +- src/weapon.c | 6 +- 12 files changed, 242 insertions(+), 23 deletions(-) create mode 100644 gfx/gui/frame.png create mode 100644 gfx/gui/frame.xcf diff --git a/gfx/gui/frame.png b/gfx/gui/frame.png new file mode 100644 index 0000000000000000000000000000000000000000..c92e2d2f08093180f7db404126c86110588d1f0c GIT binary patch literal 4079 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 P4hJDl+glY`T!{WJ*ObQ} literal 0 HcmV?d00001 diff --git a/gfx/gui/frame.xcf b/gfx/gui/frame.xcf new file mode 100644 index 0000000000000000000000000000000000000000..b8b8bc722e88fdcbc87ca820941005a781706d52 GIT binary patch literal 23076 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 C$GU$2 literal 0 HcmV?d00001 diff --git a/src/main.c b/src/main.c index 98a6696..122a607 100644 --- a/src/main.c +++ b/src/main.c @@ -222,10 +222,12 @@ int main(int argc, char** argv) { if(joystick_init()) WARN("Error initializing joystick input"); if(namjoystick != NULL) { + // Use a joystick name to find joystick. joystick_use(joystick_get(namjoystick)); free(namjoystick); } else if(indjoystick >= 0) + // Must be using an id instead. joystick_use(indjoystick); } @@ -234,6 +236,7 @@ int main(int argc, char** argv) { WARN("Error initializing AI"); gl_fontInit(NULL, NULL, 16); + gui_init(); // Init the GUI crap. // Data loading. outfit_load(); @@ -267,6 +270,7 @@ int main(int argc, char** argv) { weapon_exit(); // Destroy all active weapons. space_exit(); // Clean up the universe!!! pilots_free(); // Free the pilots, they where locked up D: + gui_free(); // Free up the gui. ships_free(); outfit_free(); diff --git a/src/main.h b/src/main.h index baef2c0..8a2ec08 100644 --- a/src/main.h +++ b/src/main.h @@ -3,7 +3,10 @@ #define MALLOC_L(type)(malloc(sizeof(type))) #define CALLOC_L(type)(calloc(1, sizeof(type))) -#define ABS(X) ((X<0)?-X:X) +#define ABS(x) ((x<0)?-(x):(x)) + +#define MAX(x,y) (((x)>(y))?(x):(y)) +#define MIN(x,y) (((x)>(y))?(y):(x)) extern char* data; // Modifiable datafile. #define DATA data // Data file. diff --git a/src/opengl.c b/src/opengl.c index 3486090..c609230 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -17,6 +17,10 @@ #define FONT_DEF "../gfx/fonts/FreeSans.ttf" +// offsets to Adjust the pilot's place onscreen to be in the middle, even with the GUI. +extern double gui_xoff; +extern double gui_yoff; + // The screen info, gives data of current opengl settings. gl_info gl_screen; @@ -256,8 +260,8 @@ void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, cons glMatrixMode(GL_PROJECTION); glPushMatrix(); // Projection translation matrix. - glTranslated(VX(*pos) - VX(*gl_camera) - sprite->sw/2., - VY(*pos) -VY(*gl_camera) - sprite->sh/2., 0.); + glTranslated(VX(*pos) - VX(*gl_camera) - sprite->sw/2. + gui_xoff, + VY(*pos) -VY(*gl_camera) - sprite->sh/2. + gui_yoff, 0.); glScalef((double)gl_screen.w/SCREEN_W, (double)gl_screen.h/SCREEN_H, 0.); // Actual blitting.... @@ -293,15 +297,15 @@ void gl_blitStatic(const gl_texture* texture, const Vec2* pos) { // Actual blitting.. glBindTexture(GL_TEXTURE_2D, texture->texture); glBegin(GL_TRIANGLE_STRIP); - glColor4ub(1., 1., 1., 1.); + glColor4d(1., 1., 1., 1.); glTexCoord2d(0., 0.); glVertex2d(0., 0.); - glTexCoord2d(texture->w/texture->rw, 0.); - glVertex2d(texture->w, 0.); - glTexCoord2d(0., texture->h/texture->rh); - glVertex2d(0., texture->h); - glTexCoord2d(texture->w/texture->rw, texture->h/texture->rh); - glVertex2d(texture->w, texture->h); + glTexCoord2d(texture->sw/texture->rw, 0.); + glVertex2d(texture->sw, 0.); + glTexCoord2d(0., texture->sh/texture->rh); + glVertex2d(0., texture->sh); + glTexCoord2d(texture->sw/texture->rw, texture->sh/texture->rh); + glVertex2d(texture->sw, texture->h); glEnd(); glPopMatrix(); // Pop the translation matrix. diff --git a/src/pilot.c b/src/pilot.c index 7fa82d6..66a78e2 100644 --- a/src/pilot.c +++ b/src/pilot.c @@ -75,12 +75,16 @@ void pilot_hit(Pilot* p, double damage_shield, double damage_armor) { // Shields can take part of the blow. p->armor -= p->shield/damage_shield*damage_armor; } + else if(p->armor-damage_armor > 0.) + p->armor -= damage_armor; + else + p->armor = 0.; } // Render the pilot. void pilot_render(Pilot* p) { int sprite; - gl_texture* t = p->ship->gfx_ship; + gl_texture* t = p->ship->gfx_space; // Get the sprite corresponding to the direction facing. sprite = (int)(p->solid->dir / (2.0*M_PI / (t->sy * t->sx))); @@ -90,6 +94,15 @@ void pilot_render(Pilot* p) { // Update the pilot. static void pilot_update(Pilot* pilot, const double dt) { + // Regeneration. + if(pilot->armor < pilot->armor_max) + pilot->armor += pilot->ship->armor_regen*dt; + else + pilot->shield += pilot->ship->shield_regen*dt; + + if(pilot->armor > pilot->armor_max) pilot->armor = pilot->armor_max; + if(pilot->armor > pilot->armor_max) pilot->armor = pilot->armor_max; + if((pilot->solid->dir > 2.*M_PI) || (pilot->solid->dir < 0.0)) pilot->solid->dir = fmod(pilot->solid->dir, 2.*M_PI); @@ -126,9 +139,13 @@ void pilot_init(Pilot* pilot, Ship* ship, char* name, const double dir, const Ve pilot->solid = solid_create(ship->mass, dir, pos, vel); // Max shields armor. - pilot->armor = ship->armor; - pilot->shield = ship->shield; - pilot->energy = ship->energy; + pilot->armor_max = ship->armor; + pilot->shield_max = ship->shield; + pilot->energy_max = ship->energy; + pilot->armor = pilot->armor_max; + pilot->shield = pilot->shield_max; + pilot->energy = pilot->energy_max; + // Initially idle. pilot->task = NULL; diff --git a/src/pilot.h b/src/pilot.h index f3a4832..84e34ac 100644 --- a/src/pilot.h +++ b/src/pilot.h @@ -5,6 +5,10 @@ #include "outfit.h" #include "ship.h" +// Aproximation for pilot size. +#define PILOT_SIZE_APROX 0.8 + +// Creation flags. #define PILOT_PLAYER 1 // Pilot is a player. typedef struct { @@ -24,6 +28,7 @@ typedef struct Pilot { // Current health. double armor, shield, energy; + double armor_max, shield_max, energy_max; void (*think)(struct Pilot*); // AI thinking for the pilot. void (*update)(struct Pilot*, const double); // Update the pilot. diff --git a/src/player.c b/src/player.c index 4c66d0f..5f177bf 100644 --- a/src/player.c +++ b/src/player.c @@ -2,8 +2,11 @@ #include "main.h" #include "pilot.h" #include "log.h" +#include "opengl.h" #include "player.h" +#define POW2(x) ((x)*(x)) + #define KEY_PRESS 1. #define KEY_RELEASE -1. @@ -18,17 +21,199 @@ static Keybind** player_input; // Contains the players keybindings. // Name of each keybinding. const char* keybindNames[] = { "accel", "left", "right", "primary" }; +// Player stuff. Pilot* player = NULL; // extern in pilot.h static double player_turn = 0.; // Turn velocity from input. static double player_acc = 0.; // Accel velocity from input. static int player_primary = 0; // Player is shooting primary weapon. +// Pilot stuff for GUI. +extern Pilot** pilot_stack; +extern int pilots; + +// GUI crap. +// Need these offsets to render properly. -- Used in opengl.c +// -- Colors. +typedef struct { + double r, g, b, a; +} Color; +#define COLOR(x) (x).r, (x).g, (x).b, (x).a +Color cRadar_player = { .r = 0.4, .g = 0.8, .b = 0.9, .a = 1. }; +Color cRadar_neut = { .r = 0.8, .g = 0.8, .b = 0.8, .a = 1. }; +Color cShield = { .r = 0.2, .g = 0.2, .b = 0.8, .a = 1. }; +Color cArmor = { .r = 0.5, .g = 0.5, .b = 0.5, .a = 1. }; +Color cEnergy = { .r = 0.2, .g = 0.8, .b = 0.2, .a = 1. }; + +typedef enum { RADAR_RECT, RADAR_CIRCLE } RadarShape; + +typedef struct { + double w,h; // Dimensions. + RadarShape shape; + double res; // Resolution. +} Radar; + +typedef struct { + double w,h; +} Rect; + +typedef struct { + // graphics. + gl_texture* gfx_frame; + Radar radar; + Rect shield, armor, energy; + // Positions. + Vec2 pos_frame; + Vec2 pos_radar; + Vec2 pos_shield, pos_armor, pos_energy; +} GUI; + +GUI gui; // Le Gui! + +double gui_xoff = 0.; +double gui_yoff = 0.; + extern void pilot_render(Pilot* pilot); // Extern is in Pilot.* // Render the player. void player_render(void) { pilot_render(player); - // Render gui. + + // GUI! + // -- Frame. + gl_blitStatic(gui.gfx_frame, &gui.pos_frame); + // -- Radar. + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glTranslated(VX(gui.pos_radar) - gl_screen.w/2. + gui.radar.w/2., + VY(gui.pos_radar) - gl_screen.h/2. - gui.radar.h/2., 0.); + + glBegin(GL_POINTS); + // Player. + glColor4d(COLOR(cRadar_player)); + glVertex2d( 0., 2. ); + glVertex2d( 0., 1. ); + glVertex2d( 0., 0. ); + glVertex2d( 0., -1. ); + glVertex2d( 0., -2. ); + glVertex2d( 2., 0. ); + glVertex2d( 2., 0. ); + glVertex2d( -1., 0. ); + glVertex2d( -2., 0. ); + + int i; + double x, y, sx, sy; + Pilot* p; + switch(gui.radar.shape) { + case RADAR_RECT: + glEnd(); // Put end to those points. + for(i = 1; i < pilots; i++) { + p = pilot_stack[i]; + x = (p->solid->pos.x - player->solid->pos.x) / gui.radar.res; + y = (p->solid->pos.y - player->solid->pos.y) / gui.radar.res; + sx = PILOT_SIZE_APROX/2. * p->ship->gfx_space->sw / gui.radar.res; + sy = PILOT_SIZE_APROX/2. * p->ship->gfx_space->sh / gui.radar.res; + + if((ABS(x) > gui.radar.w / 2+sx) || (ABS(y) > gui.radar.h / 2. + sy)) + continue; // Pilot isn't in range. + + glBegin(GL_QUADS); + glColor4d(COLOR(cRadar_neut)); + glVertex2d(MAX(x-sx, -gui.radar.w/2.), MIN(y+sx, gui.radar.w/2.)); // top left. + glVertex2d(MIN(x+sx, gui.radar.w/2.), MIN(y+sy, gui.radar.h/2.)); // Top right. + glVertex2d(MAX(x+sx, gui.radar.w/2.), MAX(y-sy, -gui.radar.h/2.)); // Bottom right. + glVertex2d(MAX(x-sx, -gui.radar.w/2.), MIN(y-sy, -gui.radar.h/2.)); // Bottom left. + glEnd(); // The Quads. + } + case RADAR_CIRCLE: + for(i = 1; i < pilots; i++) { + p = pilot_stack[i]; + glColor4d(COLOR(cRadar_neut)); + glVertex2d((p->solid->pos.x - player->solid->pos.x) / gui.radar.res, + (p->solid->pos.y - player->solid->pos.y) / gui.radar.res); + } + glEnd(); + break; + } + glPopMatrix(); // GL_PROJECTION. + + // Health. + glBegin(GL_QUADS); // Shield. + glColor4d(COLOR(cShield)); + x = VX(gui.pos_shield) - gl_screen.w/2.; + y = VY(gui.pos_shield) - gl_screen.h/2.; + sx = player->shield / player->shield_max * gui.shield.w; + sy = gui.shield.h; + glVertex2d(x, y); + glVertex2d(x+sx, y); + glVertex2d(x+sx, y-sy); + glVertex2d(x, y-sy); + glEnd(); + + glBegin(GL_QUADS); // Armor. + glColor4d(COLOR(cArmor)); + x = VX(gui.pos_armor) - gl_screen.w/2.; + y = VY(gui.pos_armor) - gl_screen.h/2.; + sx = player->armor / player->armor_max * gui.armor.w; + sy = gui.armor.h; + glVertex2d(x, y); + glVertex2d(x+sx, y); + glVertex2d(x+sx, y-sy); + glVertex2d(x, y-sy); + glEnd(); + + glBegin(GL_QUADS); // Energy. + glColor4d(COLOR(cEnergy)); + x = VX(gui.pos_energy) - gl_screen.w/2.; + y = VY(gui.pos_energy) - gl_screen.h/2.; + sx = player->energy / player->energy_max * gui.energy.w; + sy = gui.energy.h; + glVertex2d(x, y); + glVertex2d(x+sx, y); + glVertex2d(x+sx, y-sy); + glVertex2d(x, y-sy); + glEnd(); +} + +// Init GUI. +int gui_init(void) { +// -- Frame. + gui.gfx_frame = gl_newImage("../gfx/gui/frame.png"); + vect_csetmin(&gui.pos_frame, + gl_screen.w - gui.gfx_frame->w, // x. + gl_screen.h - gui.gfx_frame->h); // y. + gui_xoff = -gui.gfx_frame->w/2.; // Offset is only horizontal and on the right side. + +// -- Radar. + gui.radar.res = 10.; + gui.radar.w = 128.; + gui.radar.h = 128.; + gui.radar.shape = RADAR_RECT; // RADAR_CIRCLE; + vect_csetmin(&gui.pos_radar, + VX(gui.pos_frame) + 11, // x + VY(gui.pos_frame) + gui.gfx_frame->h - 10); // y. + +// -- Bars. + gui.shield.w = gui.armor.w = gui.energy.w = 128; + gui.shield.h = gui.armor.h = gui.energy.h = 10; + vect_csetmin(&gui.pos_shield, + VX(gui.pos_frame) + 10, // x + VY(gui.pos_frame) + gui.gfx_frame->h - 201); // y. + + vect_csetmin(&gui.pos_armor, + VX(gui.pos_frame) + 10, // x + VY(gui.pos_frame) + gui.gfx_frame->h - 218); // y. + + vect_csetmin(&gui.pos_energy, + VX(gui.pos_frame) + 10, // x + VY(gui.pos_frame) + gui.gfx_frame->h - 236); // y. + + return 0; + +} + +// Free the GUI. +void gui_free(void) { + gl_freeTexture(gui.gfx_frame); } // Used in pilot.c diff --git a/src/player.h b/src/player.h index 9f23ed9..c98e3a1 100644 --- a/src/player.h +++ b/src/player.h @@ -6,6 +6,9 @@ extern Pilot* pilot; typedef enum { KEYBIND_NULL, KEYBIND_KEYBOARD, KEYBIND_JAXIS, KEYBIND_JBUTTON } KeybindType; +// Render. +int gui_init(void); +void gui_free(void); void player_render(void); int player_isFlag(unsigned int flag); diff --git a/src/ship.c b/src/ship.c index 1bdd616..0ec4df9 100644 --- a/src/ship.c +++ b/src/ship.c @@ -49,7 +49,7 @@ static Ship* ship_parse(xmlNodePtr parent) { if(strcmp((char*)node->name, "GFX")==0) { snprintf(str, strlen((char*)node->children->content)+sizeof(SHIP_GFX), SHIP_GFX"%s", (char*)node->children->content); - tmp->gfx_ship = gl_newSprite(str, 6, 6); + tmp->gfx_space = gl_newSprite(str, 6, 6); } else if(strcmp((char*)node->name, "class")==0) tmp->class = atoi((char*)node->children->content); @@ -121,7 +121,7 @@ static Ship* ship_parse(xmlNodePtr parent) { #define MELEMENT(o,s) if(o == 0) WARN("Ship '%s' missing '"s"' element", tmp->name) if(tmp->name == NULL) WARN("Ship '%s' missing 'name' tag", tmp->name); - if(tmp->gfx_ship == NULL) WARN("Ship '%s' missing 'GFX' element", tmp->name); + if(tmp->gfx_space == NULL) WARN("Ship '%s' missing 'GFX' element", tmp->name); MELEMENT(tmp->thrust, "thrust"); MELEMENT(tmp->turn, "turn"); MELEMENT(tmp->speed, "speed"); @@ -191,7 +191,7 @@ void ships_free(void) { so = so->next; free(sot); } - gl_freeTexture((ship_stack+i)->gfx_ship); + gl_freeTexture((ship_stack+i)->gfx_space); } free(ship_stack); ship_stack = NULL; diff --git a/src/ship.h b/src/ship.h index ec4b355..3ed5037 100644 --- a/src/ship.h +++ b/src/ship.h @@ -28,7 +28,7 @@ typedef struct { double thrust, turn, speed; // Graphics. - gl_texture* gfx_ship, *gfx_target; + gl_texture* gfx_space, *gfx_target; // Characteristics. int crew; diff --git a/src/weapon.c b/src/weapon.c index 0b79ce5..d849bc6 100644 --- a/src/weapon.c +++ b/src/weapon.c @@ -10,8 +10,6 @@ #include "pilot.h" #include "weapon.h" -#define SIZE_APROX 0.8 // Aproximation for circle collision detection. - // Some stuff from pilot. extern Pilot** pilot_stack; extern int pilots; @@ -94,8 +92,8 @@ static void weapon_update(Weapon* w, const double dt, WeaponLayer layer) { int i; for(i = 0; i < pilots; i++) { if((w->parent != pilot_stack[i]->id) && - (DIST(w->solid->pos, pilot_stack[i]->solid->pos) < (SIZE_APROX + - w->outfit->gfx_space->sw/2. + pilot_stack[i]->ship->gfx_ship->sw/2.))) { + (DIST(w->solid->pos, pilot_stack[i]->solid->pos) < (PILOT_SIZE_APROX * + w->outfit->gfx_space->sw/2. + pilot_stack[i]->ship->gfx_space->sw/2.))) { pilot_hit(pilot_stack[i], w->outfit->damage_shield, w->outfit->damage_armor); weapon_destroy(w, layer); return;