From 6f33741f2edd8f8f4b730e663d17b5f96dbc48ff Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 27 Nov 2023 18:57:58 -0600 Subject: [PATCH] added guide to raylib --- src/app.onyx | 3 + www/static/images/guide_raylib_1.png | Bin 0 -> 13992 bytes www/static/images/guide_raylib_2.png | Bin 0 -> 19948 bytes www/static/vendor/highlight.min.js | 2 +- .../pages/docs/guide_http_server.html | 2 +- www/templates/pages/docs/guide_raylib.html | 315 ++++++++++++++++++ www/templates/partials/navbar.html | 3 +- 7 files changed, 321 insertions(+), 4 deletions(-) create mode 100644 www/static/images/guide_raylib_1.png create mode 100644 www/static/images/guide_raylib_2.png create mode 100644 www/templates/pages/docs/guide_raylib.html diff --git a/src/app.onyx b/src/app.onyx index fad9de7..e50ff2e 100644 --- a/src/app.onyx +++ b/src/app.onyx @@ -56,6 +56,9 @@ reg: otmp.TemplateRegistry; @route.{.GET, "/docs/guides/http-server"} (req: &Req, res: &Res) => res->render("pages/docs/guide_http_server", null); +@route.{.GET, "/docs/guides/raylib"} +(req: &Req, res: &Res) => res->render("pages/docs/guide_raylib", null); + @route.{.GET, "/docs/packages"} (req: &Req, res: &Res) => res->render("pages/docs/package", null); diff --git a/www/static/images/guide_raylib_1.png b/www/static/images/guide_raylib_1.png new file mode 100644 index 0000000000000000000000000000000000000000..60406a2815bba4f4d7949c36d93da92a6856d789 GIT binary patch literal 13992 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 y;uBcNJas%-D|G

Guide - HTTP Server

- +

This guide walks you through all steps of setting up an HTTP server Onyx, diff --git a/www/templates/pages/docs/guide_raylib.html b/www/templates/pages/docs/guide_raylib.html new file mode 100644 index 0000000..c67abb3 --- /dev/null +++ b/www/templates/pages/docs/guide_raylib.html @@ -0,0 +1,315 @@ +{{block "title"}}Guide - Using Raylib{{endblock}} + +{{ let navbar_page = "docs" }} + +{{ block "page_content" }} + +

+

Guide - Using Raylib

+ + +

+ This guide will get you set up to use Raylib in your next Onyx project. +

+
+ +
+
+

Setting up the Project

+
+ +

+ To get started, create a new directory for the project. In that directory, run the following commands. +

+ +
$ onyx package init
+Creating new project manifest in ./onyx-pkg.kdl.
+
+Package name: raylib-example
+Package description: An example project using the Raylib bindings
+Package url:    
+Package author: Brendan Hansen
+Package version (0.0.1):
+
+$ onyx package add
+       Added  'raylib' version 0.0.3
+
+$ onyx package sync
+       Fetch  http://github.com/onyx-lang/pkg-raylib  0.0.3
+     Install  Running installation of 'lib/github.com/onyx-lang/pkg-raylib'
+ +

+ This will initialize the prompt you for the project information, which you can leave blank because + you probably won't be publishing this project as a package. +

+

+ It will also add the raylib dependency and synchronize all packages to install it. + When it installs, it compiles a native binding library to be used by Onyx to interoperate with Raylib. + This process should on any MacOS or Linux system. If it does not, consider making an issue on the + raylib package repository. +

+
+ +
+
+

Writing some code

+
+ +

+ Now that the project is set up and Raylib is installed, you can start writing some code. + Lets start by testing our environment by creating a simple window with a gray background. + Write the following code in a file called game.onyx. +

+ +
#load "./lib/packages"
+
+use core {*}
+use raylib
+
+main :: () {
+    // Create a new window
+    raylib.InitWindow(1200, 900, "Raylib Example");
+
+    while !raylib.WindowShouldClose() {
+        // Start drawing
+        raylib.BeginDrawing();
+        
+        // Clear the screen to a gray screen
+        raylib.ClearBackground(.{20, 20, 20, 255});
+
+        // Finish drawing
+        raylib.EndDrawing();
+    }
+
+    // Close window when done
+    raylib.CloseWindow();
+}
+ +

+ To test your code, you can run it using onyx run. +

+ +
$ onyx run game.onyx
+ +

+ Assuming everything is working, you should see a window that looks like this. +

+ +
+ Raylib is working +
+
+ +
+
+

Making a "Game"

+
+ +

+ Let's expand your simple window testing program by making a (very simple) game. + In this game, you will control a character, and your job is to run to a checkpoint, + but in your way will be random mines that you need to avoid. +

+ +

+ It's a silly game idea, but it will demonstrate some Onyx and Raylib features. +

+ +

+ To start making this game, let's define some structures and global variables + to store the state of the game. +

+ +
Player :: struct {
+    x, y: f32;
+    size: f32;
+}
+
+Checkpoint :: struct {
+    x, y: f32;
+    size: f32;
+}
+
+Mine :: struct {
+    x, y: f32;
+    size: f32;
+}
+
+//
+// Game state
+player: Player;
+checkpoint: Checkpoint;
+mines: [..] Mine;
+score: i32;
+ +

