初心者がRubyとGosuでゲーム作成に挑戦!たった10ステップでマスターできる方法

初心者がRubyとGosuを用いてゲーム作成に挑戦するイメージ図Ruby
この記事は約19分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればサンプルコードを活用して機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

ゲーム開発を始めたいが、どこから手をつけて良いか分からない…そんな初心者の方々に朗報です!

この記事では、プログラミング言語「Ruby」とゲームライブラリ「Gosu」を使ってゲームを作るための10のステップをご紹介します。

それぞれのステップには詳細な説明とサンプルコードが用意されており、全くの初心者でも手順を追っていくことで、自分だけのゲームを作成できるようになります。

最後まで読めば、RubyとGosuを使ってゲームを作る方法が身につくことでしょう。

●Rubyとは

Rubyは、まつもとゆきひろ氏によって開発されたプログラミング言語です。

シンプルで読みやすい文法を特徴とし、オブジェクト指向の概念を強く取り入れています。

これにより、Rubyではコードを効率的に組み立てることができます。

また、Rubyは動的な言語のため、コードの実行中にもデータ型の変更や新たなメソッドの追加が可能です。

このような特性から、Rubyはウェブアプリケーションの開発によく用いられますが、その機能性と柔軟性はゲーム開発にも活かすことができます。

●Gosuとは

GosuはRubyで使える2Dゲーム開発ライブラリです。

ゲームのウィンドウを作成したり、画像を描画したり、音を鳴らしたり、キーボードやマウスの入力を取得したりと、ゲーム制作に必要な基本的な機能を提供しています。

また、Gosuはその利便性と柔軟性から、初心者にも扱いやすいライブラリとして人気を博しています。

●RubyとGosuをインストールする方法

RubyとGosuを使ってゲームを作るためには、まずこれらのツールを自分のPCにインストールする必要があります。

○Rubyのインストール

Rubyのインストール方法は、使用しているOSによって異なります。

例えば、macOSの場合はターミナルを開き、下記のコマンドを実行することでRubyをインストールできます。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
brew install ruby

Windowsの場合は、「RubyInstaller」を使用すると便利です。

「RubyInstaller」は公式ウェブサイトからダウンロードできます。

ダウンロードしたファイルを実行し、指示に従ってインストールを進めていきます。

○Gosuのインストール

GosuのインストールはRubyがインストールされている環境であれば、次のコマンドを実行することで可能です。

gem install gosu

このコマンドで、Rubyのパッケージ管理システムであるRubyGemsを利用してGosuをインストールします。

●最初のGosuゲームの作成

これから、実際にRubyとGosuを使ってゲームを作成していきましょう。

まずは基本的なゲームの枠組み、つまりゲームのウィンドウを作成し、その中に図形を描画し、テキストを表示し、イベントを処理し、アニメーションを行うという一連の流れを作ってみます。

○ウィンドウの作成

まずはゲームの舞台となるウィンドウを作成します。

ウィンドウの作成にはGosu::Windowクラスを使います。

このクラスを継承した新たなクラスを定義し、その中でウィンドウのサイズや挙動を設定します。

下記のコードはウィンドウの幅と高さを640ピクセルに設定した例です。

require 'gosu'

class GameWindow < Gosu::Window
  def initialize
    super 640, 640
    self.caption = "My First Game"
  end

  def update
  end

  def draw
  end
end

window = GameWindow.new
window.show

○図形の描画

次に、ウィンドウの中に図形を描画してみましょう。

Gosuでは、draw_quadメソッドを使って四角形を描画することができます。

下記のコードでは、ウィンドウの中心に赤色の四角形を描画しています。

require 'gosu'

class GameWindow < Gosu::Window
  def initialize
    super 640, 640
    self.caption = "My First Game"
  end

  def update
  end

  def draw
    draw_quad(320, 320, Gosu::Color::RED,
              320, 360, Gosu::Color::RED,
              360, 320, Gosu::Color::RED,
              360, 360, Gosu::Color::RED)
  end
end

window = GameWindow.new
window.show

○テキストの描画

次に、ウィンドウの中にテキストを描画してみましょう。

Gosuでは、Gosu::Fontクラスを使ってテキストを描画することができます。

下記のコードでは、ウィンドウの中心に”Hello, World!”というテキストを描画しています。

require 'gosu'

