[Add Gui's NAV and WEAPON monitors are now utilised.

This commit is contained in:
Allanis 2013-02-13 18:57:44 +00:00
parent 6ace8da900
commit 184d527abf
8 changed files with 126 additions and 24 deletions

View File

@ -4,7 +4,7 @@
<ai>test</ai> <ai>test</ai>
<faction>Independent</faction> <faction>Independent</faction>
<pilots> <pilots>
<pilot chance='100'>Enemy Test</pilot> <pilot chance='100' name="Enemy Test">Lancer</pilot>
</pilots> </pilots>
</fleet> </fleet>
<fleet name="Merchant Ship"> <fleet name="Merchant Ship">

View File

@ -59,42 +59,54 @@
<x>72</x> <x>72</x>
<y>72</y> <y>72</y>
</radar> </radar>
<nav>
<x>40</x>
<y>151</y>
<w>112</w>
<h>42</h>
</nav>
<health> <health>
<shield> <shield>
<w>98</w> <w>98</w>
<h>8</h> <h>8</h>
<x>52</x> <x>52</x>
<y>186</y> <y>201</y>
</shield> </shield>
<armor> <armor>
<w>98</w> <w>98</w>
<h>8</h> <h>8</h>
<x>52</x> <x>52</x>
<y>197</y> <y>212</y>
</armor> </armor>
<energy> <energy>
<w>98</w> <w>98</w>
<h>8</h> <h>8</h>
<x>52</x> <x>52</x>
<y>207</y> <y>223</y>
</energy> </energy>
</health> </health>
<weapon>
<x>40</x>
<y>239</y>
<w>112</w>
<h>42</h>
</weapon>
<target> <target>
<gfx> <gfx>
<x>34</x> <x>34</x>
<y>273</y> <y>304</y>
</gfx> </gfx>
<name> <name>
<x>40</x> <x>40</x>
<y>260</y> <y>291</y>
</name> </name>
<faction> <faction>
<x>40</x> <x>40</x>
<y>273</y> <y>304</y>
</faction> </faction>
<health> <health>
<x>40</x> <x>40</x>
<y>370</y> <y>401</y>
</health> </health>
</target> </target>
</gui> </gui>

View File

@ -54,10 +54,10 @@
<outfit quantity ='2'>laser</outfit> <outfit quantity ='2'>laser</outfit>
</outfits> </outfits>
</ship> </ship>
<ship name="Enemy Test"> <ship name="Lancer">
<GFX>ship1</GFX> <GFX>ship1</GFX>
<GUI>simple</GUI> <GUI>simple</GUI>
<class>1</class> <class>2</class>
<movement> <movement>
<thrust>180</thrust> <thrust>180</thrust>
<turn>130</turn> <turn>130</turn>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@ -17,6 +17,9 @@
#define FONT_DEF "../gfx/fonts/FreeSans.ttf" #define FONT_DEF "../gfx/fonts/FreeSans.ttf"
// Default colors.
glColor cGrey = { .r = .75, .g = 0.75, .b = 0.75, .a = 1 };
// offsets to Adjust the pilot's place onscreen to be in the middle, even with the GUI. // offsets to Adjust the pilot's place onscreen to be in the middle, even with the GUI.
extern double gui_xoff; extern double gui_xoff;
extern double gui_yoff; extern double gui_yoff;
@ -38,7 +41,7 @@ static int pot(int n);
// gl_texture. // gl_texture.
static GLuint gl_loadSurface(SDL_Surface* surface, int* rw, int* rh); static GLuint gl_loadSurface(SDL_Surface* surface, int* rw, int* rh);
// Gl font. // Gl font.
static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* tex_base); static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* tex_base, int* width_base);
// ================ // ================
// MISC! // MISC!
@ -437,10 +440,32 @@ void gl_print(const gl_font* ft_font, const Vec2* pos, const glColor* c, const c
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
} }
// Get the width of the text about to be printed.
int gl_printWidth(const gl_font* ft_font, const char* fmt, ...) {
int i, n;
char txt[256]; // Holds the string.
va_list ap;
if(ft_font == NULL) ft_font = &gl_defFont;
if(fmt == NULL) return 0;
else {
// Convert the symbols to text.
va_start(ap, fmt);
vsprintf(txt, fmt, ap);
va_end(ap);
}
for(n = 0, i = 0; i < (int)strlen(txt); i++)
n += ft_font->w[(int)txt[i]];
return n;
}
// ================ // ================
// FONT! // FONT!
// ================ // ================
static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* tex_base) { static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* tex_base, int* width_base) {
FT_Glyph glyph; FT_Glyph glyph;
FT_Bitmap bitmap; FT_Bitmap bitmap;
GLubyte* expanded_data; GLubyte* expanded_data;
@ -492,6 +517,9 @@ static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* te
double x = (double)bitmap.width/(double)w; double x = (double)bitmap.width/(double)w;
double y = (double)bitmap.rows/(double)h; double y = (double)bitmap.rows/(double)h;
// Give the width a value.
width_base[(int)ch] = bitmap.width;
// Draw the texture mapped quad. // Draw the texture mapped quad.
glBindTexture(GL_TEXTURE_2D, tex_base[(int)ch]); glBindTexture(GL_TEXTURE_2D, tex_base[(int)ch]);
glBegin(GL_TRIANGLE_STRIP); glBegin(GL_TRIANGLE_STRIP);
@ -514,14 +542,20 @@ static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* te
FT_Done_Glyph(glyph); FT_Done_Glyph(glyph);
} }
void gl_fontInit(gl_font* font, const char* fname, unsigned int h) { void gl_fontInit(gl_font* font, const char* fname, const unsigned int h) {
if(font == NULL) font = &gl_defFont; if(font == NULL) font = &gl_defFont;
uint32_t bufsize; uint32_t bufsize;
FT_Byte* buf = pack_readfile(DATA, (fname) ? fname : FONT_DEF, &bufsize); FT_Byte* buf = pack_readfile(DATA, (fname) ? fname : FONT_DEF, &bufsize);
// Allocatagery.
font->textures = malloc(sizeof(GLuint)*128); font->textures = malloc(sizeof(GLuint)*128);
font->h = h; font->w = malloc(sizeof(int)*128);
font->h = (int)h;
if(font->textures == NULL || font->w == NULL) {
WARN("Out of memory!");
return;
}
// Create a FreeType font library. // Create a FreeType font library.
FT_Library library; FT_Library library;
@ -544,7 +578,7 @@ void gl_fontInit(gl_font* font, const char* fname, unsigned int h) {
// Create each of the font display lists. // Create each of the font display lists.
unsigned char i; unsigned char i;
for(i = 0; i < 128; i++) for(i = 0; i < 128; i++)
gl_fontMakeDList(face, i, font->list_base, font->textures); gl_fontMakeDList(face, i, font->list_base, font->textures, font->w);
// We can now free the face and library. // We can now free the face and library.
FT_Done_Face(face); FT_Done_Face(face);
@ -557,6 +591,7 @@ void gl_freeFont(gl_font* font) {
glDeleteLists(font->list_base, 128); glDeleteLists(font->list_base, 128);
glDeleteTextures(128, font->textures); glDeleteTextures(128, font->textures);
free(font->textures); free(font->textures);
free(font->w);
} }
// ================ // ================

View File

@ -33,6 +33,9 @@ typedef struct {
} glColor; } glColor;
#define COLOR(x) glColor4d((x).r, (x).g, (x).b, (x).a) #define COLOR(x) glColor4d((x).r, (x).g, (x).b, (x).a)
// Default colors.
extern glColor cGrey;
// Spritesheet info. // Spritesheet info.
typedef struct { typedef struct {
double w, h; // Real size of the image (excluding POT buffer. double w, h; // Real size of the image (excluding POT buffer.
@ -45,7 +48,8 @@ typedef struct {
// Font info. // Font info.
typedef struct { typedef struct {
float h; // Height. int h; // Height.
int* w;
GLuint* textures; GLuint* textures;
GLuint list_base; GLuint list_base;
} gl_font; } gl_font;
@ -53,7 +57,7 @@ extern gl_font gl_defFont; // Default font.
// gl_font loading/freeing. // gl_font loading/freeing.
// If font is NULL it uses the internal default font, same with gl_print // If font is NULL it uses the internal default font, same with gl_print
void gl_fontInit(gl_font* font, const char* fname, unsigned int h); void gl_fontInit(gl_font* font, const char* fname, const unsigned int h);
void gl_freeFont(gl_font* font); void gl_freeFont(gl_font* font);
// gl_texute loading/freeing. // gl_texute loading/freeing.
@ -69,6 +73,7 @@ void gl_blitSprite(const gl_texture* sprite, const Vec2* pos,
void gl_blitStatic(const gl_texture* texture, const Vec2* pos, const glColor* c); void gl_blitStatic(const gl_texture* texture, const Vec2* pos, const glColor* c);
void gl_bindCamera(const Vec2* pos); void gl_bindCamera(const Vec2* pos);
void gl_print(const gl_font* ft_font, const Vec2* pos, const glColor* c, const char* fmt, ...); void gl_print(const gl_font* ft_font, const Vec2* pos, const glColor* c, const char* fmt, ...);
int gl_printWidth(const gl_font* ft_font, const char* fmt, ...);
// Initialize/cleanup. // Initialize/cleanup.
int gl_init(void); int gl_init(void);

View File

@ -8,9 +8,6 @@
#include "xml.h" #include "xml.h"
#include "player.h" #include "player.h"
#define XML_NODE_START 1
#define XML_NODE_TEXT 3
#define XML_GUI_ID "GUIs" // XML section identifier. #define XML_GUI_ID "GUIs" // XML section identifier.
#define XML_GUI_TAG "gui" #define XML_GUI_TAG "gui"
@ -43,7 +40,10 @@ Pilot* player = NULL; // extern in pilot.h
static double player_turn = 0.; // Turn velocity from input. static double player_turn = 0.; // Turn velocity from input.
static double player_acc = 0.; // Accel velocity from input. static double player_acc = 0.; // Accel velocity from input.
static int player_primary = 0; // Player is shooting primary weapon. static int player_primary = 0; // Player is shooting primary weapon.
static int player_secondary = 0; // layer is shooting secondary weapon.
static unsigned int player_target = PLAYER_ID; // Targetted pilot. static unsigned int player_target = PLAYER_ID; // Targetted pilot.
static int planet_target = -1; // Targetted planet.
static int weapon = -1; // Secondary weapon is in use.
// Pilot stuff for GUI. // Pilot stuff for GUI.
extern Pilot** pilot_stack; extern Pilot** pilot_stack;
@ -88,11 +88,16 @@ typedef struct {
gl_texture* gfx_frame; gl_texture* gfx_frame;
gl_texture* gfx_targetPilot, *gfx_targetPlanet; gl_texture* gfx_targetPilot, *gfx_targetPlanet;
Radar radar; Radar radar;
Rect nav;
Rect shield, armor, energy; Rect shield, armor, energy;
Rect weapon;
// Positions. // Positions.
Vec2 pos_frame; Vec2 pos_frame;
Vec2 pos_radar; Vec2 pos_radar;
Vec2 pos_nav;
Vec2 pos_shield, pos_armor, pos_energy; Vec2 pos_shield, pos_armor, pos_energy;
Vec2 pos_weapon;
Vec2 pos_target, pos_target_health, pos_target_name, pos_target_faction; Vec2 pos_target, pos_target_health, pos_target_name, pos_target_faction;
Vec2 pos_msg; Vec2 pos_msg;
} GUI; } GUI;
@ -225,6 +230,18 @@ void player_render(void) {
gui_renderBar(&cArmor, &gui.pos_armor, &gui.armor, player->armor / player->armor_max); gui_renderBar(&cArmor, &gui.pos_armor, &gui.armor, player->armor / player->armor_max);
gui_renderBar(&cEnergy, &gui.pos_energy, &gui.energy, player->energy / player->energy_max); gui_renderBar(&cEnergy, &gui.pos_energy, &gui.energy, player->energy / player->energy_max);
// Nav.
if(planet_target != -1) {
} else {
i = gl_printWidth(NULL, "Nav");
vect_csetmin(&v, VX(gui.pos_nav) + (gui.nav.w - i)/2., VY(gui.pos_nav) - 5);
gl_print(NULL, &v, &cGrey, "NAV");
i = gl_printWidth(&gui.smallFont, "No Target");
vect_csetmin(&v, VX(gui.pos_nav) + (gui.nav.w - i)/2., VY(gui.pos_nav) - 10 - gui.smallFont.h);
gl_print(&gui.smallFont, &v, &cGrey, "No Target");
}
// Target. // Target.
if(player_target != PLAYER_ID) { if(player_target != PLAYER_ID) {
p = pilot_get(player_target); p = pilot_get(player_target);
@ -245,6 +262,17 @@ void player_render(void) {
else else
// On armor. // On armor.
gl_print(&gui.smallFont, &gui.pos_target_health, NULL, "%s: %.0f%%", "Armor", p->armor/p->armor_max*100.); gl_print(&gui.smallFont, &gui.pos_target_health, NULL, "%s: %.0f%%", "Armor", p->armor/p->armor_max*100.);
}
// Weapon.
if(weapon == -1) {
i = gl_printWidth(NULL, "Secondary");
vect_csetmin(&v, VX(gui.pos_weapon) + (gui.weapon.w - i)/2., VY(gui.pos_weapon) - 5);
gl_print(NULL, &v, &cGrey, "Secondary");
i = gl_printWidth(&gui.smallFont, "None");
vect_csetmin(&v, VX(gui.pos_weapon) + (gui.weapon.w - i)/2., VY(gui.pos_weapon) - 10 - gl_defFont.h);
gl_print(&gui.smallFont, &v, &cGrey, "None");
} else {
} }
// Messages. // Messages.
VX(v) = VX(gui.pos_msg); VX(v) = VX(gui.pos_msg);
@ -318,6 +346,11 @@ static void gui_renderBar(const glColor* c, const Vec2* p, const Rect* r, const
// Init GUI. // Init GUI.
int gui_init(void) { int gui_init(void) {
// Set graphics to NULL.
gui.gfx_frame = NULL;
gui.gfx_targetPilot = NULL;
gui.gfx_targetPlanet = NULL;
// Font. // Font.
gl_fontInit(&gui.smallFont, NULL, 10); gl_fontInit(&gui.smallFont, NULL, 10);
// -- Radar. // -- Radar.
@ -446,12 +479,15 @@ static int gui_parse(const xmlNodePtr parent, const char* name) {
tmp = malloc((strlen(tmp2)+strlen(GUI_GFX)+12) * sizeof(char)); tmp = malloc((strlen(tmp2)+strlen(GUI_GFX)+12) * sizeof(char));
// Frame. // Frame.
snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+5, GUI_GFX"%s.png", tmp2); snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+5, GUI_GFX"%s.png", tmp2);
if(gui.gfx_frame) gl_freeTexture(gui.gfx_frame); // Free if needed.
gui.gfx_frame = gl_newImage(tmp); gui.gfx_frame = gl_newImage(tmp);
// Pilot. // Pilot.
snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+11, GUI_GFX"%s_pilot.png", tmp2); snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+11, GUI_GFX"%s_pilot.png", tmp2);
if(gui.gfx_targetPilot) gl_freeTexture(gui.gfx_targetPilot); // Free if needed.
gui.gfx_targetPilot = gl_newSprite(tmp, 2, 2); gui.gfx_targetPilot = gl_newSprite(tmp, 2, 2);
// Planet. // Planet.
snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+12, GUI_GFX"%s_planet.png", tmp2); snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+12, GUI_GFX"%s_planet.png", tmp2);
if(gui.gfx_targetPlanet) gl_freeTexture(gui.gfx_targetPlanet); // Free if needed.
gui.gfx_targetPlanet = gl_newSprite(tmp, 2, 2); gui.gfx_targetPlanet = gl_newSprite(tmp, 2, 2);
free(tmp); free(tmp);
free(tmp2); free(tmp2);
@ -490,6 +526,13 @@ static int gui_parse(const xmlNodePtr parent, const char* name) {
VX(gui.pos_frame) + x, VX(gui.pos_frame) + x,
VY(gui.pos_frame) + gui.gfx_frame->h - y); VY(gui.pos_frame) + gui.gfx_frame->h - y);
} }
// Nav computer.
else if(xml_isNode(node, "nav")) {
rect_parse(node, &x, &y, &gui.nav.w, &gui.nav.h);
vect_csetmin(&gui.pos_nav,
VX(gui.pos_frame) + x,
VY(gui.pos_frame) + gui.gfx_frame->h - y - gl_defFont.h);
}
// Health bars. // Health bars.
else if(xml_isNode(node, "health")) { else if(xml_isNode(node, "health")) {
cur = node->children; cur = node->children;
@ -516,6 +559,13 @@ static int gui_parse(const xmlNodePtr parent, const char* name) {
} }
} while((cur = cur->next)); } while((cur = cur->next));
} }
// Secondary weapon.
else if(xml_isNode(node, "weapon")) {
rect_parse(node, &x, &y, &gui.weapon.w, &gui.weapon.h);
vect_csetmin(&gui.pos_weapon,
VX(gui.pos_frame) + x,
VY(gui.pos_frame) + gui.gfx_frame->h - y - gl_defFont.h);
}
// Target. // Target.
else if(xml_isNode(node, "target")) { else if(xml_isNode(node, "target")) {
cur = node->children; cur = node->children;

View File

@ -8,10 +8,10 @@
#define SHIP_TARGET_H 96 #define SHIP_TARGET_H 96
enum ship_class { enum ship_class {
SHIP_CLASS_NULL, SHIP_CLASS_NULL = 0,
SHIP_CLASS_CIV_LIGHT, SHIP_CLASS_CIV_LIGHT = 1,
SHIP_CLASS_CIV_MEDIUM, SHIP_CLASS_CIV_MEDIUM = 2,
SHIP_CLASS_CIV_HEAVY SHIP_CLASS_CIV_HEAVY = 3
}; };
typedef enum ship_class ship_class; typedef enum ship_class ship_class;