+ Next, you can add some code to reset the game state in resetGame, generate new mines + and move the checkpoint in moveCheckpointAndSpawnMines. +

+ +
resetGame :: () {
+    // Reset the score.
+    score = 0;
+
+    // Put our player in the middle of the screen.
+    player = .{
+        x = 600,
+        y = 450,
+        size = 20
+    };
+
+    // Remove all existing mines
+    array.clear(&mines);
+
+    moveCheckpointAndSpawnMines();
+}
+
+moveCheckpointAndSpawnMines :: () {
+    checkpoint = .{
+        x = random.float(0, 1180),
+        y = random.float(0, 880),
+        size = 20,
+    };
+
+    // Spawn 5 mines at a time.
+    for 5 {
+        mine := mineGenerator()
+            |> iter.skip_while(m => collidesWithCheckpointOrPlayer(m))
+            |> iter.next();
+
+        array.push(&mines, mine);
+    }
+}
+ +

+ The above uses a couple of utility functions that you need to write. + The first one checks if a mine that is going to be place collides with + the checkpoint or the player. +

+ +

+ The other one is a little weirder. + It procudes an Iterator over random Mines. + This iterator never ends, and will infinitely produce random mines. + When combined with iter.skip_while, you can easily + find the first mine that meets a constraint. + In this case, the first mine thatis infinite does not collide with the checkpoint + or the player. +

+ +
#doc "Returns if a mine collides with the checkpoint or the player."
+collidesWithCheckpointOrPlayer :: (m: Mine) -> bool {
+    return
+        raylib.CheckCollisionCircleRec(
+            .{ m.x, m.y }, m.size,
+            .{ checkpoint.x, checkpoint.y, checkpoint.size, checkpoint.size }
+        )
+        ||
+        raylib.CheckCollisionCircleRec(
+            .{ m.x, m.y }, m.size,
+            .{ player.x, player.y, player.size, player.size }
+        );
+}
+
+#doc "Produces an interator of random mines."
+mineGenerator :: () -> Iterator(Mine) {
+    return iter.generator(&.{}, _ => {
+        return Mine.{
+            x = random.float(0, 1180),
+            y = random.float(0, 880),
+            size = random.float(10, 30),
+        }, true;
+    });
+}
+ +

+ Finally, you need to update your main procedure to use the new procedures + and make the game, well, a game. +

+ +
main :: () {
+    random.set_seed(os.time());
+
+    resetGame();
+
+    // Create a new window
+    raylib.InitWindow(1200, 900, "Raylib Example");
+
+    while !raylib.WindowShouldClose() {
+        // Update player based on keys pressed
+        dt := raylib.GetFrameTime();
+
+        player_speed :: 160.0f;
+        if raylib.IsKeyDown(.UP)    do player.y -= player_speed * dt;
+        if raylib.IsKeyDown(.DOWN)  do player.y += player_speed * dt;
+        if raylib.IsKeyDown(.LEFT)  do player.x -= player_speed * dt;
+        if raylib.IsKeyDown(.RIGHT) do player.x += player_speed * dt;
+
+        // Check for collision with the checkpoint
+        if raylib.CheckCollisionCircleRec(
+            .{ player.x, player.y }, player.size,
+            .{ checkpoint.x, checkpoint.y, checkpoint.size, checkpoint.size }
+        ) {
+            score += 10;
+            moveCheckpointAndSpawnMines();
+        }
+
+        // Check collision with mines
+        for mine: mines {
+            if raylib.CheckCollisionCircles(
+                .{ player.x, player.y }, player.size,
+                .{ mine.x, mine.y }, mine.size,
+            ) {
+                resetGame();
+            }
+        }
+
+        // Start drawing
+        raylib.BeginDrawing();
+        
+        // Clear the screen to a gray screen
+        raylib.ClearBackground(.{20, 20, 20, 255});
+
+        // Draw mines
+        for mine: mines {
+            raylib.DrawCircle(~~mine.x, ~~mine.y, mine.size, .{100, 0, 0, 255});
+        }
+
+        // Draw the checkpoint
+        raylib.DrawRectangle(~~checkpoint.x, ~~checkpoint.y, ~~checkpoint.size, ~~checkpoint.size, .{50, 200, 0, 255});
+
+        // Draw the player
+        raylib.DrawCircle(~~player.x, ~~player.y, player.size, .{0, 0, 200, 255});
+
+        // Draw the score
+        raylib.DrawText(tprintf("Score: {}\0", score).data, 0, 0, 24, .{255, 255, 255, 255});
+
+        // Finish drawing
+        raylib.EndDrawing();
+    }
+
+    // Close window when done
+    raylib.CloseWindow();
+}
+ +

+ With all of the above code in game.onyx, you can run your game in the same way + as before. +

+ +
$ onyx run game.onyx
+ +
+ Raylib is working +
+ +

+ Now, you can take this simple game and make something even better! + See the Raylib documentation for more details on + how to use Raylib. +

+
+ +{{ endblock }} + +{{ extends "pages/normal_page" }} diff --git a/www/templates/partials/navbar.html b/www/templates/partials/navbar.html index 2bc6b48..60a8f42 100644 --- a/www/templates/partials/navbar.html +++ b/www/templates/partials/navbar.html @@ -21,8 +21,7 @@