Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2006-04-29

むむ

dan5で検索するとこんなに上位にくるのか。mixiの名前変えようかな。

2006-04-27

[MyGame]アニメーションの指定方法案

taro = Image.new('taro.bmp')
taro.disp_size '32x32'
taro.set_anim :left, 15, [0, 1, 2, 1], :loop

taro.start_anim :left
taro.start_anim # 全パタンのループ

taro.set_anim nil, 30

taro.disp_size 32, 32

[:right, :left, :up, :down].each_with_index do |key, i|
  taro.set_anim key, [0 + i, 1 + i, 2 + i, 1 + i], :loop
end
2006-04-27

プログラミング言語の勉強を継続する三つのポイント

これの1つ目と3つ目はなるほどと思います。でも2はちょっと。

自分用に2を修正してみます。

【読む】書くのもよいけれど、読むことも大切。知っていることだけでやりくりせず、書籍やWebで幅広い情報を集めてよりよい解法を見つけよう。他人の書いたソースを読むことも大事。

書くのは楽しいけど、読むのは苦手なんだよなあ。だからみんなが知っている当たり前のことを知らなくて、苦労していることが多い。せっかちでとにかくちょっと読んだら書かずにはいられない性格なんです。勉強会に来るような人たちにこういうタイプはいないようですが。

2006-04-25

[tDiary] 「最近のツッコミ」

と「最近のTrackBack」を表示するようにしてみた。

2006-04-24

ぐーたらしてない日記の class Task

メモ。きれいなコードなので理解しやすい。

  • タスク生成時に与えたプライオリティを考慮したタスク同士の双方向リンク
  • run メソッド経由でメソッドを実行(メソッド名をシンボルで与える)することにより任意のメソッドを子タスクもろとも実行可能
  • run_down はプライオリティを逆にして実行
  • タスクの検索機能
  • 木構造のダンプ機能

小さな実装なのに実用的ぽくてすばらしい。id にはシンボルも使いたいかも。

2006-04-23

起動しなくなったgp6(gentoo)はファイルシステムが壊れていた

クローゼットの奥から引っ張り出してディスプレイにつないでみたら、ファイルシステムが壊れているといわれてブートしない。

面倒なのでDebianを新規インストールしちゃおうかなと思ったけど「バカが征く on Rails」が入ったままだ。あれは開発環境をそのまま公開していたのであすこにしかソースがない。Wikiに貼ってあるソースは古いしなあ。と思ってどっかにバックアップとってないかなと思って探してみたら、壊れたマシンのデータを固めたものを10月15日にレンタルサーバーに上げてあった。良くやった過去のオレ。

新しいPCも来たし、これからはちゃんと Subversion でやっていくつもり。

2006-04-22

[開発ログ]lighttpdで動かす

まずlighttpd。

apt-get install libc6/unstable
apt-get install lsb-base/unstable

のあと

apt-get install lighttpd

rcconfでlighttpdの自動を解除。

次にfcgi。

apt-get install libfcgi-dev

のあと、

gem install fcgi

(略)
ERROR:  While executing gem ... (RuntimeError)
    ERROR: Failed to build gem native extension.
Gem files will remain installed in /home/dan/ruby/lib/ruby/gems/1.8/gems/fcgi-0.8.6.1 for inspection.
  ruby extconf.rb install fcgi\nchecking for fcgiapp.h... yes
checking for FCGX_Accept() in -lfcgi... no

うーむ。半日くらい悩む。そうだgemを使わずに普通に入れてみよう。

wget http://sugi.nemui.org/pub/ruby/fcgi/ruby-fcgi-0.8.6.tar.gz
tar xzvf ruby-fcgi-0.8.6.tar.gz
cd ruby-fcgi-0.8.6

ruby install.rb config --without-ext
ruby install.rb setup
ruby install.rb install

--without-extをつけないと結局 gem と同じエラーだった。

config/lighttpd.conf を新しいものに更新して、 public/dispatch.fcgi の先頭のパスを書き換えて

script/server

動いた。

参考

2006-04-22

[開発ログ]上記の環境で jewelmmo をテストしてみる

