🐥

神話のプログラム言語 OdinでRaylibを動かす

に公開

はじめに

表題を説明する前に、2点Odin関連でお知らせがあります。

  • Odinの最新202412バージョンが本日リリースされました。大体、毎月初めにリリースされるみたいです。
    今回の変更点は特にありませんが、Raylibライブラリが最新のバージョン5.5に対応するようになりました。後はバグフィックスが主な変更です。個人的にはSDL3ライブラリが付属するのか期待したのですが、今回は無かったです。
  • 世界初のOdinの本が発売になりました。
    youtubeで時々、Odinの説明動画を配信していたKarl Zylinski氏が、作成した本です。

https://odinbook.com/

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用のプログラミング方法が説明されています。
https://youtu.be/Y6bn6yeyBW4

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