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が入っているのかと思ったら。

内部処理用に隠しクラスがあるようだ。
あとで気が向いたら調べてみよう。