#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); for (int y = 0; y < SCREEN_HEIGHT; y += 16) { for (int x = 0; x < SCREEN_WIDTH; x += 16) { ty_draw_image(img, ty_vec2i(x, y)); } } ty_draw_rect( (struct ty_recti){ SCREEN_WIDTH*0.5 + sin(ty_get_time() * 10) * 50 - 25, SCREEN_HEIGHT*0.5-25, 50, 50, }, TY_COLOR_RED ); ty_draw_line( ty_vec2i(0, 0), ty_vec2i(100, 100), ty_color(0xFF, 0xF0, 0x80) ); ty_draw_line( ty_vec2i(100, 0), ty_vec2i(0, 100), ty_color(0x80, 0xF0, 0xFF) ); ty_draw_line( ty_vec2i(150, 0), ty_vec2i(150, 100), ty_color(0x80, 0xF0, 0xFF) ); ty_draw_line( ty_vec2i(100, 50), ty_vec2i(200, 50), ty_color(0xFF, 0xF0, 0x80) ); 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) ); 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); ty_deinit(); return 0; }