rm vendor/*

して rake。

34 tests, 87 assertions, 2 failures, 1 errors
94 tests, 817 assertions, 0 failures, 1 errors

あれエラーはこれだけか。テスト用のDBスキーマの作成でミスってたみたいだけど、テーブル定義のTIMESTAMPをDATETIMEに書き換えることで解決した。これならすぐになんとかなりそうだ。

2006-04-22

[開発ログ]野良ビルド ruby 1.8.4 + gem + rails-1.1.2 on Debian のインストールに挑戦

混乱すると嫌なので apt-get したものをあらかじめ消しておく。

apt-get remove rake
apt-get remove rails

/usr/share/rails/ が消滅していることを確認。

まず ruby 1.8.4 。

wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.4.tar.gz
tar xzvf ruby-1.8.4.tar.gz
cd ruby-1.8.4
./configure --prefix=/home/dan/ruby
make
make install

パスを通しておく。

PATH=~/ruby/bin:$PATH ; export PATH

動作確認。

ruby -v
ruby 1.8.4 (2005-12-24) [i686-linux]

次に RubyGems

http://rubyforge.org/frs/download.php/5207/rubygems-0.8.11.tgz
tar xzvf rubygems-0.8.11.tgz
cd rubygems-0.8.11
ruby setup.rb

ここで問題発生。

/home/dan/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:21:in `require__': no such file to load -- zlib (LoadError)
       from /home/dan/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:21:in `require'
       from /home/dan/ruby/lib/ruby/site_ruby/1.8/rubygems/package.rb:9

うーむ。ruby-zlibが必要ぽい。

wget http://www.blue.sky.or.jp/atelier/ruby/ruby-zlib-0.6.0.tar.gz
tar xzvf ruby-zlib-0.6.0.tar.gz
cd ruby-zlib-0.6.0
ruby extconf.rb

すると、

checking for deflateReset() in -lz... no
checking for deflateReset() in -llibz... no
checking for deflateReset() in -lzlib... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details. 

うーむ。解決方法がわからなかった。仕方がないので、激しくダメなことのような気もするけど、

cp /usr/lib/ruby/1.8/i386-linux/zlib.so ~/ruby/lib/ruby/1.8/i686-linux/

と無理やりzlib.soのバイナリファイルをコピーして持ってきてから rubygems をインストール。

cd rubygems-0.8.11
ruby setup.rb

一応インストールは通過した。何か危険なことが起きているかもしれない。

追記(2006/8/18)

apt-get install zlib1g-dev 

してから以下でOK。

cd ruby-zlib-0.6.0
ruby extconf.rb
make
make install

Rails

gem install rails

Successfully installed rails-1.1.2
Successfully installed rake-0.7.1
Successfully installed activesupport-1.3.1
Successfully installed activerecord-1.14.2
Successfully installed actionpack-1.12.1
Successfully installed actionmailer-1.2.1
Successfully installed actionwebservice-1.1.2
Installing RDoc documentation for rake-0.7.1...
Installing RDoc documentation for activesupport-1.3.1...
Installing RDoc documentation for activerecord-1.14.2...
Installing RDoc documentation for actionpack-1.12.1...
Installing RDoc documentation for actionmailer-1.2.1...
Installing RDoc documentation for actionwebservice-1.1.2...

10 分くらいかかったが無事終了。

rails test

で動作確認。

2006-04-22

[開発ログ]rails 1.1

新サーバ(arton-pc とかくたにさんはよんでいた)にrailsを入れた。

apt-get install rails/unstable

一応動作したものの test で大量のエラー。railsのバージョンを上げるたびに test のエラーを消すのに一苦労。この際 svn head をとってきてエラーつぶしたほうがいい気も。

Ruby は 1.8.2 のまま。というのは野良ビルドした Ruby 1.8.4 を使うには rake とかを gem なりでインストールする必要があると思うんだけど、 gem はまだ導入してないので。

ところで 1.8.2 + rails ではダメというのは勉強会でも聞いたけど、具体的にどの部分がいけないんだろう。

2006-04-21

ちょっと最近

いろんな事に手を出しすぎてるかなーと思いつつも、やっぱりどれひとつとしてはずせない必須なものだなーと改めて思いつつ、こんな時に限って仕事の方でごたごたがはじまるという(あ、いつものかとか)、まあなんというか、ちゃんと優先順位つけてやるべき事からしっかりひとつずつこなしていかないと。

2006-04-20

[Ruby]Debian に Ruby をソースから入れようとしたが

wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.4.tar.gz
tar xzvf ruby-1.8.4.tar.gz
cd ruby-1.8.4
./configure

とすると、

checking build system type... i686-pc-linux-gnulibc1
checking host system type... i686-pc-linux-gnulibc1
checking target system type... i686-pc-linux-gnulibc1
checking for gcc... gcc
checking for C compiler default output file name... configure: error: C  compiler cannot create executables
See `config.log' for more details.

ちょっと調べたが原因がわからず。

2006-04-20

[開発ログ]DebianのRubyインストール先を確認

とりあえず、開発環境の方でソースからビルドして入れてみようかな思ったけど、その前にどこにインストールされているのか調べてみよう。

$ whereis ruby
ruby: /usr/bin/ruby1.8 /usr/bin/ruby /usr/lib/ruby /usr/share/man/man1/ruby.1.gz

rubyの方はリンクになっている。

lrwxrwxrwx  1 root root     7 Nov 24 15:02 ruby -> ruby1.8
-rwxr-xr-x  1 root root  3504 Oct  1  2005 ruby1.8

/usr 以下にある *.rb を探してみると、

  • /usr/lib/ruby/1.8/
  • /usr/share/rails/

の二カ所で見つかる。 rails 関係のファイルは /usr/share/rails/ にインストールされ、それ以外は /usr/lib/ruby/1.8/ にある模様。

ということはソースから入れれば /usr/local/ 以下に ruby が入って、そっちの ruby を使うようにし、 rails はこのまま /usr/share/ 以下にあるものを使えばいいのではないだろうか。やってみよう。

2006-04-19

[Ruby]どこまでDRY?

なんかこういうコードがDRYでない気がしてくるのですが。

@maxx = screen.w - @image.w
@maxy = screen.h - @image.h
@x = rand(@maxx)
@y = rand(@maxy)
@vx = rand(5) + 5
@vy = rand(5) + 5

じゃあこうするんですか?

[[:x, :w], [:y, :h]].each do |x, w|
  eval "@max#{x} = screen.#{w} - @image.#{w}
       @#{x} = rand(@max#{x})
       @v#{x} = rand(5) + 5"
end

うーむ。

2006-04-19

[Ruby]例外が発生したとき END {} 内で場合分けするには

予期せぬ例外でメインの処理が中断したときに END {} 内の処理を場合分けしたくなった。そういえば test/unit ではどうなっているのだろうと調べると、[ruby-list:41927] にちょうどその話しが。

at_exit do
  unless $! || Test::Unit.run?
    exit Test::Unit::AutoRunner.run
  end
end

なるほど。

気になったので、

begin 
  aaa
rescue NameError
  p $!
ensure
  p $!
end
p $!

を実行すると、

#<NameError: undefined local variable or method `aaa' for main:Object>
nil
nil

となる。

__

あれ、この exit なんで呼んでいるんだろう?

exit Test::Unit::AutoRunner.run
2006-04-19

[開発ログ]DebianでRailsを使うにあたって

今の開発環境は全て Debian の apt-get で構築したもの。

  • ruby 1.8.2 (2005-04-11) [i386-linux]
  • rails 1.0 (たぶん。rails のバージョンを見る方法がわからない)

勉強会でも 1.8.2 じゃなくて 1.8.4 にするものと聞いたので、 1.8.4 にしようと思うものの Debia がよくわからずどうしたらいいものか迷う。

[ruby-list:41909] を見たりもしながら、とりあえずソースからビルドしようかなと思うのだけど、普通にソースからインストールした場合、 今既に入っている ruby 1.8.2 との関係は大丈夫なのかしら。その辺がよくわからないのでとりあえず保留。

__

あと gem 使うかどうかって選択もあるのだけど、 apt-get との共存がどうなるかわからず怖いので gem は使わない方向でいこうかと。

Rails on Debian の最新情報をまとめているところないかな。

2006-04-18

[栽培日誌]種まきと苗木購入

画像の説明

今年も忙しい時期がやってきた。先週おおざっぱな草刈りを行い、昨日苗を買ってきて植え付けた。

この写真には草を必要以上に刈り取らない自然農ぽさが良く出ている。

栽培日誌をはてなかどっかに移行したい。写真を貼りやすい所がいい。

種まき

画像の説明 画像の説明

写真は先週の月曜日に蒔いたもの。今年は多くの種でポッドに挑戦。でも先週雨が多すぎて種が腐ったかも。どうも土の粘土質が高くて水はけが悪い。

苗木

画像の説明 画像の説明

トマト、ナス、キュウリ。トマトとナスは自家製堆肥を先週入れたところに植え付け。キュウリは無肥料で。

写真はトマトの苗木。ここから枯れていくケースがしばしばあるので、目が離せない。たぶん原因は買ってきた苗が温室育ちだったりして弱く、環境の変化に耐えられないことがあるんじゃないかと。だから苗の選定は重要。

去年まで狭い庭にナス科(トマトとかピーマンもナス科)を多く植えていたから、今年はもうほとんど空きスペースが残ってない。ナス科は連作障害が起るから4,5年は同じ場所に植えられないのだ。

品種

画像の説明 画像の説明

今回買ったのはこれ。フジースーパーは扱っている絶対数が少ないけど、ちゃんと品種と生産地と生産者が明記されている。

島忠はその辺ほんとテキトーでダメ。

その他

画像の説明 画像の説明 画像の説明

  • イチゴが花をつけている
  • ブルーベリーはまだ反応がない
  • 今頃去年まいたシュンギクが伸びてきて収穫期。ウマー
  • パセリはもう食べ放題。地植は驚くほど大きくなるのでひと株で良かったな
  • シソの自然発芽はまだなので苗木を一本買った
  • なぜかネギの左の列だけネギ坊主が
  • 小松菜のつぼみは伸びてくるけど最初のころほどは食べられない(やっぱり花を咲かせちゃうからかなあ)。種を採るぶんだけ残してもう刈り取ってよさそう
  • 今年は虫の絶対数が少ない気がする。去年はあんなにテントウムシがいたのに。食害も皆無
  • 秋にまいた大根を食べるのは3月までに。筋が多すぎ
  • アスパラは最初の芽を伸ばしすぎた。こまめに収穫しないと
  • そうそう、ミョウガが芽を出してきた
2006-04-18

[開発ログ]サーバーマシンがやってきた

サーバーマシンが来るかもの続き。

昨日の夜artonさんから頂きました。とあるファミレスまでご足労頂き(ほんとうにありがとうございました)、直接PCを受け取ったのだけど、もう緊張したのなんの。別れた後も小一時間足がガクガクしてた。

幸運なことにファミレスであれこれお話することができた。自分がいまやっていることを一通り話し(mixi経由で日常フットサルと家庭菜園に明け暮れていることもバレバレだった)、ここぞとばかりに例の件を持ち出し、参考になるお話をいっぱい聞くことができた。タイミング良すぎ。

忘れてしまったこと。PCにサインを入れてもらうべきだった!帰りの車の中で気がついた……。くぅっ。あとASRやExerbに関して相談しておけば良かった……。トホホ。

とかなんとか考えながら家に帰ってPCを起動すると、説明の通りもうほんと理想的な状態でDebianのインストールと設定がなされていて、あとはRails関連さえ入れればいつでも投入OKという状態でした。というわけでサーバーPCのハード面については無事に準備完了しました。

2006-04-17

HSPとRuby

もし自分がこれから何も知らないプログラミングをはじめるとして、目の前にHSPとRubyがあったら、100回中の99回はHSPに行くと思う(いやオレのことだから判断を誤ってRubyに行ってしまう確率は高そう……)。

不運にもRubyに行ってしまった場合は、プログラムを書けるようになる前に挫折しているんじゃないかと思う。だってゲーム作りたいだけだから。おそらくはRuby/SDLにたどり着くことは出来ないし、たどりつけてもモロモロの実行環境をインストールできない。最適な言語や処理系にたどり着くまで何度もトライできるかというと、すぐに頭から煙が出てしまうので無理。なんてダメなんだろう。

そういう意味ではやっぱりHSPが興味深いのです。

もちろん今後は大きく変わってくるところだと思います。RailsでRubyはじめる人も多くなるでしょうし。

__

よく考えてなかったけどホームページだけで判断したときの話かな。

2006-04-17

続端末操作

なかださんのツッコミ、そのあとIRCで教えていただいたところによると、どうやら Ruby の標準添付のライブラリで Windows の端末操作を手軽にやるというのは難しげ。

衝撃の事実。Windows2000, XPではエスケープシーケンスが使えない。そう、そうだよ、昔作ったコマンドプロンプトで作った開発ツールを 9x から 2000 に持ってきたら動かなかったんだ。すっかり忘れてた。

2006-04-17

[Ruby]ひさびさに拡張ライブラリの作り方を確認

http://www.namikilab.tuat.ac.jp/~sasada/prog/rb5.html あたりを見る。

__

こんなのどうだろう。

require 'c_eval'

#def test n
#  n.times{}
#end 
c_eval("
  VALUE test(int n){
    volatile int i;
    for(i=0;i<(FIX2INT(n));i++){
    }
    return Qnil;
  }
")

test 0x3ffffff

(c_eval って名前は置いとくとして) c_eval が与えられたコードをコンパイル(前回コンパイルした結果がないまたはコードが変化してれば)して require をする。拡張ライブラリはほとんど書いたことがないんだけど、こうして書けるとある局面では便利だったりするのかなあと思ったもので。

__

最近 Rails のせいで頭がメタメタ。

__

上のc_eval、同名のメソッドは起動後一回しかevalできない気がしてたけど、そんなことないんだよなあ。コードが変化してたらコンパイルしてrequireだから。

最近徐々にメタプログラミングがわかってきたので、これまでの考え方が崩壊しつつあります(なんか前にもそんなことあった気がするけど。脱皮かな)。そっかあ、みんなのRubyはこういうものだったんだね。なんかいろいろ納得。やっぱり最後は「そうではない。君が真に目覚めれば書くまでもない」なのだろうか。

2006-04-17

Rials勉強会東京

新しい発見ばかりで楽しい。もはやRailsの勉強は勉強会だけ。しばらくは忙しそうなのでしかたなし。でも勉強会だけはなんとか欠席せずに出続けたい。

__

お忙しそうな高橋さんの隙をついて某件を相談。ちょっとコンセプトを変えることにした。確かにそのほうがいい。

笹田さんにもお願い。

そのあと某件の会議。先月は仕事で忙しくて、今月は今月で忙しかったものでこの件については初参加。雑用係ということで。

なんかはっきりしない話ばかりだなあ。

そうそう、おぎのさんとかくたにさんに聞いたらやっぱり同じ年だった。

2006-04-16

端末処理

昨日ふつけるを読んでいてという言葉を初めて知った。前からやりたかったんだけどこの当たりの操作をなんて言うのかわからなくて困っていたところだった。

で Ruby にも curses というライブラリがあるのだけど、これ Windows のコマンドプロンプトで使おうと思ったら require できなかった。

寝る前にちょっと調べたんだけど解決方法が見つからず。

2006-04-16

RHGとその後SDLの飲み会

RHG。ふつりなもっと出れば良かった。やっぱりネイティブプログラミング言語がCだったのは幸せだなあ。

そのあとIRCで知ったSDL関係の人たちと秋葉原で飲み。全員初めて会う人たちなんだけど話を聞くとすごーく濃い人たちばっかりでびっくり。ここぞとばかりにSDL関係の疑問点を質問。C++とかDとかLuaとかその他わけわかんない話もたくさん。この人たちをヲチしていけばいろいろ収穫がありそうなので、また参加させて頂きたいです。楽しい人たちでした。

__

明日も秋葉原の某所でRailsの勉強会。早く寝ないと。

2006-04-15

Windows プログラミング

をやったことがないので exerb とかでトラブルにあうとさっぱりわかりません。

「ふつうの Windows プログラミング」みたいないい本とかなにかないですか。

2006-04-15

Ruby/SDL 1.1.0

が公開されたようです。リファレンスマニュアルが大改訂。お疲れ様です。

2006-04-14

うぐぐぅ。

もう頭から煙が出てきた。

2006-04-14

[tDiary]ツッコミのCSS設定

ここの現在の CSS はすごーくシンプルで tDiary に特化した設定はほとんどやってなかったんだけど、ツッコミがどうも見にくいのでちょっと設定した。

/* comment */
div.comment { margin: 1em 0em; }
div.commentshort { margin: 0.6em 0em; }
div.commentshort p { margin: 0em 1em; }
div.comment div.caption { font-weight: bold; }
div.commentbody { margin: 1em; }
span.commentator { margin: 0.4em 0em; font-weight: bold; }
span.canchor { font-size: xx-small; }
div.commentbody p { margin: 0em 1em; }
2006-04-13

