2016-06-02 5 views
1

私はScene2DとTiledでLibGDXを使用して2Dゲームを作成しています。私は、オブジェクトレイヤーを読み込んでゲームにロードするクラスを持っています(これはまだシングルトンにするかどうかを決定しています)。問題は、すべてが更新されるクラスでは、更新を分割して2つのクラスにレンダリングしたいので、public static Stage stageがあり、静的でないようにしたいと考えています。静的変数を削除するにはどうしたら、変数を引き続きグローバルに呼び出すことができますか?

私は、 のプレイヤーとモンスターを含むMobクラスを持っており、ゲーム内のすべてのオブジェクトを にして衝突をチェックするにはステージクラスが必要です。

私のMobクラスでは、それは抽象クラスであり、呼び出されるたびにプレーヤクラスのステージに置かなければならないので、コンストラクタにStageをパラメータとして追加するとは思っていません。

私はあなたがウィザードではないことを知っているので、追加情報が必要な場合は、私はできるだけ早くそれを置くでしょう。私はここで働いている3つのクラス、TiledMapHelperクラス、WorldControllerクラス、Mobクラスを持っています。

以下は、作成したレベルをTiledで私のゲームのコード化可能なオブジェクトに変換するクラスです。静的ArrayListsはステージクラスに実装されるGroupクラスに変更されます。ステージクラスは、ゲーム内のすべてのオブジェクトを保持します。

