背景色を反映する
背景色を反映する
ここで、このゲームのテーマでもある背景色を、色ブロックをクリックして混色することで表現します(図5)。背景色の計算は、@rgb配列の最も大きい要素を基準とします。例えば赤が5で最大なら、(r,g,b)=(255*5/5, 255*3/5, 255*2/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)、ステージクリア画面をクリックするとメインループに遷移します。
・サンプルコード「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」ゲームを開発しました。今までで一番シンプルにプログラミングできたのではないでしょうか。
やはりシンプルなゲーム開発が、プログラミング習得の一番の近道なのではないかと思います。
この記事をシェアしてください
