From b2a58e06b885c5801814943669d383f0141ddabb Mon Sep 17 00:00:00 2001 From: esquizo Date: Sat, 2 May 2026 11:48:02 -0300 Subject: organizada updates das entidades --- dat.h | 2 + sdl3_main.c | 174 +++++++++++++++++++++++++++++++++--------------------------- 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; +} -- cgit v1.2.3