言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

複雑な形のモルフにマウスイベントを反応させる方法。

普通に Morph を継承しただけのモルフでは、マウスイベントはモルフの周りの矩形全体に反応してしまう。複雑な形状や中抜きを持つモルフの場合、描画していない場所ではマウスイベントを無視したい。

Morph>>containsPoint: aPoint
を上書きして範囲外では false を返せばよい。(分かってしまえば単純だが、探すの難しかった)。

PolygonMorph のような複雑なモルフの時はどうしてるのだろうか?
Point クラスには、ある線上に位置しているかどうかを調べるメソッドがあり、それを使うと簡単。

    self
        lineSegmentsDo: [:p1 :p2 | (aPoint
                    onLineFrom: p1
                    to: p2
                    within: 3)
                ifTrue: [^ true]].

のように使う