[MyGame]起動(2)

なかださんからツッコミを頂く。さっそく mygame/boot.rb に以下を追加してみる。

END {
  loop_game unless ran_loop?
}

test.rb

Image.draw('mglogo.bmp')

おお!動いた。ユーザに END {} を書かれると実行順序の関係でおかしくなりそうだけど、ループ処理を省略しつつ END {} を書くというケースはなさそうだからいいか。

__

これで最初のスクリプトの単純さは HSP と並んだぞ。こっから先のスクリプトは圧倒的に有利なはず。実行環境とかライブラリの機能はまた別の話だけど。

2006-04-13

[MyGame]起動

test.rb

Image.draw('mglogo.bmp')
loop_game

次のようにして起動。

ruby -r mygame/boot.rb test.rb

というのはどうなんだろう。 mygame/boot.rb は余計なものといえば余計なものなんだけど、でも便利な機能がないと結局は最初に使ってもらえないという話もあるし(というか他人に使ってもらうつもりだったのか?いつの日かある程度の形になったら [ANN] MyGame 0.0.1 ってゆう ML 投げられる?)。

なんでこうしたいかというと HSP をみるとやっぱり require ... とか include ... とか init ... とか MyGame:: ... とかが邪魔なものに見えてきてしまって、なんか負けている気が。 Ruby の柔軟さならたとえ HSP の土俵でも勝負出来るというのを試してみたくて。

