めのん@ひとりプログラミング同好会

このブログはすべてフィクションであり、実在の人物、団体とは一切関係ありません

OpenSiv3DでHello, World!

こんばんは、めのんです!

最近はPHPと並行してZigやC++の勉強をしています。 C++についてはせっかくなのでモダンな言語仕様を勉強したいと思って、何か題材になるものはないかな? と思って探していました。

探せばあるものですねー 知人のエンジニアの方からOpenSiv3Dというライブラリというかフレームワークを教えていただきました。 C++17かC++20を使うそうなので確かにモダンです。

このOpenSiv3Dは、もともと2013年度のIPA未踏事業に採択されたプロジェクトのようで、現在はOpenSiv3Dに引き継がれたとのことです。

さっそくダウンロードしてみました。 Windowsの場合はVisual Studio 2019を使う前提のようで、インストールするとVisual StudioにOpenSiv3Dのプロジェクト テンプレートが現れるようになりました。 そのプロジェクト テンプレートを使って新規作成すると、次のようなソースコードが作成されます。

# include <Siv3D.hpp> // OpenSiv3D v0.4.3

void Main()
{
    // 背景を水色にする
    Scene::SetBackground(ColorF(0.8, 0.9, 1.0));

    // 大きさ 60 のフォントを用意
    const Font font(60);

    // 猫のテクスチャを用意
    const Texture cat(Emoji(U"🐈"));

    // 猫の座標
    Vec2 catPos(640, 450);

    while (System::Update())
    {
        // テキストを画面の中心に描く
        font(U"Hello, Siv3D!🐣").drawAt(Scene::Center(), Palette::Black);

        // 大きさをアニメーションさせて猫を表示する
        cat.resized(100 + Periodic::Sine0_1(1s) * 20).drawAt(catPos);

        // マウスカーソルに追従する半透明の赤い円を描く
        Circle(Cursor::Pos(), 40).draw(ColorF(1, 0, 0, 0.5));

        // [A] キーが押されたら
        if (KeyA.down())
        {
            // Hello とデバッグ表示する
            Print << U"Hello!";
        }

        // ボタンが押されたら
        if (SimpleGUI::Button(U"Move the cat", Vec2(600, 20)))
        {
            // 猫の座標を画面内のランダムな位置に移動する
            catPos = RandomVec2(Scene::Rect());
        }
    }
}

//
// = アドバイス =
// Debug ビルドではプログラムの最適化がオフになります。
// 実行速度が遅いと感じた場合は Release ビルドを試しましょう。
// アプリをリリースするときにも、Release ビルドにするのを忘れないように!
//
// 思ったように動作しない場合は「デバッグの開始」でプログラムを実行すると、
// 出力ウィンドウに詳細なログが表示されるので、エラーの原因を見つけやすくなります。
//
// = お役立ちリンク =
//
// OpenSiv3D リファレンス
// https://siv3d.github.io/ja-jp/
//
// チュートリアル
// https://siv3d.github.io/ja-jp/tutorial/basic/
//
// よくある間違い
// https://siv3d.github.io/ja-jp/articles/mistakes/
//
// サポートについて
// https://siv3d.github.io/ja-jp/support/support/
//
// Siv3D ユーザコミュニティ Slack への参加
// https://siv3d.github.io/ja-jp/community/community/
//
// 新機能の提案やバグの報告
// https://github.com/Siv3D/OpenSiv3D/issues
//

最初に扱うにはちょっと長すぎますよねー

私はこういうとき、最小限までコードを削減することにしています。 削減していく過程で、コンパイルできなくなったり動かなくなったりしますから、そういう経験を経てそれぞれのコードが何に役立っているのかわかっていきます。

今回も最小限までコードを削減しました。 落ち着くところはもちろん、Hello, World!です!

# include <Siv3D.hpp> // OpenSiv3D v0.4.3

void Main()
{
    // 大きさ 60 のフォントを用意
    const Font font(60);

    while (System::Update())
    {
        // テキストを画面の中心に描く
        font(U"Hello, World!").drawAt(Scene::Center(), Palette::White);
    }
}

これなら何をやっているのかよくわかります。 実行すると、画面の中央にHello, World!という文字列が表示できました。

f:id:elddiry:20200703204817p:plain

試しにwhile文もやめてループの中だけにしてみましたが、すぐにウィンドウが閉じてしまいました。 考えてみればあたりまえでしたね(笑)

この週末にはOpenSiv3Dでもう少し遊んでみたいと思います!

それでは!!