summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoresquizo <esquizo+noreply@esquizo.net>2026-05-02 11:48:02 -0300
committeresquizo <esquizo+noreply@esquizo.net>2026-05-02 11:48:02 -0300
commitb2a58e06b885c5801814943669d383f0141ddabb (patch)
tree03a1dd27f3e3ef567a95af6fc005580162cdadbd
parent865764b50eb97bf43f5b37fc212b79aceb809ffe (diff)
organizada updates das entidades
-rw-r--r--dat.h2
-rw-r--r--sdl3_main.c174
2 files changed, 98 insertions, 78 deletions
diff --git a/dat.h b/dat.h
index 18c8964..b3abc1b 100644
--- a/dat.h
+++ b/dat.h
@@ -13,6 +13,7 @@ typedef struct {
EPLAYER,
EGHOST,
EBULLET,
+ LASTEntity,
} type;
bool active;
@@ -26,6 +27,7 @@ typedef struct {
} EntityCollision;
typedef void (EntityCollisionProc)(Entity *self, Entity *other);
+typedef void (EntityUpdateProc)(Entity *self, float delta);
void entphysics(float delta);
diff --git a/sdl3_main.c b/sdl3_main.c
index b5455ce..ffd086f 100644
--- a/sdl3_main.c
+++ b/sdl3_main.c
@@ -8,6 +8,8 @@
#include "dat.h"
+#define SPEED 100
+
static void render(void);
static void update(float delta);
static void process_events(void);
@@ -17,10 +19,18 @@ static void freeentity(Entity *);
static EntityCollisionProc bulletcollproc;
-static EntityCollisionProc *collisionProcs[] = {
+static EntityUpdateProc playerproc;
+static EntityUpdateProc ghostproc;
+
+static EntityCollisionProc *collisionProcs[LASTEntity] = {
[EBULLET] = bulletcollproc,
};
+static EntityUpdateProc *updateprocs[LASTEntity] = {
+ [EPLAYER] = playerproc,
+ [EGHOST] = ghostproc,
+};
+
static SDL_Window *window;
static SDL_Renderer *renderer;
static bool running;
@@ -168,7 +178,6 @@ render(void)
void
update(float delta)
{
-# define SPEED 100
const _Bool *kstate = SDL_GetKeyboardState(NULL);
Entity *bullet, *other;
EntityCollision *coll;
@@ -192,82 +201,8 @@ update(float delta)
if(!e->active)
continue;
- switch(e->type) {
- case EPLAYER:
- e->body.vel[0] = 0;
- e->body.vel[1] = 0;
-
- if(kstate[SDL_SCANCODE_W])
- e->body.vel[1] -= SPEED;
- if(kstate[SDL_SCANCODE_A])
- e->body.vel[0] -= SPEED;
- if(kstate[SDL_SCANCODE_S])
- e->body.vel[1] += SPEED;
- if(kstate[SDL_SCANCODE_D])
- e->body.vel[0] += SPEED;
-
- if(shot) {
- shot = false;
- int i;
-
- float dx = shotx - e->body.pos[0];
- float dy = shoty - e->body.pos[1];
- float dd = sqrtf(dx * dx + dy * dy);
-
- dx /= dd;
- dy /= dd;
-
- bullet = allocentity();
- bullet->type = EBULLET;
- bullet->time = 0.5;
- bullet->body.vel[0] = dx * SPEED * 5.0;
- bullet->body.vel[1] = dy * SPEED * 5.0;
- bullet->body.pos[0] = e->body.pos[0];
- bullet->body.pos[1] = e->body.pos[1];
- bullet->body.size[0] = BULLET_SIZE;
- bullet->body.size[1] = BULLET_SIZE;
- bullet->active = true;
- }
- break;
-
- case EGHOST:
- vx = 0;
- vy = 0;
-
- float dx = player->body.pos[0] - e->body.pos[0];
- float dy = player->body.pos[1] - e->body.pos[1];
- float dd = sqrtf(dx * dx + dy * dy);
-
- dx /= dd;
- dy /= dd;
-
- vx += dx * SPEED;
- vy += dy * SPEED;
-
- for(int j = 0; j < 1024; j++) {
- other = entitybuffer + j;
- if(!other->active || other == e || other->type != EGHOST)
- continue;
-
- float dx = other->body.pos[0] - e->body.pos[0];
- float dy = other->body.pos[1] - e->body.pos[1];
- float dd = sqrtf(dx * dx + dy * dy);
-
- dx /= dd;
- dy /= dd;
-
- if(dd < 40) {
- vx -= dx * 100;
- vy -= dy * 100;
- }
- }
-
- e->body.vel[0] = vx;
- e->body.vel[1] = vy;
- break;
- case EBULLET:
- break;
- }
+ if(updateprocs[e->type])
+ updateprocs[e->type](e, delta);
}
}
@@ -327,3 +262,86 @@ bulletcollproc(Entity *self, Entity *target)
target->active = false;
}
}
+
+void
+playerproc(Entity *e, float delta)
+{
+ Entity *bullet;
+ const _Bool *kstate = SDL_GetKeyboardState(NULL);
+
+ e->body.vel[0] = 0;
+ e->body.vel[1] = 0;
+
+ if(kstate[SDL_SCANCODE_W])
+ e->body.vel[1] -= SPEED;
+ if(kstate[SDL_SCANCODE_A])
+ e->body.vel[0] -= SPEED;
+ if(kstate[SDL_SCANCODE_S])
+ e->body.vel[1] += SPEED;
+ if(kstate[SDL_SCANCODE_D])
+ e->body.vel[0] += SPEED;
+
+ if(shot) {
+ shot = false;
+ int i;
+
+ float dx = shotx - e->body.pos[0];
+ float dy = shoty - e->body.pos[1];
+ float dd = sqrtf(dx * dx + dy * dy);
+
+ dx /= dd;
+ dy /= dd;
+
+ bullet = allocentity();
+ bullet->type = EBULLET;
+ bullet->time = 0.5;
+ bullet->body.vel[0] = dx * SPEED * 5.0;
+ bullet->body.vel[1] = dy * SPEED * 5.0;
+ bullet->body.pos[0] = e->body.pos[0];
+ bullet->body.pos[1] = e->body.pos[1];
+ bullet->body.size[0] = BULLET_SIZE;
+ bullet->body.size[1] = BULLET_SIZE;
+ bullet->active = true;
+ }
+}
+
+void
+ghostproc(Entity *e, float delta)
+{
+ Entity *other;
+ float vx, vy;
+
+ vx = 0;
+ vy = 0;
+
+ float dx = player->body.pos[0] - e->body.pos[0];
+ float dy = player->body.pos[1] - e->body.pos[1];
+ float dd = sqrtf(dx * dx + dy * dy);
+
+ dx /= dd;
+ dy /= dd;
+
+ vx += dx * SPEED;
+ vy += dy * SPEED;
+
+ for(int j = 0; j < 1024; j++) {
+ other = entitybuffer + j;
+ if(!other->active || other == e || other->type != EGHOST)
+ continue;
+
+ float dx = other->body.pos[0] - e->body.pos[0];
+ float dy = other->body.pos[1] - e->body.pos[1];
+ float dd = sqrtf(dx * dx + dy * dy);
+
+ dx /= dd;
+ dy /= dd;
+
+ if(dd < 40) {
+ vx -= dx * 100;
+ vy -= dy * 100;
+ }
+ }
+
+ e->body.vel[0] = vx;
+ e->body.vel[1] = vy;
+}