HSP 3.0 は、

picload "HSP3TTL.JPG" 

だけでよくなったのか。以前は最後に stop 必要だと思ったけど。 HSP だと自動的にスクリーンのサイズが画像のサイズに合うんだけど、あれかっこいいなあ。

mygame/boot.rb はこう書いてみた。

BEGIN {
  require 'mygame'
  include MyGame
  init_game
}

最初 require 'mygame' を BEGIN の外に書いちゃったのだけど、そうすると BEGIN の中が先に実行されてしまうのだ(考えてみれば当然だけど)。 BEGIN 使ったのって Ruby を初めて使った頃以来だ。

いちおう書いておくと、test.rb を次のように書けば、

require 'mygame'
include MyGame
init_game 640, 480

Image.draw('mglogo.bmp')
loop_game

スクリーンサイズその他、詳細な条件を設定した起動が可能だし、

ruby test.rb

で実行できます。

2006-04-12

[MyGame]イベントのサンプル

require 'mygame'
include MyGame

init_game

image = TImage.new('ball.bmp')
x, y = 0, 0
add_event(:mouse_motion) {|event| x, y = event.x, event.y }
loop_game do
  image.draw screen, x, y
end

こうも書ける。

image = TImage.new('ball.bmp')
add_event(:mouse_motion) {|event| image.x, image.y = event.x, event.y }
loop_game do
  image.draw
end

デフォルトでループ終了のイベントが2つ登録されている。

add_event(:quit, :cloase) { @@loop_end = true }
add_event(:key_down, :cloase) {|e| @@loop_end = true if e.sym == SDL::Key::ESCAPE }

これらを取り除くにはこうする。

remove_event(:quit, :cloase)
remove_event(:key_down, :cloase)

__

ちなみにイベント呼び出しはループ内でこう実装されている。

while event = SDL::Event2.poll
  event.class.name =~ /\w+\z/
  name = $&.gsub(/([a-z])([A-Z])/) { "#{$1}_#{$2.downcase}" }.downcase
  (@@events[name.to_sym] || {}).each {|key, block| block.call(event) }
end
2006-04-12

[MyGame]画像表示のサンプル

こうなった。

require 'mygame'
include MyGame

init_game

Image.new('ball.bmp').draw
loop_game

mygame.rb の最後に

include MyGame
init_game

と書いておくと、

require 'mygame'

Image.new('ball.bmp').draw
loop_game

こうなって HSP にかなり近づけるけど、これは反則か。

ちなみに上記は無理にシンプルに書くための極端な例。普通に書くとこう。

require 'mygame'
include MyGame

init_game

image = Image.new('ball.bmp')
loop_game do
  image.draw
end

__

なかださんからツッコミを頂いていた。

Image.draw('ball.bmp')
Image['ball.bmp'].draw

現状だと draw の引数は次のようになっていて(もちろん省略可能)、

Image#draw(screen, x, y)

第1引数は描画対象となるサーフェース、2,3は描画する座標。なので前者だとこの引数のスタイルに合わない。後者はこういう形をはじめてみたので違和感があるのですが……。こんなのあり?

追記:むむ、自分の言っていることがおかしかった。

draw_image('ball.bmp')

Image.draw('ball.bmp')

