RGSS2を知る(6)
いじっていたらColorクラスで==がオーバーライドされていることに気がついた。
マニュアルには書いていない。
まあ、マニュアルが完璧であることは期待してはいけないが、なんだかミスで抜けてる感じもしないので、細かく書くと難しくなるから書かずに済ませているメソッドがあるのではないかと思う。
いろいろ調べてみた。
まずはスーパークラス。すべてObjectがスーパークラスだとマニュアルには明記されているが、実際どうなのだろう。
open("c:\\test.txt","w") do |fh| [Bitmap,Color,Font,Rect,Sprite,Viewport,Tone,Plane,Table,Tilemap,Window].each do |c| fh.write(c.name + " =>\n") fh.write(c.superclass.name + "\n") end end
結果
Bitmap => Object Color => Object Font => Object Rect => Object Sprite => Object Viewport => Object Tone => Object Plane => Object Table => Object Tilemap => Object Window => Object
たしかにそのようだ。
次はクラスメソッド。
open("c:\\test.txt","w") do |fh| [Bitmap,Color,Font,Rect,Sprite,Viewport,Tone,Plane,Table,Tilemap,Window].each do |c| fh.write(c.name + " =>\n") c.singleton_methods.each do |m| fh.write(m + "\n") end end end
結果
Bitmap => Color => _load Font => default_italic default_shadow= default_name= default_bold default_italic= default_color default_size default_bold= default_shadow default_color= default_name default_size= exist? Rect => _load Sprite => Viewport => Tone => _load Plane => Table => _load Tilemap => Window =>
_loadはMarshalするときに使われるメソッドで、この結果を見るとColor、Rect、Tone、TableがMarshalに対応していることがわかる。
そしてインスタンスメソッド。
open("c:\\test.txt","w") do |fh| [Bitmap,Color,Font,Rect,Sprite,Viewport,Tone,Plane,Table,Tilemap,Window].each do |c| fh.write(c.name + " =>\n") c.instance_methods.each do |m| begin eval("class #{c}\n remove_method(:#{m})\n end") fh.write(m + "\n") rescue end end end end
結果。あまりに多いのでObjectクラスに定義されているものは出さないように工夫してあるが、それでも多いからマニュアルに書かれているものは手で省いた。
Bitmap => Color => eql? to_s == === _dump Font => Rect => empty eql? to_s == === _dump Sprite => clone dup Viewport => clone dup Tone => eql? to_s == === _dump Plane => clone dup Table => _dump Tilemap => clone dup Window => clone dup
Marshal用のメソッドと、clone、dup、それから値クラスに比較用メソッドとto_sがあるらしい。
Rectの===とか、範囲内に含まれているとか判定できるのかな。接触している判定だったら衝突判定に使えるかもしれない。なぜマニュアルに書かない。
Rectのemptyって何が起こるんだろう。
また、これをいじっていて見つけたのだが、Planeクラスのviewportプロパティが、viewportはあってもviewport=がない。
v = Viewport.new(0,0,10,10) p = Plane.new p.viewport = v
このコードはエラーになった。誰もこんなもん使わないから見つからないわけで、別に無くても困らないだろう。
あと、Tilemapクラスのbitmapsプロパティ、[]をつけてアクセスするからArrayが入っているのかと思ったら。
内部処理用に隠しクラスがあるようだ。
あとで気が向いたら調べてみよう。