Add distance to battle range metric in pixels

This commit is contained in:
Doyle Thai 2016-07-16 02:34:44 +10:00
parent 12fbc1000e
commit 86b4d1e206
5 changed files with 92 additions and 38 deletions

View File

@ -155,7 +155,7 @@ const i32 asset_loadTTFont(AssetManager *assetManager, const char *filePath)
GlyphBitmap *glyphBitmaps = PLATFORM_MEM_ALLOC(numGlyphs, GlyphBitmap); GlyphBitmap *glyphBitmaps = PLATFORM_MEM_ALLOC(numGlyphs, GlyphBitmap);
v2i largestGlyphDimension = V2i(0, 0); v2i largestGlyphDimension = V2i(0, 0);
const f32 targetFontHeight = 20.0f; const f32 targetFontHeight = 15.0f;
f32 scaleY = stbtt_ScaleForPixelHeight(&fontInfo, targetFontHeight); f32 scaleY = stbtt_ScaleForPixelHeight(&fontInfo, targetFontHeight);
i32 ascent, descent, lineGap; i32 ascent, descent, lineGap;

View File

@ -34,6 +34,13 @@ void debug_pushString(char *formatString, void *data, char *dataType)
ARRAY_COUNT(GLOBAL_debugState.debugStrings[0]), ARRAY_COUNT(GLOBAL_debugState.debugStrings[0]),
formatString, val); formatString, val);
} }
else if (common_strcmp(dataType, "f32") == 0)
{
f32 val = *(CAST(f32 *) data);
snprintf(GLOBAL_debugState.debugStrings[numDebugStrings],
ARRAY_COUNT(GLOBAL_debugState.debugStrings[0]),
formatString, val);
}
else else
{ {
ASSERT(INVALID_CODE_PATH); ASSERT(INVALID_CODE_PATH);

View File

@ -177,8 +177,7 @@ void worldTraveller_gameInit(GameState *state, v2i windowSize)
Renderer *renderer = &state->renderer; Renderer *renderer = &state->renderer;
v2 size = V2(58.0f, 98.0f); v2 size = V2(58.0f, 98.0f);
v2 pos = V2(((renderer->size.w * 0.5f) - (size.w * 0.5f)), v2 pos = V2(size.x, CAST(f32) state->tileSize);
CAST(f32) state->tileSize);
enum EntityType type = entitytype_hero; enum EntityType type = entitytype_hero;
enum Direction dir = direction_east; enum Direction dir = direction_east;
Texture *tex = asset_getTexture(assetManager, texlist_hero); Texture *tex = asset_getTexture(assetManager, texlist_hero);
@ -202,7 +201,7 @@ void worldTraveller_gameInit(GameState *state, v2i windowSize)
addAnim(hero, heroWalkRects, numRects, duration); addAnim(hero, heroWalkRects, numRects, duration);
/* Create a NPC */ /* Create a NPC */
pos = V2((renderer->size.w / 3.0f), CAST(f32) state->tileSize); pos = V2(hero->pos.x * 3, CAST(f32) state->tileSize);
size = hero->size; size = hero->size;
type = entitytype_npc; type = entitytype_npc;
dir = direction_null; dir = direction_null;
@ -397,13 +396,14 @@ void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt)
AssetManager *assetManager = &state->assetManager; AssetManager *assetManager = &state->assetManager;
Renderer *renderer = &state->renderer; Renderer *renderer = &state->renderer;
World *const world = &state->world[state->currWorldIndex]; World *const world = &state->world[state->currWorldIndex];
Entity *hero = &world->entities[world->heroIndex];
#ifdef DENGINE_DEBUG
Font *font = &assetManager->font;
#endif
/* Render entities */ /* Recalculate rendering bounds */
ASSERT(world->freeEntityIndex < world->maxEntities);
v4 cameraBounds = getRect(world->cameraPos, renderer->size); v4 cameraBounds = getRect(world->cameraPos, renderer->size);
// NOTE(doyle): Lock camera if it passes the bounds of the world // NOTE(doyle): Lock camera if it passes the bounds of the world
if (cameraBounds.x <= world->bounds.x) if (cameraBounds.x <= world->bounds.x)
{ {
@ -422,9 +422,12 @@ void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt)
if (cameraBounds.w <= world->bounds.w) cameraBounds.w = world->bounds.w; if (cameraBounds.w <= world->bounds.w) cameraBounds.w = world->bounds.w;
Font *font = &assetManager->font; /* Render and update loop */
ASSERT(world->freeEntityIndex < world->maxEntities);
for (i32 i = 0; i < world->freeEntityIndex; i++) for (i32 i = 0; i < world->freeEntityIndex; i++)
{ {
/* Render entities */
Entity *const entity = &world->entities[i]; Entity *const entity = &world->entities[i];
f32 rotate = 0.0f; f32 rotate = 0.0f;
switch (entity->type) switch (entity->type)
@ -438,11 +441,41 @@ void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt)
renderer_entity(&state->renderer, cameraBounds, entity, dt, rotate, renderer_entity(&state->renderer, cameraBounds, entity, dt, rotate,
V4(1, 1, 1, 1)); V4(1, 1, 1, 1));
// TODO(doyle): Clean up lines
// Renderer::~Renderer() { glDeleteVertexArrays(1, &this->quadVAO); }
/* Game logic */
if (entity->type == entitytype_hero) continue;
else if (entity->type == entitytype_mob)
{
// TODO(doyle): Currently calculated in pixels, how about meaningful
// game units?
f32 distance = v2_magnitude(hero->pos, entity->pos);
#ifdef DENGINE_DEBUG
DEBUG_PUSH_STRING("Hero to Entity Magnitude: %06.2f", distance,
"f32");
#endif
if (distance <= 500.0f)
{
#ifdef DENGINE_DEBUG
v4 color = V4(1.0f, 0, 0, 1);
char *battleStr = "IN-BATTLE RANGE";
f32 strLenInPixels =
CAST(f32)(font->maxSize.w * common_strlen(battleStr));
v2 strPos =
V2((renderer->size.w * 0.5f) - (strLenInPixels * 0.5f),
renderer->size.h - 300.0f);
renderer_staticString(&state->renderer, font, battleStr, strPos,
0, color);
#endif
}
}
#ifdef DENGINE_DEBUG #ifdef DENGINE_DEBUG
/* Render debug markers on entities */
v4 color = V4(1, 1, 1, 1); v4 color = V4(1, 1, 1, 1);
char *debugString = NULL; char *debugString = NULL;
switch(entity->type) switch (entity->type)
{ {
case entitytype_mob: case entitytype_mob:
color = V4(1, 0, 0, 1); color = V4(1, 0, 0, 1);
@ -480,25 +513,29 @@ void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt)
entity->pos.x, entity->pos.y); entity->pos.x, entity->pos.y);
renderer_string(&state->renderer, cameraBounds, font, entityPosStr, renderer_string(&state->renderer, cameraBounds, font, entityPosStr,
strPos, 0, color); strPos, 0, color);
strPos.y -= GLOBAL_debugState.stringLineGap;
char entityIDStr[256];
snprintf(entityIDStr, ARRAY_COUNT(entityIDStr), "ID: %4d/%d", i,
world->maxEntities);
renderer_string(&state->renderer, cameraBounds, font, entityIDStr,
strPos, 0, color);
} }
#endif #endif
} }
// TODO(doyle): Clean up lines
// Renderer::~Renderer() { glDeleteVertexArrays(1, &this->quadVAO); }
#ifdef DENGINE_DEBUG #ifdef DENGINE_DEBUG
Entity *hero = &world->entities[world->heroIndex]; /* Render debug info stack */
DEBUG_PUSH_STRING("Hero Pos: %06.2f, %06.2f", &hero->pos, "v2"); DEBUG_PUSH_STRING("Hero Pos: %06.2f, %06.2f", hero->pos, "v2");
DEBUG_PUSH_STRING("Hero dPos: %06.2f, %06.2f", &hero->dPos, "v2"); DEBUG_PUSH_STRING("Hero dPos: %06.2f, %06.2f", hero->dPos, "v2");
DEBUG_PUSH_STRING("FreeEntityIndex: %d", &world->freeEntityIndex, "i32"); DEBUG_PUSH_STRING("FreeEntityIndex: %d", world->freeEntityIndex, "i32");
DEBUG_PUSH_STRING("glDrawArray Calls: %d", DEBUG_PUSH_STRING("glDrawArray Calls: %d",
&GLOBAL_debugState.callCount[debugcallcount_drawArrays], GLOBAL_debugState.callCount[debugcallcount_drawArrays],
"i32"); "i32");
i32 debug_kbAllocated = GLOBAL_debugState.totalMemoryAllocated / 1024; i32 debug_kbAllocated = GLOBAL_debugState.totalMemoryAllocated / 1024;
DEBUG_PUSH_STRING("TotalMemoryAllocated: %dkb", &debug_kbAllocated, "i32"); DEBUG_PUSH_STRING("TotalMemoryAllocated: %dkb", debug_kbAllocated, "i32");
debug_stringUpdateAndRender(&state->renderer, font, dt); debug_stringUpdateAndRender(&state->renderer, font, dt);
debug_clearCallCounter(); debug_clearCallCounter();
#endif #endif

