«前の日記(2008年 05月25日(Sun)) 最新 次の日記(2008年 05月27日(Tue))» 編集

日記のような何か

2002|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|08|09|10|11|12|
2020|01|02|03|04|06|07|08|09|10|11|12|
2021|01|02|03|04|05|07|08|10|11|12|
2022|01|02|03|04|05|06|07|08|10|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

ようこそいらっしゃいました。
あなたは今日人目、合計人目のお客様です(ちなみに昨日は人のお客様がいらっしゃいました)。
よろしければツッコミに足跡等を残していって下さいな。

My status ← skypeやってます。


2008年 05月26日(Mon) [長年日記]

_ [ruby][プログラム]Ruby/SDLのラッパーMyGameを試してみる

MyGameはRubyで簡単にゲームを作るために作られたRuby/SDLのラッパーだそうだ。

参考) Ruby でゲーム開発 - MyGame

とりあえず使ってみようってことでインストールした後にサンプルページを見ながら遊んでみた。

まずは仮のウィンドウ生成。

require 'mygame/boot'

と書くだけ。これで640×480のウィンドウが生成される。簡単だ。

mygame/bootを使わず、自分でいろいろカスタマイズをしたい時は

require 'mygame'
include MyGame
init_game 640, 480

loop_game

という感じで書けば良いらしい。……ってあれ? init_gameなんてメソッドはねぇよ!って怒られた。そんな馬鹿な。よく見るとサンプルページには

※情報が古いことがありますのでご注意ください。

って書いてあった。そうか古いのか。

こういう時はリファレンス見るに限る。……って本当にinit_gameが無い。どうやら代わりにcreate_screen呼ぶと良いらしい。

ところでcreate_screenの説明のサンプルではinitが呼ばれていないんだが、initって何時呼ぶんだ? ソース見たらcreate_screen内部でinit呼んでるかどうかチェックして、自動的に呼び出すようになってた。なるほど解決。

さて上で作られてるウィンドウは背景が黒なので白にしてみたい。リファレンス見るとbackground_colorとbackground_color=が定義されていた。というわけで書いてみる。

require 'mygame'
include MyGame
create_screen 640, 480
background_color = [255, 255, 255]
main_loop

あれ? 背景黒のままだ。ソース見てみるか。

ふむ、main_loopの中に

if block_given?
  screen.fillRect 0, 0, screen.w, screen.h, background_color if background_color
  yield screen
end

ってコードがあった。どうもmain_loopにブロックを与えないとfillRectしてくれないようだ。

しかしそれでも背景が白にならない。何故だろうと思ってリファレンス眺めてたらset_background_colorってメソッドがあった。試しに使ってみるか。

require 'mygame'
include MyGame
create_screen 640, 480
set_background_color [255, 255, 255]
main_loop{}

おお! 白くなった、白くなった。そうするとset_background_colorとbackground_color=って何が違うんだろう? って話になる。中身見てみるか。

  • background_color=
def background_color=(color)
  @@background_color = color
end
  • set_background_color
def set_background_color(color)
  self.background_color = color
end

一見ただのリネームに見えるが??? むむむ、これはかの有名なクラス変数の落とし穴か。どうやら@@background_colorとbackground_colorメソッドが指しているものが違うよう。ややこしくて良く分かっていないけど。

ま、Rubyではあまりクラス変数使わない方が良いんだろうな。

といったところでとりあえず終了。まあRuby/SDLをそのままいじるよりは楽そうだけどドキュメントが少ないのでリファレンスとソースを交互に見ながらじゃないとなかなか使いこなせないような感触。

本日のツッコミ(全1件) [ツッコミを入れる]
_ dan5 (2008年 05月27日(Tue) 10:58)

background_color = [255, 255, 255] で白くならないのは、ローカル変数の代入となってしまうためです。MyGame.background_color = [255, 255, 255] と書くと意図する結果になると思います。


Googleカスタム検索

my recommend books