public class TiledMapHelper { 
    public static final int TILE_WIDTH = 512; 
    public static final int MAP_WIDTH = 39 * TILE_WIDTH; 
    public static final int MAP_HEIGHT = 45 * TILE_WIDTH;` 

    public static ArrayList<Platform> platforms; 
    public static ArrayList<Wall> walls; 
    public static ArrayList<Door> doors; 
    public static ArrayList<Stair> stairs; 
    public static ArrayList<Ladder> ladders; 

    private TiledMap tiledMap; 

    public TiledMapHelper(TiledMap tiledMap) { 
     this.tiledMap = tiledMap; 

     initWalls(); 
     initGates(); 
     initPlatforms(); 
    } 

    public void initWalls() { 
     walls = new ArrayList<Wall>(); 
     MapObjects layerObjects = tiledMap.getLayers().get("walls").getObjects(); 
     for (MapObject mapObject : layerObjects) { 
      if (mapObject instanceof RectangleMapObject) { 
       Rectangle rect = ((RectangleMapObject) mapObject).getRectangle(); 
       Wall wall = new Wall(rect.x, rect.y, rect.width, rect.height); 
       walls.add(wall); 
      } 
     } 
    } 

    public void initGates() { 
     doors = new ArrayList<Door>(); 
     stairs = new ArrayList<Stair>(); 
     ladders = new ArrayList<Ladder>(); 
     MapObjects layerObjects = tiledMap.getLayers().get("gates").getObjects(); 
     for (MapObject mapObject : layerObjects) { 
      if (mapObject instanceof TiledMapTileMapObject) { 
       if (mapObject.getName() == null) 
        continue; 
       if (mapObject.getName().equals("Door")) { 
        int checkDoorType = Integer.parseInt((String) mapObject.getProperties().get("doorType")); 
        if (checkDoorType == 1) { 
         Door door = new Door(((TiledMapTileMapObject) mapObject).getX(), 
           ((TiledMapTileMapObject) mapObject).getY(), "door1C"); 
         doors.add(door); 
        } 
        if (checkDoorType == 2) { 
         Door door = new Door(((TiledMapTileMapObject) mapObject).getX(), 
           ((TiledMapTileMapObject) mapObject).getY(), "door2C"); 
         doors.add(door); 
        } 
       } 
      } 
      if (mapObject instanceof RectangleMapObject) { 
       Rectangle rect = ((RectangleMapObject) mapObject).getRectangle(); 
       if (mapObject.getName().equals("Stair")) { 
        String checkStairType = (String) mapObject.getProperties().get("isStair"); 
        if (checkStairType.equals("upRight")) { 
         Stair stair = new Stair(rect.x, rect.y, rect.width, rect.height, "upRight"); 
         stairs.add(stair); 
        } 
        if (checkStairType.equals("upLeft")) { 
         Stair stair = new Stair(rect.x, rect.y, rect.width, rect.height, "upLeft"); 
         stairs.add(stair); 
        } 
        if (checkStairType.equals("downRight")) { 
         Stair stair = new Stair(rect.x, rect.y, rect.width, rect.height, "downRight"); 
         stairs.add(stair); 
        } 
        if (checkStairType.equals("downLeft")) { 
         Stair stair = new Stair(rect.x, rect.y, rect.width, rect.height, "downLeft"); 
         stairs.add(stair); 
        } 
       } 
       if (mapObject.getName().equals("Ladder")) { 
        String checkLadderType = (String) mapObject.getProperties().get("isLadder"); 
        if (checkLadderType.equals("up")) { 
         Ladder ladder = new Ladder(rect.x, rect.y, rect.width, rect.height, "up"); 
         ladders.add(ladder); 
        } 
        if (checkLadderType.equals("down")) { 
         Ladder ladder = new Ladder(rect.x, rect.y, rect.width, rect.height, "down"); 
         ladders.add(ladder); 
        } 
       } 
      } 
     } 
    } 

    public void initPlatforms() { 
     platforms = new ArrayList<Platform>(); 
     MapObjects layerObjects = tiledMap.getLayers().get("platforms").getObjects(); 
     for (MapObject mapObject : layerObjects) { 
      if (mapObject instanceof TiledMapTileMapObject) { 
       if (mapObject != null) { 
        String checkPlatformType = (String) ((TiledMapTileMapObject) mapObject).getTile().getProperties().get("platformType"); 
        if (checkPlatformType.equals("left")) { 
         Platform platform = new Platform(((TiledMapTileMapObject) mapObject).getX(), 
           ((TiledMapTileMapObject) mapObject).getY(), "left"); 
         platforms.add(platform); 
        } 
        if (checkPlatformType.equals("middle")) { 
         Platform platform = new Platform(((TiledMapTileMapObject) mapObject).getX(), 
           ((TiledMapTileMapObject) mapObject).getY(), "middle"); 
         platforms.add(platform); 
        } 
        if (checkPlatformType.equals("right")) { 
         Platform platform = new Platform(((TiledMapTileMapObject) mapObject).getX(), 
           ((TiledMapTileMapObject) mapObject).getY(), "right"); 
         platforms.add(platform); 
        } 
       } 
      } 
     } 
    } 
} 

答えて

2

Denfeet、私はあなたがすでに問題に対処するためのいくつかの方法を知っていると言うとき、私は予想外ではないと思うし、あなたは最高のものとしての勧告を求めている。その場合、この回答は通常よりも「一般的なヒント」であるかもしれませんが、あなたのプロジェクトにはメインゲームのメインゲームクラスを全面的にお勧めします。はい、試してもそれを避けることができます。問題はあなたの価値があることです(特にあなたが図書館を勉強しようとしているとき)か?静的メインゲームクラスは、あなたのプロジェクトを作成してlibgdxを学んでいる間も、あなたがまだ抱える多くの問題を解決します。そして、あなたはすべてを書き直す年月がかかりません(私が言っていると思います。間違いを覚えて、私はこれを難しい方法で見つけ出すのに費やした時間を節約しました:-))。
若いプレイヤーにとって唯一の大きな罠は、Androidが静的インスタンスを処理する方法です。すべてのonResumeを再作成して回避します。ハッピーコーディング。

+0

あなたは正しいです、私は自分自身にいくつかの解決策を与えています。私はちょうど私のコードを整理することに問題があると思う。私は衝突を追加するまで、すべてがスムーズに動いていた。それを追加するには2週間ほどかかりましたが、ちょっとした変更を加えるためにコードをリッピングするのに疲れています。これがこの問題を引き起こしたのですが、この小さな静的変数のコードを一括して変更する必要があります。あなたの返事をありがとう、私はそれを自分自身を理解することができる場合は表示されます。 – Denfeet

0

それがであるクラスのコンストラクタを作成し、

+0

ええ、ちょっと質問を編集しました。私はそれをしたくないと言って忘れました。ありがとうtho。 – Denfeet

1

Singletonオブジェクトは静的後ろにインスタンス変数をラップすることができるので、それは、あなたの問題を解決する可能性がありますように思える参照するために、アクセサメソッドを使用しますメソッド呼び出し。私はあなたが解決しようとしている問題は何か分からない。コードを投稿できますか?

EDIT: ステージは次のようになりシングルトンの基本構造:

public class Stage{ 

    //Stage's fields 

    //keep the constructor private 
    private Stage(){ 

    } 

    //Stage's methods 

    private static class StageHolder { 
     //private field of the one Stage object 
     private static final Stage INSTANCE = new Singleton(); 
    } 

    //public static message to access the one Stage 
    public static Stage getInstance() { 
     return StageHolder.INSTANCE; 
    } 
} 
アイデアはプライベート静的フィールドとして Stageのインスタンスを隠し、あなたがする必要があるたび getInstance()方法を使用することです

Stageにアクセスしてください。

+0

確かに、タイルマップレベルをコード化されたオブジェクトに変換するクラスを投稿してください。 – Denfeet

+0

コードを掲示しました。静的ステージ変数はWorldControllerクラスにあります。あなたがコードをシングルトンに変えるのを手伝ってくれれば嬉しいです。 – Denfeet

+0

'Stage'クラスも投稿できますか? @ WonderfulWorldのシングルトンメインゲームクラスを使用するアイデアは、開発するにつれてより小さな側面に置いている限り、機能します。 – binskits

0

すべての暴徒はそれ自身の特定のステージを持っていますか?

私はステージがcreateMobメソッドを持っているといいですが、これはコンフィグレーションのmobをとり、mobを作成する方法です。 mobコンストラクタにstageパラメータを持たせることはできますが、クラスを作成するたびにステージを渡す必要はありません。

例えば:

abstract class Stage { 
    public Mob createMob(MobConfiguration config) { 
     ... // your mob creation method 
     if (config.type == MobConfiguration.TYPE_PLAYER) { 
      return new Player(this, config); 
     } 
    } 
} 
class Player extends Mob { 
    public Player(Stage stage, MobConfiguration config) { 
     // some initialization method 
    } 
} 

それとも、ステージを所有し、他のクラスにcreateMobメソッドを置くことができます。

関連する問題