とするのに問題はないじゃないか。引数うんぬんの話は最初の draw_image も抱えていたことなわけで。

描画先のサーフェイスを指定するような込み入った場合は Image.new をすればいいのだから、ここではなかださんのおっしゃる Image.draw('ball.bmp') でよさそうだ。

2006-04-12

[Ruby]x を 0 以上 x_max 以下の範囲に収める

これは、

x = 0 if x < 0
x = x_max if x > x_max

次のように書くこともできるのか。

x = [0, x].max
x = [x, x_max].min

追記:次のようにも書ける。

x < 0 and x = 0
x > x_max and x = x_max 
2006-04-12

やっぱりコマンドプロンプトは使いにくいので cygwin で

PATH=/cygdrive/e/ruby/bin:$PATH ; export PATH
2006-04-11

[Ruby]順序つきの Hash がほしい

さっきのケースもそうなんだけど、順序つきの Hash がほしくなることが年に数回ある。

さっきの例だと、同じイベントが発生した場合に、登録した順序で実行されることが保障されるとうれしい。でしょうがなく配列で書き直すということがしばしばあるので。

2006-04-11

イベント処理のメモ

@@events = {}
x = 5


def add_event_quit(key=nil, &block)
  @@events[key || block.object_id] = block
end
add_event_quit { puts x+=1 }
add_event_quit(:aaa) { puts x+=1 }


def add_event_quit(arg)
  if arg.is_a? Proc
    @@events[arg.object_id] = arg
  else
    arg.each {|key, block| @@events[key] = block }
  end
end
add_event_quit lambda { puts x+=1 }
add_event_quit :bbb => lambda { puts x+=1 }

p @@events
puts x

@@events.each do |key, block|
  puts "key = #{key}"
  block.call
end

puts x

なるほど lambda ってこういうことか。まあここではブロック引数版のほうがよさそうだけど。 lambda 版のメリットは複数のイベントを一回のメソッド呼び出しで登録できるところ。

key を与えるのは remove_event のため。

2006-04-11

[Ruby]文字列 "KeyDown" を "key_down" に変換するいい方法

(いい方法かどうかは別として)思いついた。

ruby -e 'p "AbcDefGhi".gsub(/([a-z])([A-Z])/) { "#{$1}_#{$2.downcase}" }.downcase'
#=> "abc_def_ghi"

でも、

"AbcDEF"

とかの文字列が与えられたときの結果がちょっと違うかもしれない。

そういえば今程度の正規表現はなぜか Ruby を使う前から書けたなあ。 結構長いこと Perl 使ってたんだよな。考えてみると Ruby の使用歴より Ruby を知る前までの Perl の使用歴の方が2倍くらい長いぞ。でも Perl は全然身につかなかった。

2006-04-11

クラスを使うか使わないか

簡易インターフェースを作るにあたってどっちがいいか。

draw_image('ball.bmp')
Image.new('ball.bmp').draw

クラス版もそんなに馴染みにくくないんじゃないだろうか(オブジェクト思考をやったことのない人にとって)。慣れればクラス版の方が扱いやすいし。うーむ。オブジェクト思考をよく知らない人にも馴染めるものがいいのだけど。あ、これってRubyの「十分に慣れた人にとって使いやすい」と方向性が違うな。

前者は、 ball.bmp を表示する命令を実行。

後者は、 ball.bmp を読み込んだ画像オブジェクトを作成して、それに描画するよう指示。(こっちは2段階だな。)

後者は、 ball.bmp を表示する処理。画像オブジェクトを作って、それを描画。(とか。)

2006-04-10

なぜ "Hello".display って何で書かないの?

print "Hello\n"

は見たことがあるが、

"Hello\n".display

は見たことがない。なぜだろう。

  • Ruby をはじめる多くの人が print 形式の言語に慣れていたから
  • "Hello".display という書き方はオブジェクト指向ぽく見えるが実は本質的でない

とか?

2006-04-10

Ruby/SDL の初期化処理を簡易化

http://www.kmc.gr.jp/~ohai/rubysdl_doc.html#label-5

あとで書く。

2006-04-10

ネームスペース

require 'mygame'

MyGame::init
screen = MyGame::Screen.new(320, 240)

MyGame::loop do
  exit if MyGame::key_press?(MyGame::Key::ESCAPE)
  MyGame::draw_image screen, 'ball.bmp', 100, 50
end

うわあ MyGame:: ウザッ。

require 'mygame'
include MyGame

game_init
screen = Screen.new(320, 240)

game_loop do
  exit if key_press?(Key::ESCAPE)
  draw_image screen, 'ball.bmp', 100, 50
end

とすればいいかなあ。

いままでよく考えずに screen を使っていたけど、これサーフェイスだから描画命令が書き込むサーフェイスを screen に固定してしまえばよりシンプルにできる。

require 'mygame'
include MyGame

game_init 320, 240

game_loop do
  exit if key_press?(Key::ESCAPE)
  x = (screen.w - image_size('ball.bmp').w) / 2
  y = (screen.h - image_size('ball.bmp').h) / 2
  draw_image 'ball.bmp', x, y
end

とした方がいいかな。 screen メソッドも用意しておく。

サーフェイスを指定する場合はこれで。

draw_surface_image surface 'ball.bmp', 100 50

ここでは関係ない話だけどこう書きたくなってくる。

require 'mygame'
include MyGame

game_init 320, 240
ball = Image.new('ball.bmp')
ball.x = (screen.w - ball.w) / 2
ball.y = (screen.h - ball.h) / 2

game_loop do
  exit if key_press?(Key::ESCAPE)
  ball.draw
end
2006-04-10

Ruby/SDL のサウンド処理を簡易化

ライブラリ名は mygame にしようかな。

Ruby/SDL による wav ファイル再生のサンプル。

require 'sdl'

SDL::init SDL::INIT_AUDIO|SDL::INIT_VIDEO
SDL.setVideoMode 320,240,16,SDL::SWSURFACE

SDL::Mixer.open
wave = SDL::Mixer::Wave.load("sample.wav")

ch = 0
loops = 0 
SDL::Mixer.playChannel(ch ,wave, loops)

while SDL::Mixer::play?(0)
  sleep 1
end

これは簡単だ。ただ playChannel の引数の順番は変えた方がいいかも。第2引数の wave は必須なので先頭に、 loop 回数指定は経験上必要になったことがないので一番後ろに。

game_loop do
  play_wave "sample.wav"
end

チャンネルとループ回数は省略可能。

