]> git.lizzy.rs Git - nothing.git/blobdiff - src/ui/menu_title.c
(#813) Implement player_layer_render
[nothing.git] / src / ui / menu_title.c
index d6c292eaabc19aea9304ab88af2c328830bc4f6d..5273dc25115e00f1a073886b0483a7236dcf3dc6 100644 (file)
@@ -15,6 +15,8 @@ struct MenuTitle
     const char *text;
     Vec font_scale;
     const Sprite_font *sprite_font;
+    float angle;
+    Vec position;
 };
 
 MenuTitle *create_menu_title(const char *text,
@@ -24,13 +26,10 @@ MenuTitle *create_menu_title(const char *text,
     trace_assert(text);
 
     Lt *lt = create_lt();
-    if (lt == NULL) {
-        return NULL;
-    }
 
     MenuTitle *menu_title = PUSH_LT(
         lt,
-        nth_alloc(sizeof(MenuTitle)),
+        nth_calloc(1, sizeof(MenuTitle)),
         free);
     if (menu_title == NULL) {
         RETURN_LT(lt, NULL);
@@ -47,6 +46,8 @@ MenuTitle *create_menu_title(const char *text,
 
     menu_title->font_scale = font_scale;
     menu_title->sprite_font = sprite_font;
+    menu_title->angle = 0.0f;
+    menu_title->position = vec(0.0f, 0.0f);
 
     return menu_title;
 }
@@ -58,20 +59,31 @@ void destroy_menu_title(MenuTitle *menu_title)
 }
 
 int menu_title_render(const MenuTitle *menu_title,
-                      SDL_Renderer *renderer,
-                      Vec position)
+                      SDL_Renderer *renderer)
 {
     trace_assert(menu_title);
     trace_assert(renderer);
 
-    if (sprite_font_render_text(
-            menu_title->sprite_font,
-            renderer,
-            position,
-            menu_title->font_scale,
-            rgba(1.0f, 1.0f, 1.0f, 1.0f),
-            menu_title->text) < 0) {
-        return -1;
+
+    const size_t n = strlen(menu_title->text);
+    char buf[2] = {0, 0};
+
+    for (size_t i = 0; i < n; ++i) {
+        buf[0] = menu_title->text[i];
+
+        if (sprite_font_render_text(
+                menu_title->sprite_font,
+                renderer,
+                vec_sum(
+                    menu_title->position,
+                    vec(
+                        (float) (i * FONT_CHAR_WIDTH) * menu_title->font_scale.x,
+                        sinf(menu_title->angle + (float) i / (float) n * 10.0f) * 20.0f)),
+                menu_title->font_scale,
+                rgba(1.0f, 1.0f, 1.0f, 1.0f),
+                buf) < 0) {
+            return -1;
+        }
     }
 
     return 0;
@@ -80,7 +92,7 @@ int menu_title_render(const MenuTitle *menu_title,
 int menu_title_update(MenuTitle *menu_title, float delta_time)
 {
     trace_assert(menu_title);
-    (void) delta_time;
+    menu_title->angle = fmodf(menu_title->angle + 10.0f * delta_time, 2 * PI);
     return 0;
 }
 
@@ -96,3 +108,9 @@ Vec menu_title_size(const MenuTitle *menu_title)
 
     return vec(boundary.w, boundary.h);
 }
+
+void menu_title_move(MenuTitle *menu_title,
+                     Vec position)
+{
+    menu_title->position = position;
+}