+2
-1
include/keraforge.h
+2
-1
include/keraforge.h
+5
-1
include/keraforge/actor.h
+5
-1
include/keraforge/actor.h
···
4
4
#include <keraforge/_header.h>
5
5
#include <keraforge/math.h>
6
6
#include <keraforge/world.h>
7
+
#include <keraforge/math.h>
8
+
#include <keraforge/sprites.h>
7
9
#include <raylib.h>
8
10
9
11
struct kf_actor
10
12
{
13
+
struct kf_spritesheet sprites;
11
14
struct kf_vec2(f32) pos, vel, size;
12
15
f32 speed, speedmod, friction;
13
16
bool collide;
17
+
enum kf_direction pointing;
14
18
void (*tick)(struct kf_world *world, struct kf_actor *self);
15
19
void (*draw)(struct kf_world *world, struct kf_actor *self);
16
20
};
17
21
18
-
struct kf_actor *kf_actor_new(void);
22
+
struct kf_actor *kf_actor_new(struct kf_spritesheet sprites, f32 width, f32 height, bool collides);
19
23
20
24
/* Check if the actor can move in the given direction. */
21
25
int kf_actor_canmovetowards(struct kf_world *world, struct kf_actor *actor, struct kf_vec2(f32) dir);
+12
include/keraforge/math.h
+12
include/keraforge/math.h
···
51
51
_kf_mathdef(x)
52
52
#undef x
53
53
54
+
enum kf_direction
55
+
{
56
+
kf_north,
57
+
kf_east,
58
+
kf_south,
59
+
kf_west,
60
+
};
61
+
62
+
enum kf_direction kf_rotatecw(enum kf_direction dir);
63
+
enum kf_direction kf_rotateccw(enum kf_direction dir);
64
+
struct kf_vec2(f32) kf_dtov2(enum kf_direction dir);
65
+
54
66
#endif
+16
include/keraforge/sprites.h
+16
include/keraforge/sprites.h
···
1
+
#ifndef __kf_sprites__
2
+
#define __kf_sprites__
3
+
4
+
#include <keraforge/_header.h>
5
+
#include <raylib.h>
6
+
7
+
struct kf_spritesheet
8
+
{
9
+
Texture2D texture;
10
+
u16 spritewidth, spriteheight;
11
+
u32 nsprites;
12
+
};
13
+
14
+
struct kf_spritesheet kf_loadspritesheet(char *filename, int spritewidth, int spriteheight);
15
+
16
+
#endif
+15
-1
src/actor.c
+15
-1
src/actor.c
···
2
2
#include <stdlib.h>
3
3
#include <raymath.h>
4
4
5
-
struct kf_actor *kf_actor_new(void)
5
+
struct kf_actor *kf_actor_new(struct kf_spritesheet sprites, f32 width, f32 height, bool collides)
6
6
{
7
7
struct kf_actor *actor = calloc(1, sizeof(struct kf_actor));
8
+
9
+
actor->sprites = sprites;
10
+
actor->size.x = width;
11
+
actor->size.y = height;
12
+
actor->collide = collides;
13
+
14
+
actor->speed = 25;
15
+
actor->speedmod = 1;
16
+
actor->friction = 1.25f;
17
+
actor->pointing = kf_north;
18
+
8
19
return actor;
9
20
}
10
21
···
66
77
if (delta.y && !kf_actor_canmovetowards(world, self, kf_vec2_y(f32)(delta)))
67
78
delta.y = 0;
68
79
}
80
+
81
+
if (delta.y > 0)
82
+
self->pointing = kf_north;
69
83
70
84
self->pos = kf_add_vec2(f32)(self->pos, delta);
71
85
+13
-19
src/main.c
+13
-19
src/main.c
···
1
1
#include "keraforge/input.h"
2
+
#include "keraforge/sprites.h"
2
3
#include "keraforge/ui.h"
3
4
#include <raylib.h>
4
5
#include <raymath.h>
···
11
12
static struct kf_vec2(u32) select = { 0, 0 };
12
13
static int selected_tile = 0;
13
14
14
-
static struct
15
-
{
16
-
enum { menu_none, menu_palette, menu_escape } menu;
15
+
enum {
16
+
menu_none,
17
+
menu_palette,
18
+
menu_escape
17
19
} menu;
18
20
19
21
static kf_inputbind_t
···
69
71
70
72
static void _player_tick(struct kf_world *world, struct kf_actor *self)
71
73
{
72
-
if (menu.menu == menu_none)
74
+
if (menu == menu_none)
73
75
_player_tick_move(self);
74
76
75
77
kf_actor_move(world, self, dt);
···
144
146
exit(1);
145
147
}
146
148
147
-
struct kf_actor *player = kf_actor_new();
149
+
struct kf_actor *player = kf_actor_new(kf_loadspritesheet("data/res/player.png", 16, 16), 6, 6, true);
148
150
player->pos.x = world->width / 4.0f * KF_TILE_SIZE_PX;
149
151
player->pos.y = world->height / 4.0f * KF_TILE_SIZE_PX;
150
-
player->vel.x = 0;
151
-
player->vel.y = 0;
152
-
player->size.x = 6;
153
-
player->size.y = 6;
154
-
player->speed = 25;
155
-
player->speedmod = 1;
156
-
player->friction = 1.25f;
157
-
player->collide = true;
158
152
player->tick = _player_tick;
159
153
player->draw = _player_draw;
160
154
···
175
169
select.y = v.y / KF_TILE_SIZE_PX;
176
170
177
171
if (kf_checkinputpress(inputbind_palette))
178
-
menu.menu = menu_palette;
179
-
else if (IsKeyPressed(KEY_ESCAPE) && menu.menu == menu_none)
180
-
menu.menu = menu_escape;
172
+
menu = menu_palette;
173
+
else if (IsKeyPressed(KEY_ESCAPE) && menu == menu_none)
174
+
menu = menu_escape;
181
175
182
176
BeginDrawing();
183
177
ClearBackground(WHITE);
···
196
190
player->draw(world, player);
197
191
EndMode2D();
198
192
199
-
switch (menu.menu)
193
+
switch (menu)
200
194
{
201
195
case menu_none:
202
196
break;
203
197
case menu_palette:
204
198
if (kf_ui_choice("Select tile", &kf_tiles.key[0], kf_tiles.count, &selected_tile))
205
-
menu.menu = menu_none;
199
+
menu = menu_none;
206
200
break;
207
201
case menu_escape:
208
202
{
209
203
static int result = 0;
210
204
if (kf_ui_yesno("Exit game?", &result))
211
205
{
212
-
menu.menu = menu_none;
206
+
menu = menu_none;
213
207
if (result == 0)
214
208
running = 0;
215
209
result = 0;
+31
src/math.c
+31
src/math.c
···
1
+
#include "keraforge/math.h"
1
2
#include <keraforge.h>
2
3
#include <raylib.h>
3
4
#include <raymath.h>
···
24
25
struct kf_vec2(T) kf_vec2##T##_y(struct kf_vec2(T) a) { return (struct kf_vec2(T)){0, a.y}; }
25
26
_kf_mathdef(x)
26
27
#undef x
28
+
29
+
static int _kf_isdir(enum kf_direction dir)
30
+
{
31
+
return dir >= kf_north && dir <= kf_west;
32
+
}
33
+
34
+
enum kf_direction kf_rotatecw(enum kf_direction dir)
35
+
{
36
+
return _kf_isdir(dir+1) ? kf_north : dir+1;
37
+
}
38
+
39
+
enum kf_direction kf_rotateccw(enum kf_direction dir)
40
+
{
41
+
return _kf_isdir(dir-1) ? kf_west : dir-1;
42
+
}
43
+
44
+
struct kf_vec2(f32) kf_dtov2f(enum kf_direction dir)
45
+
{
46
+
switch (dir) {
47
+
case kf_north:
48
+
return (struct kf_vec2(f32)){ -1, 0 };
49
+
case kf_east:
50
+
return (struct kf_vec2(f32)){ 0, 1 };
51
+
case kf_south:
52
+
return (struct kf_vec2(f32)){ 1, 0 };
53
+
case kf_west:
54
+
return (struct kf_vec2(f32)){ 0, -1 };
55
+
}
56
+
return (struct kf_vec2(f32)){ 0, 0 };
57
+
}
+12
src/sprites.c
+12
src/sprites.c
···
1
+
#include <keraforge.h>
2
+
3
+
struct kf_spritesheet kf_loadspritesheet(char *filename, int spritewidth, int spriteheight)
4
+
{
5
+
Texture2D tex = LoadTexture(filename);
6
+
return (struct kf_spritesheet){
7
+
.texture = tex,
8
+
.spritewidth = spritewidth,
9
+
.spriteheight = spriteheight,
10
+
.nsprites = (tex.width / spritewidth) * (tex.height / spriteheight),
11
+
};
12
+
}