画像と同じで wave は内部でキャッシュする。ループの前であらかじめロードしておく機能があってもいいだろう。リソース解放機能も。

load_wave "sample.wav"
game_loop do
  play_wave "sample.wav"
end
clear_wave "sample.wav"
clear_wave_all
2006-04-10

イベント処理をラップ (2)

昨日のイベント処理をメソッドとして定義する案を書いて、すぐにあれでは使いにくいことに気づいた。例えばマウスカーソルの位置にボールを表示する場合。簡単にはマウスの座標をループ内の x, y に伝えられないのだ。

def event_mousemotion(event)
  event.x # あれ、どうしよう……
  event.y
end

game_init
screen = Screen.new(SCREEN_W, SCREEN_H)
x, y = 0, 0
game_loop do
  draw_image screen, 'ball.bmp', x, y
end

じゃあ結局ループ内でマウスイベントをポーリングする仕組みのほうがいいか。ループ内に毎回判定を書くの実は好きなんだけど、もっといい方法がありそうだ。

game_loop do
  if event_mousemotion?
     x = event_mouse_x
     y = event_mouse_x
  end
  draw_image screen, 'ball.bmp', x, y
end

こんな書き方はできないのだろうか。というかこれできるんじゃないの?

x, y = 0, 0
add_event_mousemotion {|event| x, y = event.x, event.y }

game_loop do
  draw_image screen, 'ball.bmp', x, y
end

とりあえず簡単な実装。おおうまくいく。ブロックというか proc ってほとんど使ったことなかったけどこうやって使うんだ。なるほど。

def add_event_mousemotion(&block)
  $event_blocks << block
end

require 'sdl'

SDL.init SDL::INIT_VIDEO
screen = SDL.setVideoMode(320, 240, 16, SDL::SWSURFACE)
$event_blocks = []

x, y = 0, 0
add_event_mousemotion { puts "MouseMotion" }
add_event_mousemotion {|event| x, y = event.x, event.y }

loop do
  while event = SDL::Event2.poll
    case event
    when SDL::Event2::Quit 
      exit
    when SDL::Event2::MouseMotion
      $event_blocks.each {|block| block.call event }
    end
  end
  puts x, y
  sleep 1.0 / 60
end

--

いやあ、やっぱりRubyのパワーすごい。今まで Ruby での GUI のゲームはあんまり手を着けてなかったんだけど、 Ruby + Ruby/SDL かなり面白いかも。

2006-04-10

[開発ログ]サーバーマシンが来るかも

arton さんから嬉しいお話が。ありがとうございます。

慣れないヤフオクに入札したら、IRCに夢中になっているうちに制限時間が終わっていて競い忘れちゃったし、もう古いマシンを立て直すパーツ集めて復旧させるのも面倒だから新品マシン買ってしまえ!とか考え初めていたのだけど。

いやあよかったよかった。でも Dual マシンなんていじったことないよ。ドキドキ。

2006-04-09

rubyco(るびこ)の日記」のもくじを作るのはどうか

rubyco さんの日記は自分が Ruby の勉強をするのに役立つので、手動でリンク集的なものを作ろうと思い、作り出して、あっさり挫折。とりあえず各記事の名前と URL だけは機械的に抽出したほうがよさそう。ということで、下記スクリプトで読み込んでWiki にはっておいた。うは、すごくいっぱいある……。

require 'net/http'
$KCODE = 'euc'

def perse_page(path, address, port=80)
  result = []
  response = nil
  Net::HTTP.version_1_2
  Net::HTTP.start(address, port) do |http|
    response = http.request_get( path )
  end
  response.body.scan(/<h3>.+<\/h3>/).reverse.each do |line|
    if line.gsub(/<span[^>].+>.+<\/span>/, '') =~ /href="([^"]+)"[^<]+<\/a>(.+)<\/h3>/
      path = $1
      name = $2.gsub(/<[^>]+>/, '')
      result << [name, path]
    end
  end
  result
end

address = 'd.hatena.ne.jp'
id = 'rubyco'
(2006..2006).each do |year|
  (1..12).each do |month|
    path = "/#{ id }/#{ year }%02d" % month
    puts "!!#{ path }"
    perse_page(path, address).each do |name, path|
      puts "*[[#{ name }|http://#{ address }#{ path }]]"
    end
  end
end
2006-04-09

イベント処理をラップ

この Ruby/SDL のイベント処理。どうラップするのがいいか。

loop do
  while event = SDL::Event2.poll
    case event
    when SDL::Event2::Quit 
      exit
    when SDL::Event2::KeyDown
      puts 'A' if event.sym == SDL::Key::A
    end
  end
end

こんなのはどうだろうか。

def event_quit(event)
  exit
end

def event_key_down(event)
  puts 'A' if event.sym == SDL::Key::A
end

game_init
screen = Screen.new(SCREEN_W, SCREEN_H)
game_loop do
  # ループ内の処理
end

ためしに実装。

def event_quit(event)
 exit
end

def event_keydown(event)
  puts 'A' if event.sym == SDL::Key::A
  puts 'SPACE' if event.sym == SDL::Key::SPACE
end

def event_mousemotion(event)
  p event.x
  p event.y
end

require 'sdl'

SDL.init SDL::INIT_VIDEO
screen = SDL.setVideoMode(320, 240, 16, SDL::SWSURFACE)

loop do
  while event = SDL::Event2.poll
    name = "event_#{ event.class.to_s.match(/\w+\z/)[0].downcase }"
    begin
      __send__ name, event
    rescue NoMethodError
      puts "undefined method `#{ name }'"
    end
  end
end

文字列 "KeyDown" を "key_down" に変換するいい方法ないかな。

疑問点がひとつ。

def event_keydown(event)
  aaa()
end

とすると、

rescue NoMethodError

につかまる。

しかし、 aaa() の () をとるとと NameError が発生。

def event_keydown(event)
  aaa
end

test.rb:6:in `event_keydown': undefined local variable or method `aaa' for main:
Object (NameError)
        from test.rb:23
        from test.rb:19

ん、そうかこれはこれでいいか。

けど、

def event_keydown(event)
  aaa()
end

の場合の NoMethodError はここの rescue で捕らえたくないんだけどどう実装すればいいのだろう。

2006-04-09

[Ruby]exerbとRuby1.8.4コア同梱のActiveScriptRuby 1.8.4.2 リリース

これはすごくうれしい。初心者にRuby環境を紹介する場合にASRは「ruby console」があるからパスの設定が不要なのも魅力的だったし。さらにExerbも同梱されていやあ便利です。言ってみるものだなあ。

