JavaLibgdx纹理和数组列表的奇怪错误



当涉及到游戏开发时,我几乎是一个初学者,尤其是使用Libgdx,到目前为止,我制作它是为了加载或保存任何.tmx地图,我可能会尝试看看生成地形的程序是如何工作的,但现在我在删除一个块时遇到了这个奇怪的错误(该块由TiledMapTile和box2d主体组成),我正在删除它,删除后我将创建一个较小的实体,它也将是一个实体,代表我刚刚删除的块,作为玩家的一个下拉框,这是我点击块时遇到的错误,它只发生在第一个块被删除后,所以,一个块被删除,一个小实体被创建,但如果我尝试第二次这样做,游戏中断,出现以下内容:

Java运行时环境检测到致命错误:

异常_ACCESS_VIOLATION(0xc0000005),pc=0x00007ffb8ecd9f58,pid=6580,tid=0x0000000000002474

JRE版本:Java(TM)SE运行时环境(8.0_121-b13)(内部版本1.8.0_112-b13)Java虚拟机:Java HotSpot(TM)64位服务器虚拟机(25.121-b13混合模式windows-amd64压缩oops)有问题的框架:C[ntdll.dll+0x39f58]

无法写入核心转储。默认情况下,在客户端版本的Windows 上未启用小型转储

包含详细信息的错误报告文件另存为:C: \Libgdx Projects Fedora\WINDOWS\Generator Test\core\assets\hs_err_pid6580.log

如果您想提交错误报告,请访问: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();
}
}

这就是实体:

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

任何帮助都将不胜感激,这可能只是一件简单而愚蠢的事情,代码现在可能一团糟,但我似乎无法绕过这个

此错误通常发生在处理对象后使用对象时。

您正在使用已处理的形状:

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

最好在单独的循环中创建和删除物理体。

创建要创建的项目列表和要删除的另一个列表,同时请记住,物理世界解锁时必须执行创建和删除。

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

removeBodyFromWorld()方法中,删除所需实体并在addBodyIntoWorld()方法中创建新实体。

最新更新