2017-02-13 3 views
2

ゲーム開発、特にLibgdxの初心者ですが、これまでのところ、.tmxマップをロードしたり保存したりすることができます手続き的に地形を生成する方法を試してみようとしていますが、今はブロックを削除するとこの奇妙なエラーが発生します(そのブロックはTiledMapTileとbox2dボディで構成されています)、削除していますそれは、ブロックをクリックすると、最初のブロックが削除された後に起こるエラーです。これは、削除されたブロックを表しています。したがって、1つのブロックが削除され、小さなエンティティが作成されますが、2回目にしようとすると、ゲームが中断し、これが表示されます。テクスチャとArraylistsのJava Libgdx奇妙なエラー

致命的なエラーには、Javaランタイム環境によって検出された:

EXCEPTION_ACCESS_VIOLATION(0xc0000005)にPC = 0x00007ffb8ecd9f58、PID = 6580、TID = 0x0000000000002474

JREバージョンで:のJava(TM)SEランタイム環境(8.0 Java HotSpot(TM)64ビットサーバVM(25.121-b13混合モードwindows-amd64圧縮済みのoops) 問題のあるフレーム: C [ntdll.dll + 0x39f58 ]

コアダンプの書き込みに失敗しました。 C:\ LibgdxプロジェクトのFedora \ WINDOWS \ジェネレータテスト\コア\資産hs_err_pid6580.log

\ミニダンプがWindows

のクライアントバージョンではデフォルトで有効になっていませんより多くの情報とエラーレポートファイルは次のように保存されますバグレポートを提出したい場合は、 http://bugreport.java.com/bugreport/crash.jsp ネイティブコードでJava仮想マシン外でクラッシュが発生しました。 バグを報告する場所については、問題のあるフレームを参照してください。

[エラーはエラー報告、ID 0xc0000005で中に発生した]

これは、エラーログです:

http://pastebin.com/a8iUH8Rz

私はブロックを削除する場所です:

public void destroyTerrain(ArrayList<Block> terrain, ArrayList<BlockDrop> blockDropsList) { 

    int x = Gdx.input.getX()/32; 
    int y = (Gdx.graphics.getHeight() - Gdx.input.getY())/32; 

    Iterator<Block> iterator = terrain.iterator(); 
    while (iterator.hasNext()) { 
     Block block = iterator.next(); 
     if (x == (int) block.getBody().getPosition().x && y == (int) block.getBody().getPosition().y) { 

      PolygonShape shape = (PolygonShape) block.getBody().getFixtureList().get(0).getShape(); 

      world.destroyBody(block.getBody()); 
      iterator.remove(); 
      TiledMapTileLayer.Cell cell = ((TiledMapTileLayer) map.getLayers().get(0)).getCell(x, y); 

      Texture tex = cell.getTile().getTextureRegion().getTexture(); 

      // this is where the error is happening, when I'm creating a second blockDrop 
      BlockDrop blockDrop = new BlockDrop(screen, x, y, shape.getRadius() * 16, shape.getRadius() * 16); 
      blockDrop.setTexture(tex); 
      blockDropsList.add(blockDrop); 
      cell.setTile(null); 
     } 
    } 
} 

これはBlockDropクラスです:

public class BlockDrop extends Entity { 

    public BlockDrop(PlayGame screen, int x, int y, float width, float height) { 
     super(screen); 
     posX = x; 
     posY = y; 

     type = BodyDef.BodyType.DynamicBody; 
     density = 0.2f; 
     friction = 0.4f; 

     shape = new PolygonShape(); 
     ((PolygonShape) shape).setAsBox(width, height, new Vector2((x/32) + width * 2, (y/32) + height * 2), 0); 
     createBody(); 
    } 
} 

そして、これは、Entityです:

abstract public class Entity { 

    private PlayGame screen; 

    float posX, posY; 

    private Body body; 

    Shape shape; 
    BodyDef.BodyType type; 
    float density; 
    float friction; 

    SpriteBatch batch; 
    Sprite sprite; 

    Entity(PlayGame screen) { 
     this.screen = screen; 

     batch = new SpriteBatch(); 
     sprite = new Sprite(); 
    } 

    void createBody() { 
     BodyDef bodyDef = new BodyDef(); 

     bodyDef.type = type; 
     bodyDef.position.set(posX, posY); 

     body = screen.getWorld().createBody(bodyDef); 
     body.setUserData(this); 

     FixtureDef fixtureDef = new FixtureDef(); 

     fixtureDef.shape = shape; 
     fixtureDef.density = density; 
     fixtureDef.friction = friction; 
     body.createFixture(fixtureDef); 
     dispose(); 
    } 

    public void setTexture(Texture tex){ 
     sprite.setTexture(tex); 
    } 

    public void render() { 
     sprite.setBounds(posX, posY, shape.getRadius(), shape.getRadius()); 
     batch.begin(); 
     sprite.draw(batch); 
     batch.end(); 
    } 

    public String toString() { 
     return getClass().getSimpleName(); 
    } 

    public Body getBody() { 
     return body; 
    } 

    public void dispose() { 
     shape.dispose(); 
     batch.dispose(); 
    } 
} 

任意の助けをいただければ幸いです、それは単純なダムのものかもしれないと、コードは今混乱かもしれないが、私はように見えることはできませんこれを回避してください

答えて

1

このエラーは、通常、オブジェクトを廃棄した後に使用されている場合に発生します。

あなたは配置された形状を使用している:

iterator.remove(); 
... 
BlockDrop blockDrop = new BlockDrop(screen, x, y, shape.getRadius() * 16, shape.getRadius() * 16); 
0

それは別のループ内で物理学のボディを作成したり削除すると良いでしょう。

作成するアイテムのリストと削除したいリストのリストを作成します。物理ワールドがロックされていない場合は、作成と削除を実行する必要があります。

private World physicsWorld; 

if(!physicsWorld.isLocked()) { 
     removeBodyFromWorld();  
     addBodyIntoWorld(); 
} 

removeBodyFromWorld()方法でご希望のエンティティを削除し、addBodyIntoWorld()方法で新しいボディを作成します。

+0

結局私は物事を分離しようとしましたが、テクスチャがメソッドを通して解析されていないということも問題であることがわかりましたので、問題を引き起こしていたのは新しいブロックをレンダリングしたときです。 – Gawhisper

+0

各エンティティは、奇妙な? – Aryan