+2
include/keraforge/actor.h
+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
+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
+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