ミニゲームキット

DXRubyはちょっとしたものを簡単に作れるライブラリであるからして、とりあえずrequire 'dxruby'してWindow.loop do endでガシガシとコードを書いていけば動くものが作れる。

例えば、ちょっとしたコードでなんか作る。

require 'dxruby'

class Enemy < Sprite
  def update
    self.y += 4
    self.vanish if self.y > 480
  end
end

Window.caption = "豆腐避けゲームSpecialEdition"

image = Image.new(32, 32, C_WHITE)
enemy = []
mychar = Sprite.new(300, 400, image)

Window.loop do
  break if mychar === enemy
  enemy.push(Enemy.new(rand * 600, -32, image))
  mychar.x += Input.x * 4
  mychar.y += Input.y * 4
  Sprite.update(enemy)
  Sprite.clean(enemy)
  mychar.draw
  Sprite.draw(enemy)
end

これはちょー面白い。ミニゲームだけどみんなドハマリして睡眠不足が続くに違いない。

しかしタイトルもゲームオーバー画面も無いようなものをリリースするのは恥ずかしい。とは言ってもそのためにSceneクラスとか作ってどうのこうのは面倒だよなあ。
そんな時にはこれ、ミニゲームキット。

使い方は簡単。requireして、ゲームの初期化部分の先頭にWindow.minigame doを書いて、コードの最後にendを書くだけ。

require 'dxruby'
require './minigamekit' # これ

class Enemy < Sprite
  def update
    self.y += 4
    self.vanish if self.y > 480
  end
end

Window.caption = "豆腐避けゲームSpecialEdition"

Window.minigame do # これ

image = Image.new(32, 32, C_WHITE)
enemy = []
mychar = Sprite.new(300, 400, image)

Window.loop do
  break if mychar === enemy
  enemy.push(Enemy.new(rand * 600, -32, image))
  mychar.x += Input.x * 4
  mychar.y += Input.y * 4
  Sprite.update(enemy)
  Sprite.clean(enemy)
  mychar.draw
  Sprite.draw(enemy)
end

end # これ

これだけでなんとタイトルとゲームオーバー画面がゲームの動作に追加されるのだ。ミニゲームキットでキミも自作ゲームにタイトルとゲームオーバーを付けて公開しよう。

require 'dxruby'

def Window.minigame
  Kernel.loop do
    yield

    240.times do
      exit if Input.update
      str_width = @minigame_font.get_width("GAME OVER")
      Window.draw_font(Window.width / 2 - str_width / 2,
                       Window.height / 2 - @minigame_font.size / 2,
                       "GAME OVER",
                       @minigame_font)
      Window.sync
      Window.update
    end
  end
end

def Window.loop
  if !@minigame_create_flag
    Window.create
    @minigame_create_flag = true
    @minigame_font = Font.new(32)
    @minigame_title_font = Font.new(Window.height / 4)
  end

  Kernel.loop do
    temp = Input.keys
    Kernel.loop do
      exit if Input.update
      break if Input.keys != temp
      str_width = @minigame_title_font.get_width(Window.caption)
      x = Window.width / 2 - str_width / 2
      x = 0 if x < 0
      Window.draw_font_ex(x,
                          Window.height / 4,
                          Window.caption,
                          @minigame_title_font,
                          scale_x:(x > 0 ? 1 : Window.width.quo(str_width)),
                          center_x:0,center_y:0)

      msg_width = @minigame_font.get_width("PUSH ANY KEY")
      Window.draw_font(Window.width / 2 - msg_width / 2, Window.height * 3 / 4, "PUSH ANY KEY", @minigame_font)
      Window.sync
      Window.update
    end

    Kernel.loop do
      exit if Input.update
      yield
      Window.sync
      Window.update
    end
  end
end