「Ruby」の「Gosu」でデスクトップゲーム「Color」を開発してみよう

第9回の今回は、プログラミング言語「Ruby」の「Gosu」ライブラリを使ってデスクトップゲーム「Color」を作る解説をします。

大西 武 (オオニシ タケシ)

8月5日 6:30

はじめに

この連載では、さまざまなプログラミング言語やライブラリで同じゲームを開発することで、容易にそのプログラミング言語に入門します。

第9回の今回はプログラミング言語「Ruby」を使って、次のURLのようなColorゲームを作ります。こちらからアセットをダウンロードしておいてください。

Colorゲームについて

Colorゲームの内容は第1回でも解説した通り、ゲームを開始したら、赤緑青の色ブロックをクリックします。すると背景色にその色が混ぜられるので、どんどんクリックして真っ白な背景にしていこうというゲームです。

プログラミング言語について

プログラミング言語「Ruby」はまつもと ゆきひろ氏(Matz)が開発した言語で、純国産の言語では唯一国際電気標準会議(IEC)に認証されたプログラミング言語です。文法が読みやすく、数値や文字列を含めほぼすべてがオブジェクトのオブジェクト指向言語で、開発効率が高く、パッケージ管理システム「Gem」により多くのライブラリを利用できます。

RubyではWebアプリケーション、自動化ツール、データ処理、API開発、コマンドラインツール、ゲームなどを作ることができます。

Gosuについて

「Gosu」は2Dゲーム開発に必要な基本機能が揃ったライブラリです。標準でウィンドウの作成、画像の表示・描画、キーボードやマウス入力の取得、効果音・BGMの再生、フォントを使った文字表示、ゲームループ(更新・描画)の管理ができます。Gosuライブラリは内部でOpenGLを使っているためOpenGLかOpenGL互換のMesaが必要です。

開発のために必要となる環境の準備

今回必要となる「Ruby」「Visual Studio Code」「Gosuライブラリ」を準備します。なお、今回はWindowsについてのみ解説します。macOSやLinuxでのセットアップ方法についてはGitHubのGosuページを参考にしてください。

RubyはWindowsで次のURLから「RubyInstaller」を使ってインストールします。VS Codeは次のURLからインストールします。これらが揃ったらターミナルで次のコマンドを実行し、Gosuライブラリをインストールします。

・Gosuライブラリのインストール

$ gem install gosu

プロジェクトを作成しよう

「colorGosu」フォルダなどを作ってプロジェクトを用意します。と言っても、Rubyは他に設定ファイルなどがなくても「.rb」ファイルさえあればインタプリタで実行できます。

次の階層図のように必ず「images」フォルダと「sounds」フォルダを含めてください。今回もGosuライブラリでシンプルに音が扱えるためサウンドも使います。

・階層図

colorGosuフォルダ
┠images(画像フォルダ)
┃┠0.pngファイル(赤の色ブロック画像)
┃┠1.pngファイル(緑の色ブロック画像)
┃┠2.pngファイル(青の色ブロック画像)
┃┠GameOver.pngファイル(ゲームオーバー画像)
┃┠StageClear.pngファイル(ステージクリア画像)
┃┗Title.pngファイル(タイトル画像)
┠sounds(サウンドフォルダ)
┃┠GameClear.oggファイル(ゲームクリアサウンド)
┃┠GameOver.oggファイル(ゲームオーバーサウンド)
┃┠Mix.oggファイル(混色サウンド)
┃┗StageClear.oggファイル(ステージクリアサウンド)
┠ColorBlock.rbファイル(色ブロッククラスファイル)
┗main.rbファイル(メインクラスファイル)

「main.rb」ファイルを新規作成し、次のサンプルコードをコーディングします。

・サンプルコード「main.rb」ファイル

require 'gosu'

class Game < Gosu::Window
  def initialize
    super 1800, 900
    self.caption = "Color"
  end
end

Game.new.show

次のコマンドでサンプルコードを実行すると、真っ黒な画面のウィンドウが表示されます(図1)。

・Rubyプログラムの実行

$ ruby main.rb
図1:真っ黒なウィンドウを表示

【サンプルコードの解説】
「Game」クラスを「Gosu::Window」から派生して宣言します。
「initialize」がコンストラクタです。「super」で親クラスのコンストラクタを画面幅高さを指定して呼び出します。
「Game.new」でコンストラクタを呼び出し、showで表示します。

タイトル画面を表示する

ウィンドウが表示できたので、まずは画像を描画することから始めてみましょう。ゲームを開始したらタイトル画面(図2)を描画し、タイトル画面がクリックされたらタイトル画像を消します。

図2:タイトル画面を表示

・サンプルコード「main.rb」ファイル

require 'gosu'

class Game < Gosu::Window
  def initialize
    super 1800, 900
    self.caption = "Color"
    @game_state = :title
    @images = []
    @images << Gosu::Image.new("images/0.png")
    @images << Gosu::Image.new("images/1.png")
    @images << Gosu::Image.new("images/2.png")
    @images << Gosu::Image.new("images/Title.png")
    @images << Gosu::Image.new("images/GameOver.png")
    @images << Gosu::Image.new("images/StageClear.png")
    @sounds = []
    @sounds << Gosu::Song.new("sounds/GameStart.ogg")
    @sounds << Gosu::Song.new("sounds/GameOver.ogg")
    @sounds << Gosu::Song.new("sounds/StageClear.ogg")
    @sounds << Gosu::Song.new("sounds/Mix.ogg")
  end

  def draw
    case @game_state
    when :title
      img = @images[3]
      img.draw((1800-img.width)/2,(900-img.height)/2,1)
    end
  end

  def button_down(id)
    if id == Gosu::MsLeft
      case @game_state
      when :title
        @game_state = :main_loop
        @sounds[0].play()
      end
    end
  end
end

Game.new.show

【サンプルコードの解説】
コンストラクタで「@images」プロパティ(@変数はクラスのプロパティを表す)を配列として宣言しすべての画像を読み込み、「@sounds」プロパティにすべてのサウンドを読み込みます。
描画「draw」メソッドでは、ゲーム状態「@game_state」が「:title」シンボルならタイトル画像を表示します。
ボタンが押された時に呼ばれる「button_down」メソッドで、タイトル画面をクリックしたらゲーム状態を「:main_loop」シンボルにセットし、「ゲームスタート」のサウンドを再生します。

【コラム】器用貧乏も突き詰めると…

絵本のテーマの1つを考えました。器用貧乏は「何もモノになっていない」と悪い意味の言葉ですが、「器用貧乏も突き詰めると1つぐらいはモノになる」というテーマです。病気になった僕でさえ、色々とやって様々な技術を身につけ、物書きの仕事ができるようになりました。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30