带有纹理和ArrayList的Java Libgdx错误
对于游戏开发,我基本上是一个初学者,尤其是对于Libgdx,到目前为止,我制作它是为了可以加载任何.tmx地图或保存它,我可能会尝试看看程序生成地形是如何工作的,但现在我在删除一个块(该块由平铺贴图和box2d主体组成)时遇到了一个奇怪的错误,我正在删除它,在删除之后我创建了一个更小的实体,它也将是一个实体,代表我刚刚删除的块,作为对玩家的删除,这是我在单击块时遇到的错误,它只发生在删除第一个块之后,因此,删除一个块并创建一个小实体,但如果我再次尝试,游戏就会中断,出现以下情况: Java运行时环境检测到一个致命错误: pc=0x00007ffb8ecd9f58、pid=6580、tid=0x0000000000002474处的异常访问(0xc0000005) JRE版本:Java(TM)SE运行时环境(8.0_121-b13)(build 1.8.0_121-b13) Java虚拟机:Java热点(TM)64位服务器虚拟机(25.121-b13混合模式windows-amd64压缩oops) 有问题的框架: C[ntdll.dll+0x39f58] 无法写入核心转储。默认情况下,在客户端版本的Windows上不启用小型转储 包含详细信息的错误报告文件另存为: C:\Libgdx Projects Fedora\WINDOWS\Generator Test\core\assets\hs\u err\u pid6580.log 如果您想提交错误报告,请访问: 崩溃发生在Java虚拟机外部的本机代码中。 有关报告错误的位置,请参见问题框 [错误报告期间发生错误,id 0xc0000005] 这是错误日志: 这是我删除块的地方:带有纹理和ArrayList的Java Libgdx错误,java,arraylist,libgdx,textures,Java,Arraylist,Libgdx,Textures,对于游戏开发,我基本上是一个初学者,尤其是对于Libgdx,到目前为止,我制作它是为了可以加载任何.tmx地图或保存它,我可能会尝试看看程序生成地形是如何工作的,但现在我在删除一个块(该块由平铺贴图和box2d主体组成)时遇到了一个奇怪的错误,我正在删除它,在删除之后我创建了一个更小的实体,它也将是一个实体,代表我刚刚删除的块,作为对玩家的删除,这是我在单击块时遇到的错误,它只发生在删除第一个块之后,因此,删除一个块并创建一个小实体,但如果我再次尝试,游戏就会中断,出现以下情况: Java运行时
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 );
}
}
}
这就是实体:
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()
方法中创建新的实体。是的,最终我尝试了分离东西,我还发现问题是纹理没有通过这些方法进行解析,所以问题的原因是当我渲染新的块时,每个实体都有自己的spriteBatch,看起来非常奇怪?
private World physicsWorld;
if(!physicsWorld.isLocked()) {
removeBodyFromWorld();
addBodyIntoWorld();
}