test/snake.c

changeset 33
e7ddb52facd3
parent 32
86468a71dd73
child 36
e26b4ac1661c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/snake.c	Wed Mar 06 23:08:03 2024 +0100
@@ -0,0 +1,88 @@
+/*
+ * 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/ascension.h>
+#include <cx/printf.h>
+
+static void update_fps_counter(AscSceneNode *node) {
+    // addition and multiplication is more efficient testing for zero
+    // at an unnoticible cost of imprecision
+    static unsigned last_fps = 0u;
+    static unsigned debounce = 999u;
+    unsigned fps = 1000u;
+    debounce += asc_context.elapsed_millis;
+    if (debounce >= 1000u) {
+        debounce = 0;
+        fps /= asc_context.elapsed_millis;
+        if (fps != last_fps) {
+            last_fps = fps;
+            snprintf(((AscText*)node)->text, 9, "%u FPS", fps);
+            asc_node_update(node);
+        }
+    }
+}
+
+static void create_fps_counter(void) {
+    asc_set_font(asc_font(ASC_FONT_REGULAR, 24));
+    asc_ink_rgb(255, 0, 0);
+    AscText* text = asc_text(10, 10, "XXXXX FPS");
+    asc_scene_add_behavior(asc_node(text), update_fps_counter);
+}
+
+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;
+    }
+
+    AscWindowSettings settings;
+    asc_window_settings_init_defaults(&settings);
+    settings.title = "Sandbox Application";
+
+    AscWindow *window = asc_window_initialize(0, &settings);
+    asc_shader_initialize_predefined();
+
+    // create fps counter
+    create_fps_counter();
+
+    // Main Loop
+    do {
+        // quit application on any error
+        if (asc_has_error()) {
+            SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
+                    "Fatal Error", asc_get_error(), window->window);
+            asc_clear_error();
+            break;
+        }
+    } while (asc_loop_next());
+
+    asc_context_destroy();
+    return 0;
+}
+

mercurial