>>744 漏れがもっぱらやってるのがインターフェース渡し。
弾丸コレクションクラスに弾丸コントローラっていうインターフェースを実装しておいて、
各敵キャラとか生成するときに弾丸コントローラのインターフェース渡してる。
で、敵キャラはタスク実行時とかにそのインターフェース越しに弾丸発生させたりするわけだ。
ちなみにコードで言うとこんな幹事。
//弾丸コントローラ
public interface bulletControler{
public void pushBullet(bullet b);
}
//弾丸コンテナ
public class bulletContainer implements bulletControler{
private List bullets=new List();
public void pushBullet(bullet b){
bullets.add(b);
}}
で、敵キャラとかは
public class enemy{
private bulletControler con;
public enemy(bulletControler con){
this.con=con;
}
private void shot(){
con.pushBullet(new bullet());
}}
って感じで生成してる。だから何って感じだろうけど。参考になれば。
>>744 俺は、オブジェクトが行動するメソッドの引数に管理クラスのポインタを渡すようにしてる。
for ( int i = 0; i << オブジェクト数; i++ ) {
オブジェクト[i].行動(管理オブジェクト)
}
オブジェクトと管理クラスの結合を弱めて、全体の見通しを良くするのが狙い。
この時、引数に渡される管理オブジェクトは管理クラスそのものである必要はなく、
最低限の敵や弾の生成機能へのアクセスを提供する
インターフェース(仮想クラス)にすることで、管理クラスとの結合をさらに弱めることができる。
漏れがやってるのも管理クラスのポインタを持たせてるのと変わらんなwww
んだば、System.out式で、常にゲーム=弾丸管理インスタンスが一つである前提として
public class Game{
public static bulletContainer Bullets=new bulletContainer();
}
こんな感じでクラスを定義しておいて、各敵キャラクラスとかから
Game.Bullets.addBullet(bullet b);
って感じで呼び出せばよいんでないか?
System.out.println();と同じ発想だよ。出力先が常に一つなら、別にどこかでポインタを確保する必要ないもんね。
>>747 すまない、C++しか分からない俺にC++のコードで書いてくれないか。
>>748を修正(汗)
修正前: for ( int i = 0; i << オブジェクト数; i++ ) {
修正後: for ( int i = 0; i <= オブジェクト数; i++ ) {
~~~
>>751 それ、ループの終わりでインデックスオーバーするぞ。そういう仕様なのか?
>>752 そういえばそうだwww 「<=」じゃなくて、「<」じゃないとな。さんくす
>>750 俺は返ってC++が専門じゃないわけだが……
class bulletControler{//弾丸コントローラクラス
public :virtual void addBullet(bullet b);//弾丸をリストに追加する機能だけ持つインターフェース
}
class bulletContainer:bulletControler{//弾丸コントローラを継承した弾丸コンテナ
public:
void addBullet(bullet b);//継承したメソッド
void clearBullets();//継承してないメソッド
}
//敵キャラの実装
class enemy{
private bulletControler con;
enemy::enemy(bulletControler con){
this->con=con;
}
enemy::shoot(){
con->addBullet(new bullet());//インターフェースから見えるメソッド
}}
って漢字化? 説明したからといって何だって感じの設計だが。