2006-04-09

Ruby/SDL を簡易ライブラリ化

(RDスタイルに戻した。日をまたがないと切り替わらないのでしかたなく明日のエントリに書いている)

よく使う処理をシンプルなインターフェースに簡略化するならどんな形がよいか。

なんとなくの全体イメージ。

game_init
game_loop do
  # 処理
  # 描画
end

スクリーン生成

game_init
screen = Screen.new(SCREEN_W, SCREEN_H)
#screen = create_screen(SCREEN_W, SCREEN_H)

画像表示

この画像表示をラップするとしたらどういうインターフェースにするか。

image = SDL::Surface.load('ball.bmp')
image = image.displayFormat
image.setColorKey SDL::SRCCOLORKEY, image.getPixel(0,0)

SDL.blitSurface image, 0, 0, 0, 0, screen, x, y

クラス版

もっとも自然。

image = Igame.new(screen, 'ball.bmp')
image.x = x
image.y = y
game_loop do
  image.draw
end

シンプルなラッパー版

思ったよりいいかも。非オブジェクト指向。

image = create_image('ball.bmp')
game_loop do
  draw_image screen, image, x, y
end

命令タイプ

毎回 SDL::Surface.load から作り直す。非現実的。

game_loop do
  draw_image screen, 'ball.bmp', x, y
end

いやキャッシュすればいいからオブジェクト指向を避けるならありか。なんか良く見えてきた。

これを使ってクラスを書くのもあり。

class Ball
  def initialize(screen, x=0, y=0)
    @screen = screen
    @x = x
    @y = y
  end

  def run
    @x += 1
  end

  def draw
    draw_image @screen, 'ball.bmp', @x, @y
  end
end

うん、いいかも。実際は initialize を基底クラスに分離かな。

game_init
screen = Screen.new(SCREEN_W, SCREEN_H)
balls = Array.new(10) { Ball.new(screen, rand(SCREEN_W), rand(SCREEN_H)) }
game_loop do
  balls.each do |ball|
    ball.run
    ball.draw
  end
end

これ balls の生成が複雑だなもっと単純化できないものか。

balls = []
10.times { balls << Ball.new(screen, rand(SCREEN_W), rand(SCREEN_H)) }

うーん。

balls = []
10.times do
  balls << Ball.new(screen, rand(SCREEN_W), rand(SCREEN_H))
end

うーん。

balls = (0...10).map { Ball.new(screen, rand(SCREEN_W), rand(SCREEN_H)) }

最初の Array.new(10) が良く見えてきた。

あと each って難しいよね。オレ自身ブロックつきメソッドを理解したの最近だし。

balls.size.times do |i|
  ball[i].run
  ball[i].draw
end

結局ブロックつきメソッドなんだけど。for は一回も書いたことないなあ。これでいいのかな。

for ball in balls
  ball.run
  ball.draw
end

for は Rails でしか見たことない。 times は最近はなんか変な感じするけど、最初のころはすごくなじみやすかった覚えがある。each は最初ぜんぜんわからなかったけどすぐに慣れた(使う分には)。 for は C と違いすぎてぜんぜんなじまなかった。あ、 C とか他の言語を知らない人には for はいいのかも。

2006-04-08

SDL IRC に参加

http://risky-safety.org/zinnia/sdl/irc.html

思ったよりたくさんの方がいらっしゃって楽しそうです。

今日から記法を「RDスタイル」から「Hatenaスタイル」に変更してみました。リンクの仕方がわかりません。

Exerb ではまる(2)

こっちのノートPC(Windows XP SP1)で昨日の手順で ball.exe を作成すると、このマシン上でも起動できない。

まず exe 以前にRuby/SDLを使おうとするとこの2つが見つからないといわれた。

  • msvcr71.dll
  • msvcp71.dll

これを探してきて ball.rb は動くようになった。

次に exe を作成してこれを実行すると、

