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

spritesheet loader; unused for now

Changed files
+106 -22
include
src
+2 -1
include/keraforge.h
··· 5 5 #include <keraforge/actor.h> 6 6 #include <keraforge/fs.h> 7 7 #include <keraforge/input.h> 8 + #include <keraforge/math.h> 9 + #include <keraforge/sprites.h> 8 10 #include <keraforge/ui.h> 9 - #include <keraforge/math.h> 10 11 #include <keraforge/world.h> 11 12 12 13 #endif
+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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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 + }