View File

@ -5,7 +5,7 @@
#define INVALID_CODE_PATH TRUE #define INVALID_CODE_PATH TRUE
#define DEBUG_PUSH_STRING(formatString, data, type) \ #define DEBUG_PUSH_STRING(formatString, data, type) \
debug_pushString(formatString, CAST(void *) data, type) debug_pushString(formatString, CAST(void *)&data, type)
enum DebugCallCount enum DebugCallCount
{ {

View File

@ -8,6 +8,7 @@
#define SQUARED(x) (x * x) #define SQUARED(x) (x * x)
#define ABS(x) ((x) > 0 ? (x) : -(x)) #define ABS(x) ((x) > 0 ? (x) : -(x))
#define DEGREES_TO_RADIANS(x) (x * (MATH_PI / 180.0f)) #define DEGREES_TO_RADIANS(x) (x * (MATH_PI / 180.0f))
#define SQRT(x) (sqrtf(x))
/* VECTORS */ /* VECTORS */
typedef union v2i typedef union v2i
@ -136,6 +137,15 @@ INTERNAL inline v##num##i v##num##i_add(const v##num##i a, const v##num##i b) \
DEFINE_VECTOR_INT_MATH(2); DEFINE_VECTOR_INT_MATH(2);
INTERNAL inline f32 v2_magnitude(const v2 a, const v2 b)
{
f32 x = b.x - a.x;
f32 y = b.y - a.y;
f32 inner = (SQUARED(x) + SQUARED(y));
f32 result = SQRT(inner);
return result;
}
INTERNAL inline v3 v3_cross(const v3 a, const v3 b) INTERNAL inline v3 v3_cross(const v3 a, const v3 b)
{ {
/* /*