2017-02-13 4 views
2

Je suis à peu près un débutant quand il s'agit de développement de jeux, en particulier avec Libgdx, jusqu'à présent je l'ai fait pour que je puisse charger n'importe quelle carte .tmx ou enregistrer, je suis probablement Je vais essayer de voir comment les terrains générateurs de procédures fonctionnent mais maintenant je reçois cette erreur bizarre quand je supprime un bloc (ce bloc se compose d'un TiledMapTile et d'un body box2d), je le supprime et après la suppression je suis créer une entité plus petite qui sera aussi un corps, qui représente le bloc que je viens de supprimer, comme une goutte pour le joueur, c'est l'erreur que je reçois quand je clique sur un bloc, cela n'arrive qu'après la suppression du premier bloc, donc, un bloc est supprimé et une petite entité est créée, mais si j'essaie de le faire une seconde fois, la partie se casse et cela apparaît:Java Libgdx erreur bizarre avec Textures et Arraylists

Une erreur fatale a été détectée par le Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) à pc = 0x00007ffb8ecd9f58, pid = 6580, tid = 0x0000000000002474

JRE version: Java (TM) SE Runtime Environment (8.0 _121-b13) (build 1.8.0_121-b13) Java VM: machine virtuelle serveur Java 64 bits (25.121-b13 en mode mixte Windows-amd64 compressé) Problème de trame: C [ntdll.dll + 0x39f58 ]

Echec de l'écriture du vidage du noyau. Minidumps ne sont pas activés par défaut sur les versions client de Windows

Un fichier de rapport d'erreur avec plus d'informations est enregistré comme: C: \ Libgdx projets Fedora \ WINDOWS \ Test Generator \ actifs Core \ \ hs_err_pid6580.log

Si vous souhaitez soumettre un rapport de bogue, veuillez visiter: http://bugreport.java.com/bugreport/crash.jsp L'incident est survenu en dehors de la machine virtuelle Java en code natif. Voir le cadre problématique pour savoir où signaler le bogue.

[erreur est survenue lors de rapports d'erreurs, id 0xc0000005]

Ceci est le journal des erreurs:

http://pastebin.com/a8iUH8Rz

C'est là supprimer les blocs:

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); 
     } 
    } 
} 

C'est la classe 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(); 
    } 
} 

Et ceci est l'entité:

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(); 
    } 
} 

Toute aide serait grandement appréciée, il pourrait juste être une chose simple stupide et le code peut être un gâchis en ce moment, mais je ne peux pas sembler contourner ce problème

Répondre

1

Cette erreur se produit généralement lorsqu'un objet est utilisé après son élimination.

Vous utilisez une forme qui a été cédée:

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

Il est préférable de créer et de supprimer le corps physique en boucle séparée.

Créer Liste de l'élément que vous souhaitez créer et d'une autre liste que vous souhaitez supprimer et garder à l'esprit que la création et la suppression doivent être effectuées lorsque le monde de la physique est déverrouillé.

private World physicsWorld; 

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

Dans la méthode removeBodyFromWorld() supprimer votre entité désirée et créer un nouveau corps dans la méthode addBodyIntoWorld().

+0

ouais finalement j'ai essayé de séparer les choses, j'ai également découvert que le problème est que les textures ne sont pas analysées par les méthodes, donc ce qui causait le problème était quand j'ai rendu le nouveau bloc – Gawhisper

+0

chaque entité ayant propre spriteBatch, regardant très étrange? – Aryan