チュートリアルにかかれている知識を前提とします。
helloworld.rb
Hello, World! と表示するだけの簡単なサンプルです。
#!/usr/bin/env ruby
require "starruby"
include StarRuby
font = Font.new("fonts/ORANGEKI", 12)
white = Color.new(255, 255, 255)
Game.run(320, 240, :title => "Hello, World!") do |game|
# 終了処理
break if Input.keys(:keyboard).include?(:escape)
game.screen.clear
game.screen.render_text("Hello, World!", 8, 8, font, white)
end
終了処理
ESC キーを押したときに、ゲームを終了するようにしています。
Input.keys(:keyboard) で、現在押されているキーボードのキーの配列を取得します。
ESC キーが押されているときは配列に :escape が含まれているので、
含まれていたら break でゲームを終了させます。
audio.rb
BGM や SE の再生サンプルです。
#!/usr/bin/env ruby
require "starruby"
include StarRuby
font = Font.new("fonts/ORANGEKI", 12)
white = Color.new(255, 255, 255)
music_texture = Texture.load("images/music")
sound_texture = Texture.load("images/sound")
bgm_position = 0
Game.run(320, 240, :title => "Audio") do |game|
# music_alpha 変数
music_alpha = Audio.playing_bgm? ? 255 : 128
sound_alpha = 128
# 入力中のキーの取得
keys = Input.keys(:keyboard, :duration => 1)
break if keys.include?(:escape)
# m キーが押された場合
if keys.include?(:m)
if Audio.playing_bgm?
bgm_position = Audio.bgm_position
Audio.stop_bgm
else
Audio.play_bgm("sounds/music",
:position => bgm_position)
end
end
# s キーが押された場合
if keys.include?(:s)
Audio.play_se("sounds/hello")
sound_alpha = 255
end
s = game.screen
s.clear
# BGM アイコンの描画
s.render_texture(music_texture, 16, 16,
:alpha => music_alpha,
:scale_x => 4,
:scale_y => 4)
# BGM の説明の描画
text = "Press 'm' to #{Audio.playing_bgm? ? 'stop':'play'} music"
s.render_text(text, 96, 32, font, white)
# SE アイコンの描画
s.render_texture(sound_texture, 16, 80,
:alpha => sound_alpha,
:scale_x => 4,
:scale_y => 4)
# SE の説明の描画
s.render_text("Press 's' to play sound", 96, 96, font, white)
if 0 < Audio.playing_se_count
# 現在再生中の SE の数の描画
s.render_text("Now #{Audio.playing_se_count} SEs are playing", 96, 112, font, white)
end
end
music_alpha 変数
このサンプルでは画像を二種類表示します。 BGM のアイコンと SE のアイコンです。
変数 music_alpha は BGM のアイコンのα値を表します。
再生中は 255 (不透明) で、再生していないときは 128 (半分透明) です。
下の sound_alpha 変数も同様です。
入力中のキーの取得
Input.keys メソッドを使って、現在押されているキーボードのキーを取得します。
Input.keys メソッドは第 2 引数としてハッシュをとることができます。
ところで、 Ruby のハッシュリテラルには中括弧がいるはずなので、きちんと書くと次のようになります。
Input.keys(:keyboard, {:duration => 1})
Ruby は関数呼び出しの最後の引数がハッシュだった場合、中括弧を省略して書けるので、 結局次のように書けます。
Input.keys(:keyboard, :duration => 1)
Input.keys は、デフォルトでは「そのとき押されていれば押されている」と判断されます。
今回は :duration => 1 という指定がありますが、これは
「押しっ放しにしても『押された』と判断するのは最初の 1 フレームだけ」
という意味の指定になります。
文章で説明するのは難しいので、実際に :duration の数値をあれこれ
変えて変化を見ることをおすすめします。
詳しくは Input モジュールのリファレンスを参照してください。
m キーが押された場合
m キーが押された場合、 BGM が再生していたら現在の再生位置 (Audio.bgm_position メソッド) を記録して
(bgm_position 変数) おいて停止します (Audio.stop_bgm メソッド)。
BGM が再生していなかったら、 現在保存している BGM の再生位置から再生を再開します (Audio.play_bgm メソッド) 。
s キーが押された場合
s キーが押された場合、 SE を再生して (Audio.play_se メソッド)、
sound_alpha 変数を 255 (不透明) にします。
次のフレームですぐ 128 になるので、不透明になるのは一瞬だけです。
gamepad.rb
ゲームパッドの入力状態を表示するサンプルです。
#!/usr/bin/env ruby
require "starruby"
include StarRuby
font = Font.new("fonts/ORANGEKI", 12)
white = Color.new(255, 255, 255)
Game.run(320, 240, :title => "Gamepad") do |game|
break if Input.keys(:keyboard).include?(:escape)
s = game.screen
s.clear
# キー取得
keys = Input.keys(:gamepad)
s.render_text("Directions:", 8, 8, font, white)
# 方向キーだけ抽出して文字列配列に変換
directions = keys.select{|b| b.kind_of?(Symbol)}.map{|b|b.to_s}
# 方向キー配列の描画
s.render_text(directions.join(","), 24, 24, font, white)
s.render_text("Buttons:", 8, 48, font, white)
buttons = keys.select{|b| b.kind_of?(Integer)}.map{|b|b.to_s}
s.render_text(buttons.join(","), 24, 64, font, white)
end
キー取得
Input.keys(:gamepad) で、ゲームパッドの現在押されているキーの配列を取得します。
Input.keys メソッドの第一引数によって、入力デバイスを区別します。
| キー | 値 |
|---|---|
:keyboard | キーボード |
:gamepad | ゲームパッド |
:mouse | マウス |
配列に入っている値は、 Input モジュールのリファレンスを参照してください。 基本的に値は Symbol ですが、ゲームパッドの場合はボタンは数値 (Integer) も入りえます。
方向キーだけ抽出して文字列配列に変換
先ほど取得したキーの配列は、「方向キーが Symbol、ボタンが数値 (Integer)」という値の配列になっています。 ここから方向キーだけ取り出すことをやっているのですが、ちょっと複雑かもしれません。 が、順を追っていけば難しくはないです。
keys
単なる配列です。
keys.select{|b| (条件文)}
Array クラスの select メソッド (略記すると Array#select) を使って、
keys 配列の中から、条件文が真になるものだけを
抽出した新しい配列を取得します。
元の keys 配列はまったく影響を受けません。
keys.select{|b| b.kind_of?(Symbol)}
keys 配列で、要素が Symbol であるもののみを抽出した新しい配列を取得します。
keys.select{|b| b.kind_of?(Symbol)}.map{|b| (変換式)}
Array#map メソッドを利用して、先ほど取得した「Symbol オブジェクトだけの配列」に、
変換式をかました新しい配列を取得します。
keys.select{|b| b.kind_of?(Symbol)}.map{|b| b.to_s}
先ほど取得した「Symbol オブジェクトだけの配列」を、さらに要素ごとに文字列 (String) に変換します。
かくして、最初に取得したキーの配列 keys から、方向キー (Symbol) だけ抽出し、
さらに各要素を文字列 (String) に変換した配列を取得できました。
(書いてて思ったのですが、別に文字列変換してやる必要はありませんでした。)
方向キー配列の描画
Array#join メソッドで、各要素をカンマ (",") で結合して、それを文字列として描画します。
以下、方向キーではないボタンに対してもまったく同様のことをしています。