#include #include #include #include #define QOI_IMPLEMENTATION #include "third/qoi.h" #define SCREEN_WIDTH 256 #define SCREEN_HEIGHT 256 #define TILE_SIZE 16 struct ty_image img; struct ty_font font; void tick(void) { double start = ty_get_time(); ty_draw_clear(TY_COLOR_BLACK); ty_draw_image( img, ty_vec2i( SCREEN_WIDTH*0.5 + sin(ty_get_time() * 10) * 50 - (img.width*0.5), SCREEN_HEIGHT*0.5 - (img.height*0.5) ) ); ty_draw_text(&font, ty_vec2i(5, SCREEN_HEIGHT - 5 - 8), "hello, world!"); double frame_time = ty_get_time() - start; char ms_fmt[] = "%.2g ms"; int ms_width = ty_font_width(&font, ms_fmt, frame_time * 1000); ty_draw_rect( (struct ty_recti){ 5, 5, ms_width, 8, }, TY_COLOR_BLACK ); ty_draw_text_fmt( &font, ty_vec2i(5, 5), ms_fmt, frame_time * 1000 ); char fps_fmt[] = "%4d fps"; int fps_width = ty_font_width(&font, fps_fmt, (int)(1.0 / frame_time)); ty_draw_rect( (struct ty_recti){ 5, 5 + 8, fps_width, 8, }, TY_COLOR_BLACK ); ty_draw_text_fmt( &font, ty_vec2i(5, 5 + 8), fps_fmt, (int)(1.0 / frame_time) ); int y = 5+24; ty_draw_text(&font, ty_vec2i(5, y), "abcdefghijklmnopqrstuvwxyz" ); y += 8; ty_draw_text(&font, ty_vec2i(5, y), "0123456789" ); y += 8; ty_draw_text(&font, ty_vec2i(5, y), "!\"'#$%&()*+,-./@[]\\" ); y += 8; ty_draw_text(&font, ty_vec2i(5, y), "^_`{}|~:;<>=? " ); ty_draw_end(); } struct ty_image load_qoi_image(const char *path) { qoi_desc desc; void *data = qoi_read(path, &desc, 3); if (!data) ty_log_fatal(TY_ERR_IO, "failed to read image"); struct ty_image img = ty_create_image(desc.width, desc.height, data); free(data); return img; } int main(void) { struct ty_hints hints = { .scr_width = SCREEN_WIDTH, .scr_height = SCREEN_HEIGHT, .game_title = "Demonchime", .ticrate = 30, }; ty_init(hints); img = load_qoi_image("test_img.qoi"); char font_chars[] = "abcdefghijklmnopqrstuvwxyz0123456789" "!\"'#$%&()*+,-./@[]\\^_`{}|~:;<>=? " ; struct ty_image font_img = load_qoi_image("font.qoi"); int glyph_height = 8; for (int i = 0; font_chars[i] != '\0'; i++) { struct ty_image glyph = ty_create_image( font_img.width, glyph_height, font_img.data + font_img.width * glyph_height * i ); ty_font_add_glyph( &font, *(uint8_t*)&font_chars[i], glyph ); } while (ty_is_game_running()) { int ticks = ty_tick(); for (int i = 0; i < ticks; i++) tick(); ty_free_temp_allocs(); // ty_sleep(1000 / hints.ticrate); } ty_free_image(img); ty_free_image(font_img); for (int i = 0; i < CHAR_MAX; i++) ty_free_image(font.glyphs[i]); ty_deinit(); return 0; }