class GameWindow < Gosu::Window
  def initialize
    super 640, 640
    self.caption = "My First Game"
    @font = Gosu::Font.new(32)
  end

  def update
  end

  def draw
    @font.draw_text("Hello, World!", 320, 320, 0)
  end
end

window = GameWindow.new
window.show

○イベント処理

次に、ユーザーの入力を処理する方法を見ていきましょう。

Gosuでは、button_downメソッドをオーバーライドしてユーザーのキー入力を受け取ることができます。

下記のコードでは、ユーザーがスペースキーを押すとウィンドウが閉じるようにしています。

require 'gosu'

class GameWindow < Gosu::Window
  def initialize
    super 640, 640
    self.caption = "My First Game"
  end

  def update
  end

  def draw
  end

  def button_down(id)
    close if id == Gosu::KB_SPACE
  end
end

window = GameWindow.new
window.show

○アニメーション

最後に、アニメーションの作り方を見ていきましょう。

Gosuでは、updateメソッドを使って定期的にゲームの状態を更新することができます。

下記のコードでは、毎フレームごとに@x座標を1増やすことで、右方向に移動する四角形のアニメーションを作成しています。

require 'gosu'

class GameWindow < Gosu::Window
  def initialize
    super 640, 640
    self.caption = "My First Game"
    @x = 0
  end

  def update
    @x += 1
  end

  def draw
    draw_quad(@x, 320, Gosu::Color::RED,
              @x, 360, Gosu::Color::RED,
              @x + 40, 320, Gosu::Color::RED,
              @x + 40, 360, Gosu::Color::RED)
  end
end

window = GameWindow.new
window.show

これらの基本的な要素を組み合わせることで、様々な種類のゲームを作成することができます。

●Gosuの詳細な使い方

ここでは、ゲーム作成の中核となる、画像の操作、音楽とサウンド、キーボードとマウスの入力というGosuの基本的な機能について深く掘り下げてみましょう。

○画像の操作

画像を扱うためには、Gosu::Imageクラスを使います。

下記のコードでは、Gosu::Image.newメソッドを使って画像ファイルを読み込み、drawメソッドでウィンドウに表示しています。

require 'gosu'

class GameWindow < Gosu::Window
  def initialize
    super 640, 640
    self.caption = "My First Game"
    @image = Gosu::Image.new("ruby.png") # ruby.pngという画像ファイルを用意してください
  end

  def update
  end

  def draw
    @image.draw(320, 320, 0)
  end
end

window = GameWindow.new
window.show

このコードを実行すると、ウィンドウの中心にruby.pngという画像が表示されます。

画像の位置や大きさ、回転角度などを変えることで、さまざまな演出を作ることができます。

○音楽とサウンド

音楽やサウンド効果を使うためには、Gosu::SongとGosu::Sampleクラスを使います。

Gosu::Songは長い音楽を、Gosu::Sampleは短いサウンド効果を再生するのに適しています。

下記のコードでは、Gosu::Song.newとGosu::Sample.newメソッドを使って音楽ファイルとサウンドファイルを読み込み、playメソッドで再生しています。

require 'gosu'

class GameWindow < Gosu::Window
  def initialize
    super 640, 640
    self.caption = "My First Game"
    @song = Gosu::Song.new("music.wav") # music.wavという音楽ファイルを用意してください
    @sound = Gosu::Sample.new("sound.wav") # sound.wavというサウンドファイルを用意してください
  end

  def update
    @song.play if !@song.playing?
  end

  def draw
  end

  def button_down(id)
    @sound.play if id == Gosu::KB_SPACE
  end
end

window = GameWindow.new
window.show

このコードを実行すると、音楽が自動的に再生され、スペースキーを押すとサウンドが再生されます。

○キーボードとマウスの入力

キーボードやマウスの入力を受け取るためには、button_downメソッドだけでなく、button_upメソッドやbutton_down?メソッドも利用できます。

下記のコードでは、button_downメソッドでスペースキーが押されたときにサウンドを再生し、button_upメソッドでスペースキーが離されたときに音楽を一時停止し、button_down?メソッドでマウスの左ボタンが押されている間、画像を表示しています。

require 'gosu'

