A game engine for top-down 2D RPG games.
rpg game-engine raylib c99

actor progress

Changed files
+61 -41
include
keraforge
src
+2
include/keraforge/actor.h
··· 74 74 75 75 /* Create a new actor. */ 76 76 struct kf_actor *kf_actor_new(char *key); 77 + /* Register a new actor and return its integer ID. */ 78 + int kf_actor_register(char *key); 77 79 78 80 /* Load a spritesheet, filling in the details for loading character spritesheets. */ 79 81 struct kf_spritesheet kf_actor_loadspritesheet(char *filename);
+36 -29
src/actor.c
··· 40 40 return actor; 41 41 } 42 42 43 + int kf_actor_register(char *key) 44 + { 45 + int id = kf_actorregistry.count++; 46 + kf_actorregistry.key[id] = key; 47 + return id; 48 + } 49 + 43 50 struct kf_spritesheet kf_actor_loadspritesheet(char *filename) 44 51 { 45 52 return kf_loadspritesheet(filename, 20, 20); ··· 234 241 return 1; 235 242 } 236 243 237 - int kf_loadactors(void) 238 - { 239 - // char *infile = compress ? _KF_ACTORFILE_TMP : _KF_ACTORFILE; 240 - char *infile = _KF_ACTORFILE; 244 + // int kf_loadactors(void) 245 + // { 246 + // // char *infile = compress ? _KF_ACTORFILE_TMP : _KF_ACTORFILE; 247 + // char *infile = _KF_ACTORFILE; 241 248 242 - size_t len = 0; 243 - struct bini_stream bs = { 244 - .mode = BINI_STREAM, 245 - .buffer = kf_readbin(infile, &len), 246 - }; 247 - if (!bs.buffer) 248 - KF_THROW("failed to read/open %s", infile); 249 - bs.cap = len; 250 - bs.len = len; 251 - kf_logdbg("loaded actors into binary stream: len=%lu", len); 249 + // size_t len = 0; 250 + // struct bini_stream bs = { 251 + // .mode = BINI_STREAM, 252 + // .buffer = kf_readbin(infile, &len), 253 + // }; 254 + // if (!bs.buffer) 255 + // KF_THROW("failed to read/open %s", infile); 256 + // bs.cap = len; 257 + // bs.len = len; 258 + // kf_logdbg("loaded actors into binary stream: len=%lu", len); 252 259 253 - const size_t nactors = bini_rlu(&bs); 260 + // const size_t nactors = bini_rlu(&bs); 254 261 255 - for (size_t i = 0 ; i < nactors ; i++) 256 - { 257 - char key[4096] = {0}; 258 - bini_rstr(&bs, key); 259 - int id = kf_actor_getregistryid(key); 260 - if (id == -1) 261 - continue; 262 - struct kf_actor *actor = kf_actor_new(key, k, f32 width, f32 height, bool collides) 263 - kf_actorregistry.deserialize[id](actor, &bs); 264 - } 262 + // for (size_t i = 0 ; i < nactors ; i++) 263 + // { 264 + // char key[4096] = {0}; 265 + // bini_rstr(&bs, key); 266 + // int id = kf_actor_getregistryid(key); 267 + // if (id == -1) 268 + // continue; 269 + // struct kf_actor *actor = kf_actor_new(key, k, f32 width, f32 height, bool collides) 270 + // kf_actorregistry.deserialize[id](actor, &bs); 271 + // } 265 272 266 - kf_logdbg("loaded %d actors", nactors); 273 + // kf_logdbg("loaded %d actors", nactors); 267 274 268 - free(bs.buffer); 275 + // free(bs.buffer); 269 276 270 - return 1; 271 - } 277 + // return 1; 278 + // }
+23 -12
src/graphics.c
··· 50 50 kf_timeit("load world", kf_world_load(&world, true, NULL)); 51 51 kf_window.room = world; 52 52 53 - kf_actorregistry.id[0] = "player"; 54 - kf_actorregistry.serialize[0] = kf_player_serialize; 55 - kf_actorregistry.deserialize[0] = kf_player_deserialize; 56 - kf_actorregistry.count++; 53 + int idplayer = kf_actor_register("player"); 54 + kf_actorregistry.serialize[idplayer] = kf_player_serialize; 55 + kf_actorregistry.deserialize[idplayer] = kf_player_deserialize; 56 + kf_actorregistry.sprite[idplayer] = kf_actor_loadspritesheet("data/res/img/char/template.png"); 57 + kf_actorregistry.tick[idplayer] = kf_player_tick; 58 + kf_actorregistry.draw[idplayer] = kf_player_draw; 57 59 58 - struct kf_actor *player = kf_actor_new("player", kf_actor_loadspritesheet("data/res/img/char/template.png"), 10, 10, true); 60 + struct kf_actor *player = kf_actor_new("player"); 61 + player->size.x = 10; 62 + player->size.y = 10; 63 + player->collide = true; 59 64 player->sizeoffset.y = 6; 60 - player->tick = kf_player_tick; 61 - player->draw = kf_player_draw; 62 65 player->controlled = true; 63 66 if (is_new_state) /* place the player in the centre of the room */ 64 67 { ··· 69 72 player->pos.y = state->player.pos.y; 70 73 kf_window.player = player; 71 74 72 - struct kf_actor *player2 = kf_actor_new("player", kf_actor_loadspritesheet("data/res/img/char/whom.png"), 10, 10, true); 75 + int idplayer2 = kf_actor_register("player2"); 76 + kf_actorregistry.serialize[idplayer2] = kf_player_serialize; 77 + kf_actorregistry.deserialize[idplayer2] = kf_player_deserialize; 78 + kf_actorregistry.sprite[idplayer2] = kf_actor_loadspritesheet("data/res/img/char/whom.png"); 79 + kf_actorregistry.tick[idplayer2] = kf_player_tick; 80 + kf_actorregistry.draw[idplayer2] = kf_player_draw; 81 + 82 + struct kf_actor *player2 = kf_actor_new("player2"); 83 + player2->size.x = 10; 84 + player2->size.y = 10; 85 + player2->collide = false; 73 86 player2->sizeoffset.y = 6; 74 - player2->tick = kf_player_tick; /* when controlled is false, player_tick won't process keybinds */ 75 - player2->draw = kf_player_draw; 76 87 player2->pos.x = player->pos.x; 77 88 player2->pos.y = player->pos.y - 24; 78 89 ··· 181 192 { 182 193 // kf_window.player->tick(kf_window.player); 183 194 for (struct kf_actor *actor = kf_actors ; actor != NULL ; actor = actor->next) 184 - actor->tick(actor); 195 + kf_actorregistry.tick[actor->id](actor); 185 196 186 197 Vector2 v = GetScreenToWorld2D(GetMousePosition(), kf_window.cam); 187 198 kf_window.select.x = v.x / KF_TILE_SIZE_PX; ··· 213 224 // kf_world_drawcolliders(world, player, cam); 214 225 // kf_window.player->draw(kf_window.player); 215 226 for (struct kf_actor *actor = kf_actors ; actor != NULL ; actor = actor->next) 216 - actor->draw(actor); 227 + kf_actorregistry.draw[actor->id](actor); 217 228 } 218 229 219 230 static