ページ 11

クラス間でのデータの受け渡しについて

Posted: 2013年7月03日(水) 02:20
by 奥兵
Androidの館を参考にしてAndroidで動くシューティングゲームの制作を目指しソースコードを書いています。
Androidの館のイライラ棒アプリ制作の”s2.04 自機を作る”あたりまでのソースと構成をほぼ完全に利用して、自機のクラスと自機画像の表示の機能まで作りました。
次にタッチを利用した自機の移動をさせたいと思っています。

タッチイベントを受け取るonTouchEventをSurfaceViewを継承したGameSurfaceViewクラスでオーバーライドし、
GameSurfaceViewクラスはあまりごちゃごちゃとさせたくなかったので、タッチ入力を処理する自作のTouchInputクラスを作りました。
それをGameSurfaceViewクラスのメンバに加え、イベントの内容だけ送るようにしました。
このTouchInputクラスのメンバに、同じくGameSurfaceViewのメンバであるGameMgrクラスのメンバであるUnitクラス(自機)からアクセスしたいと思っています。

SurfaceViewからGameMgrにTouchInputのインスタンスを渡し、さらにGameMgrから毎ループごとにsetメソッドかなにかを用意してTouchInputをUnitクラスに渡す方法を思いついたのですが、
もっとスマートな書き方ができるような気がしてあれこれ考えてみたのですがこの方法しか思いつきません。
もっとスマートな書き方があるのか、もしくは皆様ならどう書くかを知りたいです。よろしくお願いします。

Re: クラス間でのデータの受け渡しについて

Posted: 2013年7月03日(水) 15:49
by ISLe
設計的には外部の実装を見せないほうが良いので、ゲームコンテキストクラスを用意してゲーム全体で管理する情報はそこにまとめます。
もちろんゲームコンテキストクラスの内部も見せないでメソッドで抽象化します。

そして更新メソッドの引数などでゲームコンテキストを渡します。

TouchInputを共通の公開用インターフェースとして設計したのであれば、ゲームコンテキストのメンバとしてTouchInputをそのまま含めれば良いと思います。

Re: クラス間でのデータの受け渡しについて

Posted: 2013年7月04日(木) 05:04
by 奥兵
お教えいただいたように実装しました。具体的には、
TouchInputはGameContextクラスのメンバとし、GameSurfaceViewでGameContextのインスタンスを作りGameMgrに渡して、
GameMgrから各タスクの毎ループごとの処理をもつメソッドの引数として渡しました。

ありがとうございます。これで渡したい情報が増えてもGameContextに手を加えるだけで済みます。

コードの全体的というか高レベルというかの部分の設計について悩むことが多いです。その辺の考え方はやはり実践と経験あるのみなのでしょうか?
もし参考になる書籍やサイトなどがあれば教えて欲しいです。

Re: クラス間でのデータの受け渡しについて

Posted: 2013年7月04日(木) 16:49
by ISLe
設計・モデリングについて書かれたニュース系のサイトとかをよく見たりしますね。
ほとんどエンタープライズ系なのである程度業務システムの知識がないと難しいかもしれませんが。

基本的にはオブジェクトの相関図を書いて、ピラミッド型になるよう試行錯誤する形になると思います。
経験も必要ですね。
個人的には新しいものを作るよりリファクタリングするほうが設計に関しては身に付くものが多いと思います。
慣れるとどういう機能を持たせてどこに当てはめると良い形になるかというのがひらめくようになります。

Re: クラス間でのデータの受け渡しについて

Posted: 2013年7月04日(木) 20:44
by 奥兵
とても参考になりました。ありがとうございます。

ぜんぜんリファクタリングをしたことがなかったので、これからどんどんしていこうかと思います。
その手のサイトもいろいろ探して読んでみます。