PolygonMorphを継承したクラスを作る

やたらはまったのでメモ。

やりたいこと。

  1. 点列を連結した図形を表示する
  2. 点の座標を一定のインターバルを置いて書き換える

なんでこんなことやりたいかは察して欲しい。


基本的な部分は分かっててそれぞれ

  1. PolygonMorphを継承する
  2. stepメソッドを上書きする

で、できるはずなんだけど、なんか駄目。


で、試行錯誤の末、分かったこと。

  1. PolygonMorphは点列をverticesというインスタンス変数に保持してるんだけど、これを直接設定しちゃ駄目。どうしてもやるときはそのあとでcomputeBoundsメソッドを呼ぶ。PolygonMorphは位置や占める領域がverticesで決まるんだけど、このメソッドを呼ぶまでそれらが再計算されなくておかしなことになるみたい。
  2. verticesを直接設定せずにどうするかというと、setVertices:メソッドを使う。このメソッドは内部でcomputeBounds呼んでるのでいろいろうまくいく。

たったこんだけなのにえらいはまった・・・。もうちょっとSqueak環境使いこなさないと駄目だな・・・。

本日の成果

とりあえず半円状に点を置いて、ランダムに動かす。

YourSpecialMorph >> setupVertices
	| center verts |
	center := self referencePosition.
	verts := Array new: (self degree // self stepDegree + 1).
	(0 to: self degree by: self stepDegree) doWithIndex: [:deg :index |
		| p |
		p := (center x + self radius * deg degreeCos) @ (center y + self radius * deg degreeSin).
		verts at: index put: p].
	self setVertices: verts.
YourSpecialMorph >> step
	| verts |
	verts := vertices copy collect: [:e |
		(e x + 10 atRandom - 5) @ (e y + 10 atRandom - 5)].
	self setVertices: verts.

おまけ

Morph自作しようとしていろいろ試してるとシステムにゴミがたまると思うけど、以下で一発で消せる。

YourSpecialMorph allInstances do: [:inst | inst delete].

こういう便利な文は開きっぱなしのWorkspaceに並べておけば、その行にカーソル移動してCtrl+dできて楽。