🐥
神話のプログラム言語 OdinでRaylibを動かす
はじめに
表題を説明する前に、2点Odin関連でお知らせがあります。
- Odinの最新202412バージョンが本日リリースされました。大体、毎月初めにリリースされるみたいです。
今回の変更点は特にありませんが、Raylibライブラリが最新のバージョン5.5に対応するようになりました。後はバグフィックスが主な変更です。個人的にはSDL3ライブラリが付属するのか期待したのですが、今回は無かったです。 - 世界初のOdinの本が発売になりました。
youtubeで時々、Odinの説明動画を配信していたKarl Zylinski氏が、作成した本です。
vendorの一覧
vendorライブラリとは、gingerBill氏が動作検証し動作上問題ないと判断したライブラリ群です。このライブラリはOdinプログラム内で使う事が出来ます。つまりは、Odin言語をインストールするだけで、vendor内のライブラリが何もインストールする事なく使えると言う事です。
| vendor | システム説明 |
|---|---|
| vendor:raylib | グラフィック・ゲーム向けライブラリ |
| vendor:sdl2 | Simple DirectMedia Layerゲーム向けライブラリ |
| vendor:glfw | 軽量OpenGLユーティリティライブラリ |
| vendor:OpenEXRCore | 画像を360度表示できるライブラリ |
| vendor:box2d | 2D物理演算エンジンライブラリ |
| vendor:directx | 3Dグラフィックライブラリ |
| vendor:vulkan | 3Dグラフィックライブラリ |
| vendor:lua | 軽量スクリプト言語(ゲームのスクリプトでよく使う) |
| vendor:wasm | WASM開発ライブラリ |
| vendor:microui | Mac向け軽量GUI用ライブラリ |
| vendor:darwin | MacAPI用ライブラリ |
| vendor:X11 | LinuxのX11API用ライブラリ |
※その他、訳のわからないライブラリが数点
どうですか!、この多さ。ゲーム用のライブラリばっかりじゃねえか!と思われますが、そうなんです。ゲームが主体のライブラリなんです。
raylibの動作
raylibは、軽量のグラフィック&ゲームライブラリです。軽量な事もあって、全てのプログラム言語に対してバインドライブラリが存在します。基本的に記述は下記の通りで、Odinプログラムに数行の記載で動作します。
これはウィンドウを表示しているだけですが、そのウィンドウにラインや画像を埋め込むだけで色々な図形を表現できます。
raylibを動作させる為の基本プログラム
package main
import rl "vendor:raylib" // vendorライブラリは"vendor:"を付けて記述
main :: proc() {
rl.InitWindow(1280, 720, "raylib program")
rl.SetTargetFPS(60) // 表示速度 大体毎秒60回描画設定にすると良いかも
for !rl.WindowShouldClose() {
rl.BeginDrawing()
// Begin - End間で描画を行う
rl.EndDrawing()
}
}
詳細は私が説明するより、下記の動画を見てください。詳しくraylibでの2D用のプログラミング方法が説明されています。
3D用のraylibプログラム
下記のプログラムは、raylibのサンプルプログラムを、Odin言語に書き換えてみました。
注意するところは、camera構造体を設定し、BeginMode3D関数でカメラの状態を設定し3D表示しているところです。
package main
import rl "vendor:raylib"
main :: proc() {
rl.InitWindow(800, 450, "raylib camera")
camera: rl.Camera
camera.position = {0, 10, 10}
camera.target = {0, 0, 0}
camera.up = {0, 1, 0}
camera.fovy = 45
camera.projection = rl.CameraProjection.PERSPECTIVE
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
rl.BeginDrawing()
rl.ClearBackground(rl.WHITE)
// カメラの位置を変える事で、表示する角度が変わる
if rl.IsKeyDown(.LEFT) do camera.position.x -= 1
if rl.IsKeyDown(.RIGHT) do camera.position.x += 1
if rl.IsKeyDown(.UP) do camera.position.y += 1
if rl.IsKeyDown(.DOWN) do camera.position.y -= 1
rl.BeginMode3D(camera)
rl.DrawCube({-4, 0, 2}, 2, 5, 2, rl.RED)
rl.DrawCubeWires({-4, 0, 2}, 2, 5, 2, rl.GOLD)
rl.DrawCubeWires({-4, 0, -2}, 3, 6, 2, rl.MAROON)
rl.DrawSphere({-1, 0, -2}, 1, rl.GREEN)
rl.DrawSphereWires({1, 0, 2}, 2, 16, 16, rl.LIME)
rl.DrawCylinder({4, 0, -2}, 1, 2, 3, 4, rl.SKYBLUE)
rl.DrawCylinderWires({4, 0, -2}, 1, 2, 3, 4, rl.DARKBLUE)
rl.DrawCylinderWires({1, 0, -4}, 0, 1, 3, 8, rl.PINK)
rl.DrawCapsule({-3, 1.5, -4}, {-4, -1, -4}, 1.2, 8, 8, rl.VIOLET)
rl.DrawCapsuleWires({-3, 1.5, -4}, {-4, -1, -4}, 1.2, 8, 8, rl.PURPLE)
rl.DrawGrid(10, 1)
rl.EndMode3D()
rl.DrawFPS(10,10)
rl.EndDrawing()
}
}

おわりに
今回はraylibライブラリについて、簡単にプログラム方法を記載しました。もっと深堀りして説明したかったのですが、時間的になかったです。
Discussion