ゲーム実装で身に付くプログラミング 9

背景色を反映する

背景色を反映する

ここで、このゲームのテーマでもある背景色を、色ブロックをクリックして混色することで表現します(図5)。背景色の計算は、@rgb配列の最も大きい要素を基準とします。例えば赤が5で最大なら、(r,g,b)=(255*5/5, 255*3/5, 255*2/5)のように計算します。

図5:背景色を反映

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

require 'gosu'
require_relative 'ColorBlock'

class Game < Gosu::Window
  def initialize
(中略)
  end
  
  def init
    @rgb = [1,1,1]
    while @rgb[0] == @rgb[1]
      @rgb[0] = rand(0...@stage)
      @rgb[1] = rand(0...@stage)
      @rgb[2] = rand(0...@stage)
    end
    @colors = []
    for i in 0...@stage*3
      @colors << ColorBlock.new(i%3)
    end
  end

  def update
(中略)
  end

  def bg_color
    indices = @rgb.each_with_index
             .sort_by { |value, index| -value }
             .map { |value, index| index }
    i = 255/@rgb[indices[0]]
    r = @rgb[0]*i
    g = @rgb[1]*i
    b = @rgb[2]*i
    Gosu.draw_rect(0, 0, self.width, self.height, Gosu::Color.new(255,r,g,b), 0)
  end

  def draw
    bg_color()
    case @game_state
    when :title
      img = @images[3]
      img.draw((1800-img.width)/2,(900-img.height)/2,1)
    when :main_loop
      @colors.each do |c|
        @images[c.col].draw(c.x, c.y, 1)
      end
    when :game_over
      img = @images[4]
      img.draw((1800-img.width)/2,(900-img.height)/2,1)
    end
  end

  def button_down(id)
(中略)
  end
end

Game.new.show

【サンプルコードの解説】
「init」メソッドで@rgb配列の各要素をランダムな整数にセットします。
「bg_color」メソッドで@rgb配列を降順にソートし、そのインデックス番号の配列をindices変数に代入します。
最も大きい要素を基準に(r,g,b)の各色を算出し、ウィンドウ全体を塗り潰します。
「draw」メソッドでbg_colorメソッドを呼び出します。

ステージクリア画面を表示する

仕上げとして、ステージクリア処理をします。背景色が真っ白になったらステージクリア画面を表示し(図6)、ステージクリア画面をクリックするとメインループに遷移します。

図6:ステージクリア画面を表示

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

require 'gosu'
require_relative 'ColorBlock'

class Game < Gosu::Window
  def initialize
(中略)
  end
  
  def init
(中略)
  end

  def update
(中略)
  end

  def bg_color
    indices = @rgb.each_with_index
             .sort_by { |value, index| -value }
             .map { |value, index| index }
    i = 255/@rgb[indices[0]]
    r = @rgb[0]*i
    g = @rgb[1]*i
    b = @rgb[2]*i
    Gosu.draw_rect(0, 0, self.width, self.height, Gosu::Color.new(255,r,g,b), 0)
    if r == g && g == b && @game_state == :main_loop
      @game_state = :stage_clear
      @sounds[2].play()
    end
  end

  def draw
    bg_color()
    case @game_state
    when :title
      img = @images[3]
      img.draw((1800-img.width)/2,(900-img.height)/2,1)
    when :main_loop
      @colors.each do |c|
        @images[c.col].draw(c.x, c.y, 1)
      end
    when :game_over
      img = @images[4]
      img.draw((1800-img.width)/2,(900-img.height)/2,1)
    when :stage_clear
      img = @images[5]
      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()
        init()
      when :main_loop
        @colors.each do |c|
          if c.click(mouse_x,mouse_y) == true
            c.x = 100000
            @rgb[c.col] += 1
            @sounds[3].play()
            return
          end
        end
      when :game_over
        @game_state = :title
      when :stage_clear
        @game_state = :main_loop
        @stage  += 1
        init()
      end
    end
  end
end

Game.new.show

【サンプルコードの解説】
bg_colorメソッドで、r・g・bの各変数が同じ数値になり、ゲーム状態がメインループならゲーム状態をステージクリアにセットし、サウンドを再生します。
drawメソッドでは、ゲーム状態がステージクリアの時にその画像を描画します。
button_downメソッドでは、ゲーム状態がステージクリアの時にクリックするとゲーム状態をメインループにセットし、@stageプロパティをインクリメントします。

【コラム】パソコンの発明

パソコンがなかったら、絵も下手だし、音楽の才能もないし、運動も体が故障だらけだし、ちょっと勉強ができただけでした。…と思いましたが、それなら筆者がパソコンを発明していれば良かったのですね。

おわりに

今回はプログラミング言語「Ruby」の「Gosu」ライブラリで「Color」ゲームを開発しました。今までで一番シンプルにプログラミングできたのではないでしょうか。

やはりシンプルなゲーム開発が、プログラミング習得の一番の近道なのではないかと思います。

人気記事トップ10

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

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