Star Ruby Ruby extension library for creating 2D games

サンプル解説

チュートリアルにかかれている知識を前提とします。

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 メソッドで、各要素をカンマ (",") で結合して、それを文字列として描画します。

以下、方向キーではないボタンに対してもまったく同様のことをしています。

© Copyright 2010 Hajime Hoshi