9

私は Java でボンバーマン ゲームを書いています。ゲームのマップ (タイルを含む)、プレイヤー (およびマップ内の動き) のコードを既に作成していますが、爆弾爆発のコードで立ち往生しています。 .

Mapの 2 次元配列を含むクラスがあります。これには、 s、s、およびsTilesを含めることができます。オブジェクトには、爆弾と爆弾の位置でオブジェクトからメソッドを呼び出すメソッドがあります(すべてオブジェクトの参照があります)。メソッドが呼び出されると、マップは爆弾を正しい に配置します。私の問題は爆弾の爆発にあります。誰が気にする必要がありますか?爆弾そのもの?もしそうなら、爆弾はそれを含む への参照を持つべきですか? 今まで私のタイルは参照を必要としませんでした。PlayerBlockBombPlayerdropBombreceiveBombMapPlayerMapMapreceiveBombTileTileMap

私が考えた1つの可能性はTile、オブジェクト内に参照を持つことです。つまりBomb、爆弾が爆発すると(そして爆弾はいつ爆発するかを知っています)、爆発のためにタイルオブジェクトのメソッドを呼び出し、タイルはマップのメソッドを呼び出します. ところで、これが良いアイデアかどうかはわかりません。私は何をすべきか?

public class Tile {

private boolean available; //if the tile is not occupied by a indestructible block or bomb
private List<Entity> entities; //you can have more than one player at a tile
public boolean receiveEntity(Entity entity) {
    boolean received = false;
    if (available) {
        this.entities.add(entity);
        received = true;
        if (entity instanceof Block || entity instanceof Bomb) {
            available = false;
        }
    }
    return received;        
}

public boolean removePlayer(Player player) {
    return entities.remove(player);
}
}

プレイヤークラス:

public class Player implements Entity {

private Map gameMap;
private int posX;
private int posY;
private int explosionRange; //the explosion range for bombs
public Player(int posX, int posY, Map gameMap) {
    this.gameMap = gameMap;
    this.posX = posX;
    this.posY = posY;
    this.explosionRange = 1;
}

public void dropBomb() {
    gameMap.receiveBomb(new Bomb(explosionRange), posX, posY);
}
}

マップ クラス:

public class Map {

private Grid<Tile> tileGrid;
private int width;
private int height;

public Map(int width, int height, BuildingStrategy buildingStrategy) {
    this.width = width;
    this.height = height;
    this.tileGrid = new Grid<Tile>(width, height);  
    buildingStrategy.buildMap(this);
}   
public void receiveBomb(Bomb bomb, int posX, int posY) {
    tileGrid.get(posX, posY).receiveEntity(bomb);
}
}

動きはもういいので、動かし方は割愛します。

4

3 に答える 3

2

私は常に学び、「テーブルは自分自身を描く」というルールに従って生きてきました。画家は色を選択してメソッドを呼び出し、床は水漏れと飛び散りの表示方法を決定するかもしれませんが、テーブルはそれ自体をペイントします。

問題に戻ります。爆弾は自分自身で爆発します。このようにして、さまざまな爆弾のさまざまな効果を得ることができます。爆弾はタイルに効果があり、タイルはそれに反応します。

例: 爆弾には力と爆発の種類があります。爆弾は、(私が思うに 1 つと 1 つのタイルのみを占有しますか?) タイルにその効果を「与えます」。

この力を分配するのはタイルです。いくつかの種類の爆弾、1 つのパワー (1 から 10 の間の数としましょう)、および 2 つのタイプ (通常、焼夷弾、凍結としましょう) があるとします。

爆弾が爆発し、アバターがレベル 5 の火の魔道士であるため、爆弾の威力は 4 でタイプは焼夷弾です。だからあなたは自分のタイルにこう言います:私はパワー4で爆発し、あなたに火をつけています!

これでタイルがプレイされます。爆発の力に「触れた」タイルは、「Exploded」関数を呼び出して処理を行う必要があります。それも発火している場合は、「onFire」機能でさらにやるべきことがあります

どのタイルが「爆発」するかは、力によるものです。フォース4の通常のタイルは、4の範囲内のすべてのマスにエクスポーションを与えますが、それが山のタイルのような特別なタイル(それ自体からそれを知っている)の場合、そのフォースでは前進できない可能性があります.

タイル 1 は 4 で爆発し、力 3 で隣接するタイルにそれを与えます。これらのタイルの 1 つは壁である可能性があるため、それ以上何もしません。もう 1 つは通常のタイルで、爆発し、フォース 2 で前に出し続けます。「水」タイルの場合、爆発は前方に押し出されますが、火はそうではありません。

それで:

  • 爆弾は自分自身を爆発させ、タイルの爆発機能を呼び出します
  • タイルが爆発し、タイルの種類に応じて爆発を前方に押し出します。
  • これにより、後続のタイルが爆発します。

最終的には、ほとんどの作業がタイルによって行われるように見えるかもしれませんが、これはおそらく事実です。しかし、最初のステップ: 力、タイプ、および最初の呼び出しの計算は爆弾からのものです。爆弾が爆発します。そして、爆発はタイルに影響を与えます。タイルはそれを処理し、必要に応じて伝播します。

于 2013-10-15T12:52:00.283 に答える
0

マップは、爆弾の爆発を処理する責任を負うべきです。

存在するすべての爆弾を含むマップにキューを作成することをお勧めします。また、爆弾にはタイマー (つまり、CreationTime) が必要です。これにより、爆弾がキューにプッシュされたときに、キュー内の各爆弾がそこにある時間をチェックし、該当する場合はそれらを「爆発」させます。

ExplodeBomb4 つの方向すべてをチェックし、それに応じてタイルを処理する関数をマップに追加します。

于 2013-10-15T12:52:56.587 に答える
0

マップ上の他のすべてのタイルと同様に、マップが爆発の責任を負う必要があります。結局のところ、数秒後に消える別のタイル タイプがなければ、爆発とは何でしょう?

ゲーム ループが Map オブジェクトの update メソッドを呼び出すと、マップは次のことを理解する必要があります。

  • 爆弾はどのタイルにありますか
  • 到達距離を爆弾に尋ねる
  • 爆弾が到達できる隣接するタイルにあるものを把握します

デザインは一連のイベントと考えてください。最終的に描画される前に、ゲーム ループで 1 つずつ処理されます。爆弾が投下されるrecieveBomb()と、Map がイベント コントローラーであるという形で、Map にイベントが発生します。

この質問は、Q&A 形式ではなく、ディスカッション形式に適していると思います。全体的なアーキテクチャを理解しないと、「正しい設計」とは何かを判断するのは困難です。

于 2013-10-15T12:49:32.903 に答える