2016-03-31 14 views
0

私はボールを押して簡単なテストアンドロイドアプリを書いた。 私はこのエラーは5-10ボールで発生するエミュレータ上でエラーLibGDX Box2d Androidクラッシュ「致命的な信号11(SIGSEGV)、コード1、フォールトaddr ...」

03-31 17:07:08.414 6778-6778/com.example.balls A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x58 in tid 6778 (bm.examle.balls) 

と私のデバイス上に複数のボール20〜30、アプリのクラッシュを押してください。

私はLibGDXでBox2D物理学を学び始めました。 私はBox2Dが何千ものボディを処理できることを読んだ。

だから、私はBox2Dを使って何かを理解できないと思います。誰も私にいくつかのアドバイスや多くのインタラクティブなボディを持つプログラムの例を教えてもらえますか?

libgdxコアプロジェクトのコード:

public class BallGame extends ApplicationAdapter { 

BallParameters ballParameters; 

volatile boolean stopWorld = false; 

//parameters from Android Application 
public BallGame(BallParameters ballParameters){ 
    this.ballParameters = ballParameters; 
} 

World world; 
Box2DDebugRenderer debugRenderer; 
OrthographicCamera camera; 

//factor to adjust the size 
private final float n = 0.05f; 

@Override 
public void create() { 
    //create camera 
    camera = new OrthographicCamera(Gdx.graphics.getWidth()*n, Gdx.graphics.getHeight()*n); 
    camera.position.set(new Vector3(Gdx.graphics.getWidth()/2f*n, Gdx.graphics.getHeight()/2f*n, 10f)); 
    camera.near = 1f; 
    camera.far = 20f; 
    camera.update(); 
    //create world 
    world = new World(new Vector2(0, -50), true); 
    debugRenderer = new Box2DDebugRenderer(); 
    //It creates borders around the edges of the screen 
    createGround(); 
    createLeftWall(); 
    createRightWall(); 
    createCelling(); 
} 

@Override 
public void render() { 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    debugRenderer.render(world, camera.combined); 
    doPhysicsStep(Gdx.graphics.getDeltaTime()); 
} 

//physics step, (from libgdx documentation https://github.com/libgdx/libgdx/wiki/Box2d#stepping-the-simulation) 
private float accumulator = 0; 
private float TIME_STEP = 1/60f; 
private void doPhysicsStep(float deltaTime) { 
    if(stopWorld) return; 
    float frameTime = Math.min(deltaTime, 0.25f); 
    accumulator += frameTime; 
    while (accumulator >= TIME_STEP) { 
     world.step(TIME_STEP, 6, 2); 
     accumulator -= TIME_STEP; 
    } 
} 

//creates a ball and applies linear impulse with parameters from android application 
//blocks stepping the world during creating ball 
//calls from android application 
public void pushBall(){ 
    stopWorld = true; 
    Body ball = createBall(40*n, 40*n); 
    int velocity = ballParameters.getVelocity(); 
    int angleDeg = ballParameters.getAngle(); 
    int vx = (int) (velocity*Math.cos(Math.toRadians(angleDeg))); 
    int vy = (int) (velocity*Math.sin(Math.toRadians(angleDeg))); 
    ball.applyLinearImpulse(vx, vy, ball.getPosition().x, ball.getPosition().y, true); 
    stopWorld = false; 
} 

//creates a ball in a fixed place 
private Body createBall(float x, float y){ 
    BodyDef bodyDef = new BodyDef(); 
    bodyDef.type = BodyDef.BodyType.DynamicBody; 
    bodyDef.position.set(x, y); 
    Body body = world.createBody(bodyDef); 
    CircleShape circle = new CircleShape(); 
    circle.setRadius(50*n); 
    FixtureDef fixtureDef = new FixtureDef(); 
    fixtureDef.shape = circle; 
    fixtureDef.density = 0f; 
    fixtureDef.friction = 0f; 
    fixtureDef.restitution = 1f; 
    body.createFixture(fixtureDef); 
    circle.dispose(); 
    return body; 
} 

私はあなたが私を助けることができると思います!

答えて

0

メモリに問題があるようです。ボールを押すときに起こるように、最初にpushBallメソッドを調べて調査する必要があります。私はvolatile boolean stopWorldと思う。

は、コードブロックがpushBallへの別の呼び出しによって処理されるまでstopWorldが変更されていないことを確認したい場合は、trueに設定する前stopWorldをチェックする必要があり、あなたがpushBallメソッドを呼び出す場所がわからないが。

public void pushBall() { 
    if(stopWorld) { 
     return; 
    } 

    stopWorld = true; 
    Body ball = createBall(40*n, 40*n); 
    int velocity = ballParameters.getVelocity(); 
    int angleDeg = ballParameters.getAngle(); 
    int vx = (int) (velocity*Math.cos(Math.toRadians(angleDeg))); 
    int vy = (int) (velocity*Math.sin(Math.toRadians(angleDeg))); 
    ball.applyLinearImpulse(vx, vy, ball.getPosition().x, ball.getPosition().y, true); 
    stopWorld = false; 
} 

これで問題が解決しない場合は、stopWorldフィールド定義からvolatileを削除してみてください。

volatile boolean stopWorldからboolean stopWorld

+0

あなたは正しいです。問題は、新しいボールを押している間に表示されます。エラーはワールドオブジェクトの同期に関連しています。私は[this](http://pastebin.com/PSNpbmk9)のようなコードを編集しました。どうもありがとうございました! –

+0

あなたの問題を解決したことを喜んで:) –

関連する問題