Add basic AABB collision detection
This commit is contained in:
parent
7acf36cd59
commit
b7063963b8
@ -21,16 +21,14 @@ void renderer_entity(Renderer *renderer, Entity *entity, f32 rotate, v3 color)
|
|||||||
// this->shader->uniformSetVec3f("spriteColor", color);
|
// this->shader->uniformSetVec3f("spriteColor", color);
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glCheckError();
|
|
||||||
glBindTexture(GL_TEXTURE_2D, entity->tex->id);
|
glBindTexture(GL_TEXTURE_2D, entity->tex->id);
|
||||||
glCheckError();
|
|
||||||
shader_uniformSet1i(renderer->shader, "tex", 0);
|
shader_uniformSet1i(renderer->shader, "tex", 0);
|
||||||
glCheckError();
|
glCheckError();
|
||||||
|
|
||||||
glBindVertexArray(renderer->vao);
|
glBindVertexArray(renderer->vao);
|
||||||
glCheckError();
|
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||||
glCheckError();
|
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
glCheckError();
|
glCheckError();
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,7 @@ void worldTraveller_gameInit(GameState *state)
|
|||||||
V2(58.0f, 98.0f),
|
V2(58.0f, 98.0f),
|
||||||
direction_east,
|
direction_east,
|
||||||
asset_getTexture(texlist_hero),
|
asset_getTexture(texlist_hero),
|
||||||
|
TRUE,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0};
|
0};
|
||||||
@ -89,6 +90,7 @@ void worldTraveller_gameInit(GameState *state)
|
|||||||
hero->size,
|
hero->size,
|
||||||
direction_null,
|
direction_null,
|
||||||
hero->tex,
|
hero->tex,
|
||||||
|
TRUE,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0};
|
0};
|
||||||
@ -193,7 +195,8 @@ INTERNAL void parseInput(GameState *state, const f32 dt)
|
|||||||
currAnim->currRectIndex = 0;
|
currAnim->currRectIndex = 0;
|
||||||
hero->currAnimIndex = 0;
|
hero->currAnimIndex = 0;
|
||||||
}
|
}
|
||||||
} else if (hero->currAnimIndex == 0)
|
}
|
||||||
|
else if (hero->currAnimIndex == 0)
|
||||||
{
|
{
|
||||||
SpriteAnim *currAnim = &hero->anim[hero->currAnimIndex];
|
SpriteAnim *currAnim = &hero->anim[hero->currAnimIndex];
|
||||||
currAnim->currDuration = currAnim->duration;
|
currAnim->currDuration = currAnim->duration;
|
||||||
@ -221,9 +224,42 @@ INTERNAL void parseInput(GameState *state, const f32 dt)
|
|||||||
v2 dPos = v2_scale(hero->dPos, dt);
|
v2 dPos = v2_scale(hero->dPos, dt);
|
||||||
v2 newHeroP = v2_add(v2_add(ddPosNew, dPos), hero->pos);
|
v2 newHeroP = v2_add(v2_add(ddPosNew, dPos), hero->pos);
|
||||||
|
|
||||||
|
b32 heroCollided = FALSE;
|
||||||
|
if (hero->collides == TRUE)
|
||||||
|
{
|
||||||
|
for (i32 i = 0; i < ARRAY_COUNT(state->entityList); i++)
|
||||||
|
{
|
||||||
|
if (i == state->heroIndex) continue;
|
||||||
|
Entity entity = state->entityList[i];
|
||||||
|
if (entity.collides)
|
||||||
|
{
|
||||||
|
v4 heroRect =
|
||||||
|
V4(newHeroP.x, newHeroP.y, (newHeroP.x + hero->size.x),
|
||||||
|
(newHeroP.y + hero->size.y));
|
||||||
|
v4 entityRect = getEntityScreenRect(entity);
|
||||||
|
|
||||||
|
if (((heroRect.z >= entityRect.x && heroRect.z <= entityRect.z) ||
|
||||||
|
(heroRect.x >= entityRect.x && heroRect.x <= entityRect.z)) &&
|
||||||
|
((heroRect.w <= entityRect.y && heroRect.w >= entityRect.w) ||
|
||||||
|
(heroRect.y <= entityRect.y && heroRect.y >= entityRect.w)))
|
||||||
|
{
|
||||||
|
heroCollided = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (heroCollided)
|
||||||
|
{
|
||||||
|
hero->dPos = V2(0.0f, 0.0f);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
// f'(t) = curr velocity = a*t + v, where v is old velocity
|
// f'(t) = curr velocity = a*t + v, where v is old velocity
|
||||||
hero->dPos = v2_add(hero->dPos, v2_scale(ddPos, dt));
|
hero->dPos = v2_add(hero->dPos, v2_scale(ddPos, dt));
|
||||||
hero->pos = newHeroP;
|
hero->pos = newHeroP;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt)
|
void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt)
|
||||||
|
@ -31,11 +31,24 @@ typedef struct Entity
|
|||||||
v2 size;
|
v2 size;
|
||||||
enum Direction direction;
|
enum Direction direction;
|
||||||
Texture *tex;
|
Texture *tex;
|
||||||
|
b32 collides;
|
||||||
|
|
||||||
// TODO(doyle): String based access
|
// TODO(doyle): String based access
|
||||||
SpriteAnim anim[16];
|
SpriteAnim anim[16];
|
||||||
i32 freeAnimIndex;
|
i32 freeAnimIndex;
|
||||||
i32 currAnimIndex;
|
i32 currAnimIndex;
|
||||||
|
|
||||||
} Entity;
|
} Entity;
|
||||||
|
|
||||||
|
INTERNAL inline v4 getEntityScreenRect(Entity entity)
|
||||||
|
{
|
||||||
|
v2 entityUpperLeftBound = v2_add(entity.pos, V2(0.0f, entity.size.y));
|
||||||
|
v2 entityLowerRightBound = v2_add(entity.pos, V2(entity.size.x, 0.0f));
|
||||||
|
|
||||||
|
v4 result = V4(entityUpperLeftBound.x, entityUpperLeftBound.y,
|
||||||
|
entityLowerRightBound.x, entityLowerRightBound.y);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user