2016-12-31 7 views
0

私はlibGDXで最初のタイルマップ作成者を作成していたとき、非常に奇妙なバグに気付きました。LibGDX非常に奇妙なバグ - オブジェクトが消えた

private static final int GRID_WIDTH=2400; 
private static final int GRID_HEIGHT=2400; 
private static final int CELL_SIZE=60; 

このように、2400/60x2400/60のオブジェクトやセルがあることがわかります。

private void createMap(){ 
    cells = new Cell[GRID_WIDTH/CELL_SIZE][GRID_HEIGHT/CELL_SIZE]; 

    for(int i=0;i<GRID_WIDTH/CELL_SIZE;++i){ 
     for(int j=0;j<GRID_HEIGHT/CELL_SIZE;++j){ 
      cells[i][j]=new Cell(textures[0],i*CELL_SIZE,j*CELL_SIZE); 
     } 
    } 
} 

私は画面内で自分のデバッグの座標を持っているので、どこに消え始めたのか分かります。 Y座標は0から2400までOKですが、Xでは1500で消え始めました。そこに描画を開始すると、すべての列がそのテクスチャに表示されます(たとえば、x = 2100は消えた列がすべて2100に見えるようになります)、そのテクスチャを削除すると、すべての列が再び1500に消えてしまいます。オブジェクトは存在しますが、表示されません。誰もがこのバグについて知っているので、それはとても迷惑なのですか?

enter image description here

と私はそこにいくつかのテクスチャ

enter image description here

を追加するとき、これは[編集する:あなたが見ることができるように

は、座標は一番下に、これが最初である残っていますカメラ付きコード:

 private float x=GRID_WIDTH/2,y=GRID_HEIGHT/2; 

     @Override 
     public void render(float delta) { 
      batch = new SpriteBatch(); 
      camera=new OrthographicCamera(CAM_WIDTH,CAM_HEIGHT); 
      viewPos = new Vector3(); 

      Gdx.gl.glClearColor(0, 0, 0, 1); 
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
      viewPos.set(Gdx.input.getX(), Gdx.input.getY(), 0); 
      camera.unproject(viewPos); 

      batch.begin(); 

      if(Gdx.input.isKeyPressed(Input.Keys.RIGHT) || Gdx.input.isKeyPressed(Input.Keys.D)) 
       x+=SPEED*Gdx.graphics.getDeltaTime(); 
      if(Gdx.input.isKeyPressed(Input.Keys.LEFT) || Gdx.input.isKeyPressed(Input.Keys.A)) 
       x-=SPEED*Gdx.graphics.getDeltaTime(); 
      if(Gdx.input.isKeyPressed(Input.Keys.UP) || Gdx.input.isKeyPressed(Input.Keys.W)) 
       y+=SPEED*Gdx.graphics.getDeltaTime(); 
      if(Gdx.input.isKeyPressed(Input.Keys.DOWN) || Gdx.input.isKeyPressed(Input.Keys.S)) 
       y-=SPEED*Gdx.graphics.getDeltaTime(); 
      stage.act(Gdx.graphics.getDeltaTime()); 
      stage.draw(); 

      camera.position.set(x,y,0); 
      camera.update(); 
      batch.setProjectionMatrix(camera.combined); 
      batch.end(); 
     } 
+0

表示されたコードが正しいように見えます。どのようにカメラを動かしているのか教えてください。私はまだそれを証明することはできませんが、私のスパイダーセンスはカメラの問題があると私に言っています。 – John

+0

カメラの設定でコードを編集しました:) – user3396072

答えて

2

カメラが正しいです。問題はbatch.begin()batch.end()です。あなたが知っているかもしれないが、batch.begin()shaperenderer.begin()のうちの1つを閉じることなく互いに直接後にすることはできません。この理由は、私は約100%ではありません。 stageも同様です。これはまた、それは、renderメソッド内でこの

batch = new SpriteBatch(); 
camera=new OrthographicCamera(CAM_WIDTH,CAM_HEIGHT); 

を行うにはひどいです、私たちがステージに

batch.end(); 
stage.draw(); 
batch.begin(); 
// draw your batch stuff here 

を描画する前にバッチを閉じてしなければならないことを意味します。代わりに、create()メソッドまたは独自のinitializeメソッドのいくつかに配置します。重要なのは、バッチがGCによって収集されないため、フレームごとに新しいSpriteBatchを作成しないことです。したがって、手動でbatch.dispose()を使用して処理する必要があります。そうしないと、RAMが無くなってしまいます。

私はこれがあなたを助けてくれたことを祈っています。

+0

申し訳ありませんが、私のプロジェクトを単純化し、不正なコードをレンダリングしました。しかし、私は元のコードでそれをしない:)非常にバッチのソリューションをありがとう:) – user3396072