class GameWindow < Gosu::Window
  def initialize
    super 640, 480
    self.caption = "My First Game"
    @song = Gosu::Song.new("music.wav")
    @sound = Gosu::Sample.new("sound.wav")
    @image = Gosu::Image.new("ruby.png")
  end

  def update
    @song.play if !@song.playing? && !@paused
    @image.draw(mouse_x, mouse_y, 0) if button_down?(Gosu::MS_LEFT)
  end

  def draw
  end

  def button_down(id)
    @sound.play if id == Gosu::KB_SPACE
  end

  def button_up(id)
    if id == Gosu::KB_SPACE
      @paused = !@paused
      @song.pause if @paused
    end
  end
end

window = GameWindow.new
window.show

これで、RubyとGosuを使ったゲーム作成の基本的な部分はカバーできました。

●RubyとGosuを使ったゲームの作成例

RubyとGosuの基本的な使い方を学んだところで、それらの要素を組み合わせて実際のゲームを作ってみましょう。

まずは、シンプルなシューティングゲームから始めてみましょう。

○簡単なシューティングゲームの作成

下記のコードは、宇宙船が弾を発射して敵を倒す、基本的なシューティングゲームの例です。

敵が画面から出ていくと新たな敵が生成され、スペースキーを押すと弾が発射されます。

require 'gosu'

class GameWindow < Gosu::Window
  def initialize
    super 640, 480
    self.caption = "My First Game"
    @player = Player.new(self)
    @enemies = Array.new
    @bullets = Array.new
  end

  def update
    @player.move
    if button_down?(Gosu::KB_SPACE)
      @bullets << Bullet.new(self, @player.x, @player.y)
    end
    @bullets.each { |bullet| bullet.move }
    @bullets.reject! { |bullet| bullet.y < 0 }
    if rand(100) < 4 && @enemies.size < 5
      @enemies.push(Enemy.new(self))
    end
    @enemies.each { |enemy| enemy.move }
    @enemies.reject! { |enemy| enemy.y > self.height }
    @bullets.each do |bullet|
      @enemies.reject! do |enemy|
        Gosu.distance(bullet.x, bullet.y, enemy.x, enemy.y) < 50
      end
    end
  end

  def draw
    @player.draw
    @enemies.each { |enemy| enemy.draw }
    @bullets.each { |bullet| bullet.draw }
  end
end

class Player
  # プレイヤーのクラスは省略しますが、適切なコードを書く必要があります
end

class Enemy
  # 敵のクラスは省略しますが、適切なコードを書く必要があります
end

class Bullet
  # 弾のクラスは省略しますが、適切なコードを書く必要があります
end

window = GameWindow.new
window.show

このコードでは、Playerクラス、Enemyクラス、Bulletクラスを使ってゲームの構成要素を作り出しています。

それぞれのクラスには、適切なイメージを表示するコードと移動するコードが必要です。

○簡単なパズルゲームの作成

下記のコードは、ブロックを動かして特定の位置に揃える、基本的なパズルゲームの例です。

キーボードの矢印キーでブロックを上下左右に動かし、全てのブロックが正しい位置に揃ったらゲームが終了します。

require 'gosu'

class GameWindow < Gosu::Window
  def initialize
    super 640, 480
    self.caption = "My First Game"
    @blocks = Array.new(4) { |i| Block.new(self, i * 100, i * 100) }
    @target_positions = Array.new(4) { |i| [i * 100, i * 100] }
  end

  def update
    @blocks.each do |block|
      if button_down?(Gosu::KB_LEFT) && block.can_move_left?
        block.move_left
      elsif button_down?(Gosu::KB_RIGHT) && block.can_move_right?
        block.move_right
      elsif button_down?(Gosu::KB_UP) && block.can_move_up?
        block.move_up
      elsif button_down?(Gosu::KB_DOWN) && block.can_move_down?
        block.move_down
      end
    end
    if @target_positions.all? { |pos| @blocks.any? { |block| block.at_position?(pos) } }
      close
    end
  end

  def draw
    @blocks.each { |block| block.draw }
  end
end

class Block
  # ブロックのクラスは省略しますが、適切なコードを書く必要があります
end

window = GameWindow.new
window.show

このコードでは、Blockクラスを使ってゲームの構成要素を作り出しています。

Blockクラスには、適切なイメージを表示するコードと移動するコードが必要です。

●注意点と対処法

RubyとGosuを使ってゲームを作る上で注意すべきいくつかのポイントがあります。

その中で最も重要なのはエラーハンドリングです。

特に初心者の段階では、コード中に予期せぬエラーが生じる可能性があります。

