Lt *lt;
Game_state state;
- Sprite_font *font;
+ Sprite_font font;
LevelPicker *level_picker;
LevelEditor *level_editor;
Credits *credits;
}
game->lt = lt;
- game->font = PUSH_LT(
- lt,
- create_sprite_font_from_file(
- "./assets/images/charmap-oldschool.bmp",
- renderer),
- destroy_sprite_font);
- if (game->font == NULL) {
- RETURN_LT(lt, NULL);
- }
+ game->font.texture = load_bmp_font_texture(
+ renderer,
+ "./assets/images/charmap-oldschool.bmp");
game->level_picker = PUSH_LT(
lt,
- create_level_picker(
- game->font,
- level_folder),
+ create_level_picker(level_folder),
destroy_level_picker);
if (game->level_picker == NULL) {
RETURN_LT(lt, NULL);
}
Camera create_camera(SDL_Renderer *renderer,
- Sprite_font *font)
+ Sprite_font font)
{
trace_assert(renderer);
- trace_assert(font);
Camera camera = {
.scale = 1.0f,
const Vec2f screen_position = camera_point(camera, position);
if (sprite_font_render_text(
- camera->font,
+ &camera->font,
camera->renderer,
screen_position,
vec(size.x * scale.x * camera->scale, size.y * scale.y * camera->scale),
trace_assert(text);
return sprite_font_render_text(
- camera->font,
+ &camera->font,
camera->renderer,
position,
size,
return 0;
}
-const Sprite_font *camera_font(const Camera *camera)
-{
- return camera->font;
-}
-
int camera_draw_line(const Camera *camera,
Vec2f begin, Vec2f end,
Color color)
Vec2f position;
float scale;
SDL_Renderer *renderer;
- Sprite_font *font;
+ Sprite_font font;
} Camera;
Camera create_camera(SDL_Renderer *renderer,
- Sprite_font *font);
+ Sprite_font font);
int camera_clear_background(const Camera *camera,
Color color);
Rect rect,
Color color);
-const Sprite_font *camera_font(const Camera *camera);
-
#endif // CAMERA_H_
ListSelector *list_selector;
};
-LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dirpath)
+LevelPicker *create_level_picker(const char *dirpath)
{
trace_assert(dirpath);
level_picker->list_selector = PUSH_LT(
lt,
create_list_selector(
- sprite_font,
level_folder_titles(level_picker->level_folder),
level_folder_count(level_picker->level_folder),
vec(5.0f, 5.0f),
return -1;
}
- if (list_selector_render(level_picker->list_selector, camera->renderer) < 0) {
+ if (list_selector_render(camera, level_picker->list_selector) < 0) {
return -1;
}
#include <SDL.h>
#include "game/camera.h"
+#include "game/sprite_font.h"
typedef struct LevelPicker LevelPicker;
-typedef struct Sprite_font Sprite_font;
-LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dirpath);
+LevelPicker *create_level_picker(const char *dirpath);
void destroy_level_picker(LevelPicker *level_picker);
int level_picker_render(const LevelPicker *level_picker,
struct Sprite_font
{
- Lt *lt;
SDL_Texture *texture;
};
-Sprite_font *create_sprite_font_from_file(const char *bmp_file_path,
- SDL_Renderer *renderer)
+static inline
+void *scp(void *ptr)
{
- trace_assert(bmp_file_path);
- trace_assert(renderer);
-
- Lt *lt = create_lt();
-
- Sprite_font * const sprite_font = PUSH_LT(lt, nth_calloc(1, sizeof(Sprite_font)), free);
- if (sprite_font == NULL) {
- RETURN_LT(lt, NULL);
+ if (ptr == NULL) {
+ log_fail("SDL error: %s\n", SDL_GetError());
+ trace_assert(0 && "SDL error");
}
- SDL_Surface * const surface = PUSH_LT(lt, SDL_LoadBMP(bmp_file_path), SDL_FreeSurface);
- if (surface == NULL) {
- log_fail("Could not load %s: %s\n", bmp_file_path, SDL_GetError());
- RETURN_LT(lt, NULL);
- }
+ return ptr;
+}
- if (SDL_SetColorKey(surface,
- SDL_TRUE,
- SDL_MapRGB(surface->format,
- 0, 0, 0)) < 0) {
- log_fail("SDL_SetColorKey: %s\n", SDL_GetError());
- RETURN_LT(lt, NULL);
+static inline
+int scc(int code)
+{
+ if (code < 0) {
+ log_fail("SDL error: %s\n", SDL_GetError());
+ trace_assert(0 && "SDL error");
}
- sprite_font->texture = PUSH_LT(
- lt,
- SDL_CreateTextureFromSurface(renderer, surface),
- SDL_DestroyTexture);
- if (sprite_font->texture == NULL) {
- log_fail("SDL_CreateTextureFromSurface: %s\n", SDL_GetError());
- RETURN_LT(lt, NULL);
- }
+ return code;
+}
+
+SDL_Texture *load_bmp_font_texture(SDL_Renderer *renderer,
+ const char *bmp_file_path)
+{
+ trace_assert(renderer);
+ trace_assert(bmp_file_path);
- SDL_FreeSurface(RELEASE_LT(lt, surface));
+ SDL_Surface *surface = scp(SDL_LoadBMP(bmp_file_path));
+ scc(SDL_SetColorKey(
+ surface,
+ SDL_TRUE,
+ SDL_MapRGB(surface->format,
+ 0, 0, 0)));
- sprite_font->lt = lt;
+ SDL_Texture *result =
+ scp(SDL_CreateTextureFromSurface(renderer, surface));
- return sprite_font;
-}
+ SDL_FreeSurface(surface);
-void destroy_sprite_font(Sprite_font *sprite_font)
-{
- trace_assert(sprite_font);
- RETURN_LT0(sprite_font->lt);
+ return result;
}
static SDL_Rect sprite_font_char_rect(const Sprite_font *sprite_font, char x)
#define FONT_CHAR_WIDTH 7
#define FONT_CHAR_HEIGHT 9
-typedef struct Sprite_font Sprite_font;
+typedef struct {
+ SDL_Texture *texture;
+} Sprite_font;
-Sprite_font *create_sprite_font_from_file(const char *bmp_file_path,
- SDL_Renderer *renderer);
-void destroy_sprite_font(Sprite_font *sprite_font);
+SDL_Texture *load_bmp_font_texture(SDL_Renderer *renderer,
+ const char *bmp_file_path);
int sprite_font_render_text(const Sprite_font *sprite_font,
SDL_Renderer *renderer,
#define CONSOLE_H_
#include <SDL.h>
+#include "game/sprite_font.h"
typedef struct Console Console;
-typedef struct Sprite_font Sprite_font;
typedef struct Game Game;
Console *create_console(Game *game);
struct ListSelector
{
Lt *lt;
- const Sprite_font *sprite_font;
const char **items;
size_t count;
size_t cursor;
float padding_bottom;
};
-ListSelector *create_list_selector(const Sprite_font *sprite_font,
- const char *items[],
+ListSelector *create_list_selector(const char *items[],
size_t count,
Vec2f font_scale,
float padding_bottom)
}
list_selector->lt = lt;
- list_selector->sprite_font = sprite_font;
list_selector->items = items;
list_selector->count = count;
list_selector->cursor = 0;
RETURN_LT0(list_selector->lt);
}
-int list_selector_render(const ListSelector *list_selector,
- SDL_Renderer *renderer)
+int list_selector_render(const Camera *camera,
+ const ListSelector *list_selector)
{
+ trace_assert(camera);
trace_assert(list_selector);
- trace_assert(renderer);
for (size_t i = 0; i < list_selector->count; ++i) {
const Vec2f current_position = vec_sum(
vec(0.0f, (float) i * ((float) FONT_CHAR_HEIGHT * list_selector->font_scale.y + list_selector->padding_bottom)));
if (sprite_font_render_text(
- list_selector->sprite_font,
- renderer,
+ &camera->font,
+ camera->renderer,
current_position,
list_selector->font_scale,
rgba(1.0f, 1.0f, 1.0f, 1.0f),
current_position,
list_selector->font_scale,
strlen(list_selector->items[i])));
- if (SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255) < 0) {
+ if (SDL_SetRenderDrawColor(camera->renderer, 255, 255, 255, 255) < 0) {
return -1;
}
- if (SDL_RenderDrawRect(renderer, &boundary_box) < 0) {
+ if (SDL_RenderDrawRect(camera->renderer, &boundary_box) < 0) {
return -1;
}
}
#ifndef LIST_SELECTOR_H_
#define LIST_SELECTOR_H_
+#include "game/camera.h"
+
typedef struct ListSelector ListSelector;
-ListSelector *create_list_selector(const Sprite_font *sprite_font,
- const char *items[],
+ListSelector *create_list_selector(const char *items[],
size_t count,
Vec2f font_scale,
float padding_bottom);
void destroy_list_selector(ListSelector *list_selector);
-int list_selector_render(const ListSelector *list_selector,
- SDL_Renderer *renderer);
-Vec2f list_selector_size(const ListSelector *list_selector, Vec2f font_scale, float padding_bottom);
+int list_selector_render(const Camera *camera,
+ const ListSelector *list_selector);
+Vec2f list_selector_size(const ListSelector *list_selector,
+ Vec2f font_scale,
+ float padding_bottom);
int list_selector_update(ListSelector *list_selector, float delta_time);
int list_selector_event(ListSelector *list_selector, const SDL_Event *event);