RGSS2を知る(10)

RGSSはRubyGameScriptingSystemでRGSSなのだから、Rubyではあるのだが、ライブラリはいまいちRubyぽくない動作をする(俺的感覚)。
こういう感覚は人によって違うので、たとえばDXRubyも俺が思う以上にRubyぽいと言われたり、Rubyぽくないと言われたり、まちまちだ。
いま考えてみると、設計はそこそこRubyぽいが、クラス・モジュール・メソッドのネーミングセンスは壊滅的だったと反省している。


さて、RGSSでこういうコードを書く。

t = Tone.new(0,0,0,0)
s = Sprite.new
s.tone = t
p t.equal?(s.tone)

結果はfalse。代入したToneオブジェクトと取り出したToneオブジェクトは別物になっている。
Spriteオブジェクト内部で保持しているのはToneオブジェクトではなく、その値だけなのだろう。toneプロパティで取り出すときに改めて生成しているのだ。

b = Bitmap.new(200,200)
b.fill_rect(b.rect, Color.new(255,0,0))

t = Tone.new(0,0,0,0)

s = Sprite.new
s.bitmap = b
s.tone = t

g = 0

loop do
  g += 1
  t.gray = g
  s.tone = t # ←ここ

  Graphics.update
end

このコードは赤い四角がだんだんグレーになっていくのだが、「←ここ」の行を消すと色が変わらなくなる。
Ruby的にはtoneプロパティはToneオブジェクトへの参照を持っているのだから、別の変数でアクセスして中身を変えれば描画に反映されると思うのが普通だ。と思う。


互換ライブラリを作るときに悩むのは、こういう俺的感覚と違う細かいところをどうするかというところ。
自然に作ったらToneオブジェクトの参照を持つようになるんだから、他にもいっぱいあるかもしれない。
完全なコピーが作りたいわけではないし、どのみちそれは無理なわけで、俺が気づいているかいないかの差ってことか。