例えば、画像や音声ファイルを読み込む際には、ファイルが存在しない、あるいはパスが間違っているとエラーが発生します。

このようなエラーを回避するためには、ファイルを読み込む前にその存在を確認するコードを書くと良いでしょう。

if File.exist?("image.png")
  @image = Gosu::Image.new("image.png")
else
  puts "画像ファイルが見つかりません"
end

このコードでは、「File.exist?」メソッドを使用して、画像ファイルが存在するかどうかを確認しています。

ファイルが存在する場合は、そのファイルをGosu::Image.newメソッドで読み込みます。

ファイルが存在しない場合は、エラーメッセージを出力します。

また、Gosuを使用してゲームを作る際には、ゲームのパフォーマンスを最適化することも重要です。

特に、大量のオブジェクトを同時に描画する場合や、複雑な計算を頻繁に行う場合には、ゲームの動作が遅くなる可能性があります。

そのような状況を避けるためには、不要なオブジェクトの削除、計算の最適化、オブジェクトの再利用など、いくつかのテクニックを用いることが可能です。

@bullets.reject! { |bullet| bullet.y < 0 }

このコードでは、「reject!」メソッドを使用して、画面外に出た弾のオブジェクトを配列から削除しています。

このように、不要になったオブジェクトを適切に管理することで、ゲームのパフォーマンスを向上させることが可能です。

●カスタマイズの方法

一度基本的なゲームを作成できると、次はそのゲームを自分自身のオリジナルにカスタマイズしていく楽しみが待っています。

例えば、キャラクターや背景のグラフィックを変更したり、BGMや効果音を追加したり、ゲームのルールを改変したりすることで、自分だけのユニークなゲームを作り上げることができます。

RubyとGosuを使用したゲーム作成では、Gosu::ImageクラスとGosu::Sampleクラスを活用することで、それらのカスタマイズが可能となります。

たとえば、次のようなコードを書くことで、オリジナルの画像や音声をゲームに組み込むことができます。

@background_image = Gosu::Image.new("my_background.png")
@character_image = Gosu::Image.new("my_character.png")
@bgm = Gosu::Sample.new("my_bgm.wav")
@bgm.play

このコードでは、最初にオリジナルの背景画像とキャラクター画像を読み込んでいます。

その後、自分で作成したBGMを読み込み、その音声を再生します。

この例では、”my_background.png”、”my_character.png”、”my_bgm.wav”というファイルがプロジェクトのディレクトリ内に存在していることを前提としています。

さらに、ゲームのルールをカスタマイズするためには、主にupdateメソッドとdrawメソッドの中身を変更します。

例えば、キャラクターの移動速度を変更したり、敵キャラクターの出現頻度を変更したり、ゲームの難易度を調整したりすることができます。

def update
  @character.move_speed = 10 if Gosu.button_down? Gosu::KB_SHIFT
end

このコードでは、Shiftキーが押されている間だけキャラクターの移動速度を上げています。

このように、updateメソッドをカスタマイズすることで、ゲームの動作を自由に変更することができます。

まとめ

RubyとGosuを使用したゲーム作成に挑戦した初心者の皆さん、お疲れ様でした。

今回のガイドでは、ゲーム作成の基礎からカスタマイズ方法まで、たった10のステップで学びました。

最初に、RubyとGosuのインストール方法を学び、次にゲームウィンドウを表示する基本的なコードを書きました。

その後、キャラクターや背景の表示、キーボード操作の取得、ゲームの更新と描画というゲーム作成の基本的なフローを理解しました。

また、注意点としてエラーメッセージの読み方とその対処法についても学びました。

それぞれのエラーが何を示しているのか理解することで、問題解決のスキルも身につけることができました。

最後に、自分だけのゲームを作り上げるためのカスタマイズ方法について学びました。

自分で画像や音声を作成し、それをゲームに組み込む方法や、ゲームのルールを変更する方法を学びました。

これまでの学習を通じて、あなたもRubyとGosuを用いてゲームを作る楽しさを体験できたことでしょう。

これらの知識を元に、更に自分だけのオリジナルゲームを作っていきましょう。

あなたの創造力と技術力を組み合わせて、世界に一つだけのゲームを作り上げてください。

これからもプログラミングの旅を続けるあなたに、更なる成功が訪れることを祈っています。

RubyとGosuでゲーム作成に挑戦し、その楽しさを体験する一歩を踏み出したあなたに、心からの拍手を送ります。