+14
-10
include/keraforge/actor.h
+14
-10
include/keraforge/actor.h
···
20
20
struct kf_actorregistry
21
21
{
22
22
int count;
23
-
char *id[KF_MAX_ACTOR_TYPES];
23
+
char *key[KF_MAX_ACTOR_TYPES];
24
+
/* Save the actor to a binary stream. */
24
25
void (*serialize[KF_MAX_ACTOR_TYPES])(struct kf_actor *self, struct bini_stream *bs);
26
+
/* Load the actor from a binary stream. */
25
27
void (*deserialize[KF_MAX_ACTOR_TYPES])(struct kf_actor *self, struct bini_stream *bs);
28
+
/* Called every frame to update the actor. Don't forget about deltatime (kf_dts, kf_dtms)! */
29
+
void (*tick[KF_MAX_ACTOR_TYPES])(struct kf_actor *self);
30
+
/* Called every frame to render the actor. */
31
+
void (*draw[KF_MAX_ACTOR_TYPES])(struct kf_actor *self);
32
+
/* Spritesheet for the actor. */
33
+
struct kf_spritesheet sprite[KF_MAX_ACTOR_TYPES];
26
34
};
27
35
/* Global actor registry instance. */
28
36
extern struct kf_actorregistry kf_actorregistry;
···
31
39
struct kf_actor
32
40
{
33
41
/* Unique string identifier for this actor. */
34
-
char *id;
35
-
/* Spritesheet for the actor. */
36
-
struct kf_spritesheet sprites;
42
+
char *key;
43
+
/* Unique integer identifier for this actor, comes from kf_actorregistry. */
44
+
int id;
37
45
/* The actor's position. */
38
46
struct kf_vec2(f32) pos;
39
47
/* The actor's velocity. */
···
56
64
enum kf_direction pointing;
57
65
/* If the actor is running. This will not increase their speed, you are expected to yourself. */
58
66
bool running;
59
-
/* Called every frame to update the actor. Don't forget about deltatime (kf_dts, kf_dtms)! */
60
-
void (*tick)(struct kf_actor *self);
61
-
/* Called every frame to render the actor. */
62
-
void (*draw)(struct kf_actor *self);
63
67
/* Doubly-linked list of actors. */
64
68
struct kf_actor *prev, *next;
65
69
};
···
69
73
70
74
71
75
/* Create a new actor. */
72
-
struct kf_actor *kf_actor_new(char *id, struct kf_spritesheet sprites, f32 width, f32 height, bool collides);
76
+
struct kf_actor *kf_actor_new(char *key);
73
77
74
78
/* Load a spritesheet, filling in the details for loading character spritesheets. */
75
79
struct kf_spritesheet kf_actor_loadspritesheet(char *filename);
···
85
89
86
90
/* Get the registry ID of a given actor ID.
87
91
This will perform a lot of string comparisons, use sparingly! */
88
-
int kf_actor_getregistryid(char *id);
92
+
int kf_actor_getregistryid(char *key);
89
93
90
94
/* Save actor data. */
91
95
int kf_saveactors(void);
+2
-2
include/keraforge/player.h
+2
-2
include/keraforge/player.h
···
9
9
void kf_player_tick(struct kf_actor *self);
10
10
void kf_player_draw(struct kf_actor *self);
11
11
12
-
u8* kf_player_serialize(struct kf_actor *self, size_t *plen);
13
-
void kf_player_deserialize(struct kf_actor *self, u8 *data, size_t len);
12
+
void kf_player_serialize(struct kf_actor *self, struct bini_stream *bs);
13
+
void kf_player_deserialize(struct kf_actor *self, struct bini_stream *bs);
14
14
15
15
#endif
+16
-16
src/actor.c
+16
-16
src/actor.c
···
1
-
#include "keraforge/bini.h"
1
+
#include "keraforge/actor.h"
2
2
#include <keraforge.h>
3
3
#include <stdlib.h>
4
4
#include <raymath.h>
···
10
10
u32 kf_actor_count = 0;
11
11
12
12
13
-
struct kf_actor *kf_actor_new(char *id, struct kf_spritesheet sprites, f32 width, f32 height, bool collides)
13
+
struct kf_actor *kf_actor_new(char *key)
14
14
{
15
15
struct kf_actor *actor = calloc(1, sizeof(struct kf_actor));
16
16
kf_actor_count++;
···
26
26
kf_actors_last = actor;
27
27
}
28
28
29
-
actor->id = id;
30
-
actor->sprites = sprites;
31
-
actor->size.x = width;
32
-
actor->size.y = height;
33
-
actor->collide = collides;
29
+
actor->id = kf_actor_getregistryid(key);
30
+
actor->key = key;
31
+
actor->size.x = 10;
32
+
actor->size.y = 10;
33
+
actor->collide = true;
34
34
35
35
actor->speed = 25;
36
36
actor->speedmod = 1;
···
174
174
175
175
x += (int)(kf_s * (frames+1)) % frames;
176
176
177
-
kf_drawsprite(&actor->sprites, actor->pos.x, actor->pos.y, x, y);
177
+
kf_drawsprite(&kf_actorregistry.sprite[actor->id], actor->pos.x, actor->pos.y, x, y);
178
178
}
179
179
180
-
int kf_actor_getregistryid(char *id)
180
+
int kf_actor_getregistryid(char *key)
181
181
{
182
-
size_t l = strlen(id);
182
+
size_t l = strlen(key);
183
183
for (int i = 0 ; i < kf_actorregistry.count ; i++)
184
184
{
185
-
char *c = kf_actorregistry.id[i];
185
+
char *c = kf_actorregistry.key[i];
186
186
size_t cl = strlen(c);
187
-
if (strncmp(c, id, l>cl?l:cl) == 0)
187
+
if (strncmp(c, key, l>cl?l:cl) == 0)
188
188
{
189
189
return i;
190
190
}
···
209
209
210
210
for (struct kf_actor *actor = kf_actors ; actor != NULL ; actor = actor->next)
211
211
{
212
-
if (!actor->id)
212
+
if (!actor->key)
213
213
continue;
214
-
int id = kf_actor_getregistryid(actor->id);
214
+
int id = kf_actor_getregistryid(actor->key);
215
215
if (id == -1)
216
216
continue;
217
-
bini_wstr(bs, actor->id);
217
+
bini_wstr(bs, actor->key);
218
218
kf_actorregistry.serialize[id](actor, bs);
219
219
nactors++;
220
220
}
···
259
259
int id = kf_actor_getregistryid(key);
260
260
if (id == -1)
261
261
continue;
262
+
struct kf_actor *actor = kf_actor_new(key, k, f32 width, f32 height, bool collides)
262
263
kf_actorregistry.deserialize[id](actor, &bs);
263
-
nactors++;
264
264
}
265
265
266
266
kf_logdbg("loaded %d actors", nactors);
+7
-15
src/player.c
+7
-15
src/player.c
···
1
+
#include "keraforge/bini.h"
1
2
#include <keraforge.h>
2
3
3
4
···
81
82
}
82
83
}
83
84
84
-
85
-
struct _kf_serialized_player
85
+
void kf_player_serialize(struct kf_actor *self, struct bini_stream *bs)
86
86
{
87
-
struct kf_vec2(f32) pos;
88
-
};
89
-
90
-
u8* kf_player_serialize(struct kf_actor *self, size_t *plen)
91
-
{
92
-
*plen = sizeof(struct _kf_serialized_player);
93
-
struct _kf_serialized_player *s = malloc(*plen);
94
-
s->pos = self->pos;
95
-
return (u8 *)s;
87
+
bini_wf(bs, self->pos.x);
88
+
bini_wf(bs, self->pos.y);
96
89
}
97
90
98
-
void kf_player_deserialize(struct kf_actor *self, u8 *data, size_t len)
91
+
void kf_player_deserialize(struct kf_actor *self, struct bini_stream *bs)
99
92
{
100
-
(void)len;
101
-
struct _kf_serialized_player *s = (struct _kf_serialized_player *)data;
102
-
self->pos = s->pos;
93
+
self->pos.x = bini_rf(bs);
94
+
self->pos.y = bini_rf(bs);
103
95
}