test/snake/snake.c

changeset 84
e4116b4b5774
parent 80
9f7bfc0a1dc3
child 86
943bf9d7c6d6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/snake/snake.c	Sat Apr 19 12:54:49 2025 +0200
@@ -0,0 +1,116 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ * Copyright 2023 Mike Becker. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ascension/core.h"
+#include <ascension/ui.h>
+
+#include <cx/printf.h>
+
+static void update_fps_counter(AscSceneNode *node) {
+    static uint64_t last_fps = 0;
+    static uint64_t debounce = ASC_NANOS_SECOND - 1;
+    debounce += asc_context.frame_nanos;
+    // only update text every second
+    if (debounce >= ASC_NANOS_SECOND) {
+        debounce = 0;
+        uint64_t fps = ASC_NANOS_SECOND;
+        fps /= asc_context.frame_nanos;
+        if (fps != last_fps) {
+            last_fps = fps;
+            asc_text_printf(node, "%"PRIu64" FPS", fps);
+        }
+    }
+    // tie to bottom right of the screen
+    if (asc_test_flag(node->flags, ASC_SCENE_NODE_GRAPHICS_UPDATED)
+        || asc_active_window->resized) {
+        asc_vec2i bottom_right = asc_active_window->dimensions;
+        asc_vec2i scale = asc_get_scale2d(node);
+        asc_set_position2d(
+                node,
+                bottom_right.x - scale.width - 10,
+                bottom_right.y - scale.height - 10
+        );
+    }
+}
+
+static void create_fps_counter(void) {
+    asc_font(ASC_FONT_REGULAR, 12);
+    asc_ink_rgba(128, 128, 128, 196);
+    AscSceneNode *node = asc_text();
+    asc_scene_add_behavior(node, update_fps_counter);
+    asc_add_ui_node(node);
+}
+
+static void create_score_counter(void) {
+    asc_font(ASC_FONT_BOLD, 16);
+    asc_ink_rgb(0, 255, 0);
+    AscSceneNode* node = asc_text(
+            .x = 10, .y = 10,
+            .text = "Score: 0"
+    );
+    asc_add_ui_node(node);
+}
+
+int main(int argc, char** argv) {
+    asc_context_initialize();
+    if (asc_has_error()) {
+        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
+                "Fatal Error",asc_get_error(),NULL);
+        return 1;
+    }
+
+    // create window
+    AscWindowSettings settings;
+    asc_window_settings_init_defaults(&settings);
+    settings.title = "Snake";
+    asc_window_initialize(0, &settings);
+
+    // create UI elements
+    create_fps_counter();
+    create_score_counter();
+
+    // Main Loop
+    do {
+        // quit application on any error
+        if (asc_has_error()) {
+            SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
+                    "Fatal Error", asc_get_error(),
+                    asc_active_window->window);
+            asc_clear_error();
+            asc_context_quit();
+        }
+
+        // quit application on ESC key press
+        if (asc_key_pressed(ESCAPE)) {
+            asc_context_quit();
+        }
+    } while (asc_loop_next());
+
+    asc_context_destroy();
+    return 0;
+}
+

mercurial