sdl.rb:17:in `require': Win32API Error #5 --- アクセスが拒否されました。 (Exerb::RuntimeError) from sdl.rb:17

というエラー。この行は ruquire 'sdl.so' をしているところ。

Ruby/SDL が 1.8.4 対応で Exerb コアが 1.8.2 なんだけどその辺の問題なのだろうか。 Windows プログラミングはほとんどやったことがなくてさっぱりわからない。このあたりもこれから勉強していかないと。

[tDiary]はてなスタイルのテスト

テスト。

あれリンクの書き方が違う?例を示そうと思ってプレ記法使おうをしたら固まるぞ。むむむ。

2006-04-07

Ruby と そのコミュニティに感謝

自分ひとりには到底難しいと思える問題でも Ruby 関係のコミュニティ(MLやIRCや各種勉強会やイベント)の力がすごく大きいから、なんとか解決できるんじゃないかと勇気が沸いてくる。困ったことを日記に書くと情報をもらえたり(もらえなかったり)、MLやIRC、各種勉強会もとっても心強い。これは Ruby とそのコミュニティに関わる前にはまったくなかった感覚。以前はマニュアルと書籍と慣れないgoogleと自分のひらめきに頼るしかなかった。新しいことに挑戦しようとしたときも力になってくれると言って下さる方もいらっしゃって本当にありがたいです。

そして何よりRubyとその周辺のライブラリやアプリケーションにも感謝。

2006-04-07

家サーバー不調

今月になって2回電源が消えた。原因不明。現在ダウン中。

静かで消費電力が少なくて、そんなに遅くなくて Debian なサーバー PC がほしい。ほしい、ほしい、ほしい!

2006-04-07

[開発ログ]作業ログ

ノート PC でいじったソースをメイン開発機にフィードバックしないと。

ノート PC での作業は、

だったかな。よく覚えていない。

とりあえずバージョン管理できるようにサーバー立てるか、そういうサービスを探すか。Subversion の使えるサービスってあるのだろうか。CVSのサービスもよく知らないんだけど。

2006-04-07

ASRにexerb(の特にコア)が入っているとうれしい……

うれしいなあ。

開発版の exerb を CVS から落として見たんだけど、4.0 でいろいろ変わっているみたい。レシピファイルが yaml になっていたり、ドキュメントも一新されている。

ChangeLog の 4.0.0 にはこう書いてある。

はやくリリースされないかなあ。

2006-04-07

Ruby/SDL + Exerb ではまる

Ruby/SDL のインストール

Download Ruby/SDL から「Win32's binary(ver 1.0.0) and ruby 1.8.4 interpreter package 」をダウンロードして解凍。

ruby ディレクトリを「 E:\ruby 」にコピー。 「 E:\ruby\bin 」にパスを通して終了。

Exerb のインストール

Exerb サイトから 「exerb-3.3.1.tar.gz」をダウンロード。ダウンロードしたファイルを解凍したディレクトリ(setup.rbがあるディレクトリ)にコマンドプロンプトで移動して下記を実行。

ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install

インストールは完了。

ball.rb から ball.exe を作成

ruby -r exerb/mkexr ball.rb

を実行。レシピファイル ball.exr が作成される。

ruby E:\ruby\bin\exerb ball.exr

で ball.exe が作成される。

問題点

うまくいったかと思って、ここでできた exe を別の Windows で実行すると SDL 関係の DLL が見つからないというエラーが発生。

レシピファイル ball.exr に SDL 関係の DLL を追加。

# generated by mkexr.rb
set_kcode	none
add_ruby_script	ball.rb
add_ruby_script	forwardable.rb	E:/ruby/lib/ruby/1.8/forwardable.rb
add_ruby_script	rubysdl_aliases.rb	E:/ruby/lib/ruby/site_ruby/1.8/rubysdl_aliases.rb
add_ruby_script	sdl.rb	E:/ruby/lib/ruby/site_ruby/1.8/sdl.rb
add_extension_library	sdl.so	E:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt/sdl.so

add_resource_library	E:/ruby/bin/SDL.dll
add_resource_library	E:/ruby/bin/SDL_ttf.dll
add_resource_library	E:/ruby/bin/iconv.dll
add_resource_library	E:/ruby/bin/zlib.dll
add_resource_library	E:/ruby/bin/SDL_image.dll
add_resource_library	E:/ruby/bin/SGE.dll
add_resource_library	E:/ruby/bin/jpeg.dll
add_resource_library	E:/ruby/bin/sdlskk.dll
add_resource_library	E:/ruby/bin/zlib1.dll
add_resource_library	E:/ruby/bin/SDL_mixer.dll
add_resource_library	E:/ruby/bin/freetype-6.dll
add_resource_library	E:/ruby/bin/libpng13.dll
add_resource_library	E:/ruby/bin/smpeg.dll 

このレシピファイルで exe を作成するとサイズが 3.5 M ほどの exe が作れる。しかしこれを実行すると、

exerb: the loaded recourse table is too big. (Exerb::RuntimeError)

というエラー。ぐぐったら exerb のソース が引っかかって、これを見ると、

42: LOADED_LIBRARY_ENTRY g_loaded_library_table[32] = {0};

と 32 個にハードコーディングされている模様。この最大数の問題だろうか。

しかし Ruby/SDL で実装したシューティングゲーム を見るとちゃんと exe 化できているから、きっとうまくやる方法があるはずなんだけど……。

2006-04-05

Ruby/SDL の 2D 描画速度実験

Ruby/SDLMiyako のサイトを見ると速度が遅いとある。実際どんなものなのか実験してみた。

PCのスペックは次の通り。詳しくないがゲームの実行にはいまいちな環境だと思う。

SDL.blitSurface でのイメージ描画

256x256 のスクリーンに対して 16x16 のイメージを秒間 60 フレームで何個表示できるかという実験。結論から言うと手元のマシンでおよそ5000個。下記ののスクリプトの実行時間が、

であった。

同じような処理を某ゲーム機(プレ○ステー○ョン)で行うと 1/60 秒で 2000 強スプライトが表示可能であったと記憶しているから、 Ruby/SDL のこの性能なら基礎的な 2D 描画能力は実用に十分な速度と言える。

スクリーンのサイズとイメージのサイズを変えると以下の通り。

require 'sdl'

SCREEN_W = 256
SCREEN_H = 256
SDL.init( SDL::INIT_VIDEO ) 
screen = SDL.setVideoMode( SCREEN_W, SCREEN_H, 16, SDL::SWSURFACE ) 
image = SDL::Surface.load( 'icon16.bmp' )
image.setColorKey( SDL::SRCCOLORKEY, image.getPixel(0,0) )
cx, cy = image.w / 2, image.h / 2
image = image.displayFormat

t = Time.now
60.times do
  while event = SDL::Event2.poll
    case event
    when SDL::Event2::Quit, SDL::Event2::KeyDown
      exit
    end
  end

  screen.fillRect( 0, 0, SCREEN_W, SCREEN_H, [ 0, 0, 128 ] )

  5000.times do
    image_x = rand(SCREEN_W)
    image_y = rand(SCREEN_H)
    SDL.blitSurface(image, 0, 0, 0, 0, screen, image_x, image_y)
  end

  screen.updateRect( 0, 0, 0, 0 ) 
end

p Time.now - t

※手元の環境では SDL::HWSURFACE に変えても速度差はでなかった。

SDL.transform_blit は 10 倍以上遅い

transform_blit を使ってイメージを回転させて表示。

5000.times do
  image_x = rand(SCREEN_W)
  image_y = rand(SCREEN_H)
  angle = rand(360)
  SDL.transform_blit(image, screen, angle, 1, 1, cx, cy, image_x, image_y, 0)
end

実行にかかった時間は 14.844 秒。

Ruby はどれくらい遅いのか

ループ部分から SDL の処理を取り除いて速度を計測。ループ部分を次のようにした。

60.times do
  5000.times do
    image_x = rand(SCREEN_W)
    image_y = rand(SCREEN_H)
  end
end

結果は 0.484 秒。これは驚くほど遅い。さらに次のようにすると、

60.times do
  5000.times do
    image_x = rand(SCREEN_W) - cx
    image_y = rand(SCREEN_H) - cy
  end
end

0.625 秒という結果に。 5000 個ぶんの座標計算とはいえこんなにかかるのか。ふうむ。

結論としては速度に注意を払いながら作らないと確かにすぐに非現実的な速度になってしまいそうだ。まあそれはコンシュマーゲーム機でも同じなんだけど。

2006-04-04

「RailsによるアジャイルWebアプリケーション開発」を注文した

RailsによるアジャイルWebアプリケーション開発

最近の Rails 動向を全然調べてないので、これが届いたらもう一度基本から勉強しようと思う。

2006-04-03

Perlish Magazine 20060401 号

留守の間に無事に出ていたようです。リリースに立ち会えなくて残念。

CSSがうちに直にリンクされているけど、これはこれでお手伝いの証しみたいだからいいか。編集後記の「 dgames のほうの dan 」って他人にわかるのだろうか。

今年もお疲れ様でした。