Ruby でインベーダー


Ruby/SDLスペースインベーダーっぽい何かを作っています。まだインベーダーは実装していませんが、自機と弾発射は仕込みました。
例によってクラスの設計でとても悩みます。どのようにクラスを分けるかという問いに正解はないのですが、正解を追い求めて思考の袋小路に入ってしまうような、そんな感じ。例えばボタンが押された時に弾丸を生成するわけですが、弾丸の描画位置を決めるためには自機の現在座標が必要になります。つまり発射メソッドは自機クラスの情報を知っている必要があるわけです。ですがこれだけでは描画はできません。自機の中央から弾丸を発射したいならば


@ship.center
で座標を取得できるわけですが、この座標に描画するわけにはいきません。何故なら描画時に指定する座標は描画開始の原点だから。この座標を直接描画メソッドに渡してしまうと、半キャラ分右にずれて描画されてしまいます。なので描画メソッドに渡す座標は

自機の中心点 - 描画する弾丸グラフィックの幅 / 2
にならなければならないわけです。これから生成する弾丸に初期位置を与えるためには、生成後のサイズを知っておかなければならないのです。こうやってオブジェクト同士の情報を深く知ってしまうのは設計としていかがなものか……と考えて、なかなか先に進みません。
リファクタリングの旗印のもと、とにかく汚くても動かしてしまうのがいいとは解っているのですが、ねぇ。