diff options
| author | esquizo <esquizo+noreply@esquizo.net> | 2026-05-02 11:48:02 -0300 |
|---|---|---|
| committer | esquizo <esquizo+noreply@esquizo.net> | 2026-05-02 11:48:02 -0300 |
| commit | b2a58e06b885c5801814943669d383f0141ddabb (patch) | |
| tree | 03a1dd27f3e3ef567a95af6fc005580162cdadbd | |
| parent | 865764b50eb97bf43f5b37fc212b79aceb809ffe (diff) | |
organizada updates das entidades
| -rw-r--r-- | dat.h | 2 | ||||
| -rw-r--r-- | sdl3_main.c | 174 |
2 files changed, 98 insertions, 78 deletions
@@ -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; +} |
