2017-02-13 9 views
2

Я довольно много начинаю, когда дело доходит до разработки игр, особенно с Libgdx, пока я сделал это, поэтому я могу загрузить любую карту .tmx или сохранить ее, я, вероятно, собираюсь попробовать и посмотреть, как работает процессуальное создание ландшафтов, но прямо сейчас я получаю эту странную ошибку, когда я удаляю блок (этот блок состоит из TiledMapTile и body2d), я удаляю его и после удаления я создавая меньшую сущность, которая также будет телом, который представляет собой блок, который я только что удалил, как падение для игрока, это ошибка, которую я получаю, когда я нажимаю на блок, это происходит только после удаления первого блока, поэтому один блок удаляется и создается небольшой объект, но если я попытаюсь сделать это во второй раз, игра перерывается, и появляется следующее:Java Libgdx странная ошибка с текстурами и арреалистами

неисправимая ошибка была обнаружена с помощью Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) при рс = 0x00007ffb8ecd9f58, PID = 6580, TID = 0x0000000000002474

JRE версии: Java (TM) SE Runtime Environment (8.0 _121-b13) (сборка 1.8.0_121-b13) Java VM: Java HotSpot (TM) 64-разрядная серверная VM (25.121-b13 смешанный режим windows-amd64 сжатый oops) Проблемный фрейм: C [ntdll.dll + 0x39f58 ]

Не удалось написать основной дамп. Минидампы не включена по умолчанию на клиентских версиях Windows,

Файл отчета об ошибке с дополнительной информацией сохраняется как: C: \ Libgdx проекты Fedora \ WINDOWS \ Generator Test \ ядро ​​\ активы \ hs_err_pid6580.log

Если вы хотите отправить отчет об ошибке, посетите: http://bugreport.java.com/bugreport/crash.jsp Авария произошла за пределами виртуальной машины Java в собственном коде. См. Проблемную рамку для сообщения об ошибке.

[произошла ошибка при передаче сообщений об ошибках, ид 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

, каждый из которых имеет собственный spriteBatch, странный ? – Aryan

Смежные вопросы