-
-
Save karl-zylinski/003bfb669d5a3050816e6d019e43fd97 to your computer and use it in GitHub Desktop.
// Minimal Odin + Raylib example that opens window and lets you control a | |
// rectangle using the arrow keys. Beginners can use this as a starting point. | |
// | |
// Copy this into a file called whatever_you_want.odin inside an empty folder. | |
// Use the command prompt to navigate to that folder and run: | |
// odin run . | |
// Note the period, with a space before it! This should run this minimal example. | |
package raylib_minimal | |
import rl "vendor:raylib" | |
import "core:math/linalg" | |
main :: proc() { | |
rl.SetConfigFlags({.VSYNC_HINT}) | |
rl.InitWindow(1280, 720, "Raylib Minimal") | |
// This just makes sure your battery doesn't drain too fast in case VSYNC | |
// is forced off. | |
rl.SetTargetFPS(500) | |
// rl.Vector2 is equivalent to `[2]f32`. Meaning it is a fixed array of two | |
// floating point numbers. | |
pos := rl.Vector2 { 200, 200 } | |
size := rl.Vector2 { 20, 20 } | |
for !rl.WindowShouldClose() { | |
dt := rl.GetFrameTime() | |
movement: rl.Vector2 | |
// These check if the key is held. There are also IsKeyPressed and | |
// IsKeyReleassed, which are only true on the frame when that happaned. | |
// | |
// Open `<odin>/vendor/raylib/raylib.odin` and to see all the input- | |
// related procedures. | |
if rl.IsKeyDown(.UP) { movement.y -= 1 } | |
if rl.IsKeyDown(.DOWN) { movement.y += 1 } | |
if rl.IsKeyDown(.LEFT) { movement.x -= 1 } | |
if rl.IsKeyDown(.RIGHT) { movement.x += 1 } | |
// normalize0 makes sure length of movement is 1 (so you don't move | |
// faster when going diagonally). | |
// | |
// Note that normalize0 takes a vector and returns a new vector. We then | |
// multiply that vector by `400` and `dt`, producing another vector. | |
// Then that whole vector is added to `pos`. | |
pos += linalg.normalize0(movement) * 400 * dt | |
// For the curious person: | |
// | |
// (Sublime Text) Check out what normalize0 does: | |
// * add `<odin>/core` to your project (drag n drop core folder into sublime) | |
// * put text cursor on `normalize0` and press F12 | |
// | |
// More info on how to "find things in core" in this video: | |
// https://www.youtube.com/watch?v=mljzCWnvWCs | |
// You must have Begin/End drawing. EndDrawing in particular is the | |
// thing in raylib that processes input so stuff like `rl.IsKeyDown` works. | |
rl.BeginDrawing() | |
rl.ClearBackground(rl.DARKBLUE) | |
rl.DrawRectangleV(pos, size, rl.WHITE) | |
rl.EndDrawing() | |
} | |
rl.CloseWindow() | |
} |
Unless I missunderstood your question, x, y are fields (variables) inside the Vector2 struct.
Vector2 :: struct {
x: f32,
y: f32,
}
Odin automatically zero-initializes by default, so x and y start as 0.0.
Odin may internally simplify this struct to a 2 element array since the 2 fields have the same type (f32).
I encourage you to use LLMs for asking questions, they can easly answer questions like this and you would speed up your Q/A, cheers.
@uoojin95 For any numeric fixed array of size four or less it makes it possible to use xyzw to fetch the four elements. It's built into the language. I explain more here: https://zylinski.se/posts/introduction-to-odin/#array-basics-swizzling-and-array-programming
@ShadOoW As you see, the LLM was completely wrong. Please don't answer questions by asking an LLM and posting it online. Only answer if you are fairly sure you know the answer.
Hi karl, I just started learning about Odin by watching one of your youtube videos.
I have a question on
movement.y
. Where is the propertyx
ory
defined?Vector2
type is just [2]f32, so I'm wondering how the compiler knows what to do with them.