Module | MyGame |
In: |
mygame/lib/mygame/scene.rb
mygame/lib/mygame.rb |
Copyright: | Copyright (C) Dan Yamamoto, 2007. All rights reserved. |
License: | Ruby ライセンスに準拠 |
MyGame は Ruby/SDL をラップしたゲーム開発用のライブラリです。 「シンプルなゲーム開発」を目指して開発されています。
イベント処理を追加します。 event はシンボルで指定します。
# マウスを動かしたときに発生するイベントを登録する例 MyGame.add_event(:mouse_motion) {|event| puts "x:#{event.x} y:#{event.y}" }
event に指定できるシンボルには次のものがあります。
参考: www.kmc.gr.jp/~ohai/rubysdl_ref.html (SDL::Event2の部分)
# File mygame/lib/mygame.rb, line 890 def add_event(event, key = nil, &block) @@events[event] || raise("unknown event type `#{event}'") key ||= block.object_id @@events[event][key] = block key end
背景色を取得します。
MyGame.background_color # => [0, 0, 0]
# File mygame/lib/mygame.rb, line 843 def background_color @@background_color end
背景色を設定します。 設定したい色の RGB 値を配列として与えます。デフォルト値は黒 [0, 0, 0] です。
MyGame.background_color = [0, 0, 255] # 背景色を青に設定
# File mygame/lib/mygame.rb, line 853 def background_color=(color) @@background_color = color end
スクリーンを生成します。 デフォルトでは 640x480 のスクリーンが生成されます。
以下のサンプルは 320x240 のスクリーンを生成する例です。
require 'mygame' MyGame.create_screen 320, 240 # 320 × 240 のスクリーンを生成 MyGame.main_loop do MyGame.Image.render "sample.bmp" end
mygame/boot をロードするとデフォルトのスクリーンサイズ 640x480 でスクリーンが生成されます。 mygame/boot で自動的に生成されるスクリーンのサイズを変更したい場合は、 次のようにスクリーンサイズを設定してください。
DEFAULT_SCREEN_W, DEFAULT_SCREEN_H = 320, 240 require 'mygame/boot' main_loop do Image.render "sample.bmp" end
※ mygame/boot をロードした場合は自動的に create_screen が呼ばれます。
# File mygame/lib/mygame.rb, line 731 def create_screen(screen_w = (defined?(DEFAULT_SCREEN_W) && DEFAULT_SCREEN_W) || 640, screen_h = (defined?(DEFAULT_SCREEN_H) && DEFAULT_SCREEN_H) || 480, bpp = 16, flags = SDL::SWSURFACE) init unless @@ran_init @@ran_create_screen = true screen = SDL.set_video_mode(screen_w, screen_h, bpp, flags) def screen.update(x = 0, y = 0, w = 0, h = 0) self.update_rect x, y, w, h end @@screen = screen end
MyGame を初期化します。
※ mygame/boot をロードした場合は自動的に呼ばれます。
# File mygame/lib/mygame.rb, line 692 def init(flags = SDL::INIT_AUDIO | SDL::INIT_VIDEO) raise if SDL.inited_system(flags) > 0 @@ran_init = true init_events SDL.init flags SDL::Mixer.open if flags & SDL::INIT_AUDIO SDL::Mixer.allocate_channels(16) SDL::TTF.init end
イベントを初期化します。このメソッドを実行すると登録されているイベントはすべてクリアされます。
# File mygame/lib/mygame.rb, line 916 def init_events Events.each {|e| @@events[e] = {} } add_event(:quit, :close) { @@loop_end = true } add_event(:key_down, :close) {|e| @@loop_end = true if e.sym == Key::ESCAPE } @@press_last_key = {} end
キー入力のチェックを行います。 使用できるキーシンボルについては MyGame::Key を参照してください。
次のプログラムはスペースキーが押されている間 puts が実行されます。
MyGame.mian_loop do puts "押された!" if key_pressed?(MyGame::Key::SPACE) end
# File mygame/lib/mygame.rb, line 933 def key_pressed?(key) SDL::Key.press?(key) end
メインループを実行します。 メインループ内で実行する処理をブロックで記述します。
require 'mygame/boot' main_loop do # ループ処理 Font.render "Hello, World" end
ブロックで渡したループ処理は秒間 60 回呼ばれます。 つまりデフォルトでは秒間60フレームでループ処理が実行されます。
require 'mygame/boot' ct = 0 main_loop do Font.render ct ct += 1 # 1秒間に 60 回加算される end
# File mygame/lib/mygame.rb, line 763 def main_loopmain_loop(fps = 60) create_screen unless @@ran_create_screen @@ran_loop = true @@fps = fps @@real_fps = 0 do_wait = true @@count = 0 @@tm_start = @@ticks = SDL.get_ticks until @@loop_end poll_event if block_given? screen.fillRect 0, 0, screen.w, screen.h, background_color if background_color yield screen end sync(@@fps) if do_wait screen.flip end end
新規キー入力のチェックを行います。 使用できるキーシンボルについては MyGame::Key を参照してください。
MyGame.mian_loop do puts "押された!" if new_key_pressed?(MyGame::Key::SPACE) end
# File mygame/lib/mygame.rb, line 945 def new_key_pressed?(key) flag = @@press_last_key[key] == false && SDL::Key.press?(key) @@press_last_key[key] = SDL::Key.press?(key) flag end
イベント処理を削除します。
# マウスを動かしたときに発生するイベントを削除 MyGame.remove_event(:mouse_motion)
# File mygame/lib/mygame.rb, line 903 def remove_event(event, key=nil) if key @@events[event].delete(key) else @@events[event].each {|key, | @@events[event].delete(key) } end end