Add basic movement

This commit is contained in:
2023-11-12 19:04:25 +01:00
parent 526d292fb5
commit bf543330e5
10 changed files with 52 additions and 5 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -28,6 +28,8 @@ typedef f32 Health;
typedef struct TextureRegion { typedef struct TextureRegion {
Texture2D texture; Texture2D texture;
Rectangle rec; Rectangle rec;
bool flipX;
bool flipY;
} TextureRegion; } TextureRegion;
typedef enum AnimationType { typedef enum AnimationType {

View File

@@ -12,6 +12,8 @@ typedef struct Game {
BzTileMap map; BzTileMap map;
int selectedBuilding; int selectedBuilding;
ecs_entity_t *entityMap; ecs_entity_t *entityMap;
f32 frameDuration;
Vector2 targetPos;
} Game; } Game;
extern Game *GAME; extern Game *GAME;

View File

@@ -85,6 +85,7 @@ bool init(Game *game) {
ECS_SYSTEM(ECS, updateAnimations, EcsOnUpdate, Animation, TextureRegion); ECS_SYSTEM(ECS, updateAnimations, EcsOnUpdate, Animation, TextureRegion);
ECS_SYSTEM(ECS, renderEntities, EcsOnUpdate, Position, Size, Rotation, TextureRegion); ECS_SYSTEM(ECS, renderEntities, EcsOnUpdate, Position, Size, Rotation, TextureRegion);
ECS_SYSTEM(ECS, updatePos, EcsOnUpdate, Position, TextureRegion);
return true; return true;
} }
@@ -119,6 +120,8 @@ void update(float dt, Game *game) {
game->camera.zoom += ((float) GetMouseWheelMove() * 0.05f); game->camera.zoom += ((float) GetMouseWheelMove() * 0.05f);
Vector2 worldPos = GetScreenToWorld2D(GetMousePosition(), game->camera); Vector2 worldPos = GetScreenToWorld2D(GetMousePosition(), game->camera);
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT))
game->targetPos = worldPos;
int tileX = (int) worldPos.x / 16; int tileX = (int) worldPos.x / 16;
int tileY = (int) worldPos.y / 16; int tileY = (int) worldPos.y / 16;
@@ -165,7 +168,7 @@ void imguiRender(float dt, Game *game) {
} }
if (igCollapsingHeader_TreeNodeFlags("Entities", 0)) { if (igCollapsingHeader_TreeNodeFlags("Entities", 0)) {
igSliderFloat("Frame duration", &game->frameDuration, 0.0f, 1.0f, NULL, 0);
} }
igEnd(); igEnd();
igShowDemoWindow(NULL); igShowDemoWindow(NULL);

View File

@@ -37,12 +37,12 @@ bool initEntityObjectsLayer(BzTileMap *map, BzTileObjectGroup *objectGroup) {
ecs_set(ECS, e, Animation, { ecs_set(ECS, e, Animation, {
.firstFrame=(TextureRegion) { .firstFrame=(TextureRegion) {
objectTileset->tiles, objectTileset->tiles,
bzTilesetGetTileRegion(objectTileset, object.gid) bzTilesetGetTileRegion(objectTileset, object.gid + 1)
}, },
.currAnimation=ANIMATION_IDLE, .currAnimation=ANIMATION_IDLE,
.currFrame=0, .currFrame=0,
.frameCount=2, .frameCount=4,
.frameDuration=0.36f .frameDuration=0.20f
}); });
} }
return true; return true;

View File

@@ -1,5 +1,7 @@
#include "systems.h" #include "systems.h"
#include "../game_state.h"
void updateAnimations(ecs_iter_t *it) { void updateAnimations(ecs_iter_t *it) {
Animation *anim = ecs_field(it, Animation, 1); Animation *anim = ecs_field(it, Animation, 1);
TextureRegion *t = ecs_field(it, TextureRegion, 2); TextureRegion *t = ecs_field(it, TextureRegion, 2);
@@ -7,6 +9,7 @@ void updateAnimations(ecs_iter_t *it) {
float dt = GetFrameTime(); float dt = GetFrameTime();
for (i32 i = 0; i < it->count; i++) { for (i32 i = 0; i < it->count; i++) {
anim[i].frameDuration = GAME->frameDuration;
anim[i].elapsed += dt; anim[i].elapsed += dt;
if (anim[i].elapsed < anim[i].frameDuration) continue; if (anim[i].elapsed < anim[i].frameDuration) continue;

View File

@@ -9,6 +9,9 @@ void renderEntities(ecs_iter_t *it) {
for (i32 i = 0; i < it->count; i++) { for (i32 i = 0; i < it->count; i++) {
Rectangle dst = {p[i].x, p[i].y, s[i].x, s[i].y}; Rectangle dst = {p[i].x, p[i].y, s[i].x, s[i].y};
Vector2 origin = {dst.width * 0.5f, dst.height * 0.5f}; Vector2 origin = {dst.width * 0.5f, dst.height * 0.5f};
DrawTexturePro(t[i].texture, t[i].rec, dst, origin, r[i], WHITE); Rectangle src = t[i].rec;
if (t[i].flipX) src.width *= -1.0f;
if (t[i].flipY) src.height *= -1.0f;
DrawTexturePro(t[i].texture, src, dst, origin, r[i], WHITE);
} }
} }

View File

@@ -8,4 +8,38 @@
void renderEntities(ecs_iter_t *it); void renderEntities(ecs_iter_t *it);
void updateAnimations(ecs_iter_t *it); void updateAnimations(ecs_iter_t *it);
#include "../game_state.h"
#include <math.h>
#include <raymath.h>
static void updatePos(ecs_iter_t *it) {
Position *pos = ecs_field(it, Position, 1);
TextureRegion *t = ecs_field(it, TextureRegion, 2);
Vector2 target = GAME->targetPos;
if (target.x == 0 && target.y == 0) return;
for (i32 i = 0; i < it->count; i++) {
target = Vector2Subtract(target, pos[i]);
float dX = 0, dY = 0;
if (target.x > 0) dX = 1;
else if (target.x < 0) dX = -1;
if (target.y > 0) dY = 1;
else if (target.y < 0) dY = -1;
dX *= 20;
dY *= 20;
if (Vector2Length(target) < 1) continue;
pos[i].x += dX * it->delta_time;
pos[i].y += dY * it->delta_time;
f32 ddx = GAME->targetPos.x - pos[i].x;
if (ddx < 0) ddx *= -1.0f;
if (ddx > 5)
t[i].flipX = dX < 0;
}
}
#endif //PIXELDEFENSE_SYSTEMS_H #endif //PIXELDEFENSE_SYSTEMS_H

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB