【问题标题】:Removing Shaperenderer shapes from screen从屏幕上移除 Shaperenderer 形状
【发布时间】:2017-04-28 01:12:55
【问题描述】:

我使用 Shaperenderer (LibGDX) 绘制了不同的形状,并将它们连接到 Box2d 世界物体上,并使它们在重力的作用下下落。我的问题是,一旦它们触到底部,如何将它们从屏幕上移除???谢谢。

感谢凯文的回复。可能我对我的问题不太清楚。我将放一个我的代码的 sn-p 来帮助澄清我的问题:

BodyDef floorDef = new BodyDef(); 
floorDef.type = BodyDef.BodyType.StaticBody;  
floorDef.position.set(0f,0f);

PolygonShape floorShape = new PolygonShape();
floorShape.setAsBox(Gdx.graphics.getWidth(),10f); 
floor = world.createBody(floorDef); 
floor.createFixture(floorShape, 1f); 

BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2);
body = world.createBody(bodyDef);

CircleShape shape = new CircleShape();
shape.setPosition(new Vector2(0f,0f));
shape.setRadius(80f);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 0.5f;
body.createFixture(fixtureDef);

world.setContactListener(new ContactListener() {

            @Override
            public void beginContact(Contact contact) {

                if((contact.getFixtureA().getBody() == body &&
                        contact.getFixtureB().getBody() == floor)
                        ||
                        (contact.getFixtureA().getBody() == floor &&
                                contact.getFixtureB().getBody() == body)) {
                    Colliding = true;
                    collisionSound.play(1.0f);

                }

            }

            @Override
            public void endContact(Contact contact) {


                if((contact.getFixtureA().getBody() == body || contact.getFixtureB().getBody() == body)) {

                    world.destroyBody(body);

                    Colliding = false;

                }
            }

            @Override
            public void postSolve(Contact arg0, ContactImpulse arg1) {

            }

            @Override
            public void preSolve(Contact arg0, Manifold arg1) {

            }
        });

        // Shape is the only disposable of the lot, so get rid of it
        shape.dispose();

        floorShape.dispose();
    }


  @Override
    public void render(float delta) {

        Gdx.gl.glClearColor(1f, 1f, 1f, 1f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        world.step(Gdx.graphics.getDeltaTime(), 6, 2);

        stage.act(Gdx.graphics.getDeltaTime());

        stage.draw();

        shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
        Gdx.gl20.glLineWidth(10);
        shapeRenderer.setColor(Color.CHARTREUSE);
        shapeRenderer.rect(floor.getPosition().x,floor.getPosition().y,Gdx.graphics.getWidth(),10f);
        shapeRenderer.end();
        shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
        Gdx.gl20.glLineWidth(10);
        shapeRenderer.setColor(Color.FOREST);
        shapeRenderer.circle(body.getPosition().x ,body.getPosition().y ,80f);
        shapeRenderer.end();

    }

所以我想删除由星号之间突出显示的 shaperenderer 创建的形状。

【问题讨论】:

  • 到达底部时移除该主体。
  • 你真的在使用 JBox2D 吗?如果是这样,我建议您使用具有更好集成和更好性能的 libGDX box2D 绑定。
  • 感谢 Abishek 的回复。事实上,我从世界中移除了身体,但事实上我将形状的位置归因于身体下落时的位置,因此从世界中移除身体与形状的存在无关。
  • 感谢 mgsx-dev。抱歉,我正在使用 LibGDX Box2d。
  • 您可以使用 libgdx 中提供的名为“ContactListener”的东西来检测与地面的碰撞。一旦检测到碰撞,移除身体。

标签: java android libgdx box2d


【解决方案1】:

从屏幕上移除 ShapeRenderer 形状 -> 我们没有添加任何东西,所以没有移除的概念。就像我们将 Box2d 身体添加到物理世界中,这样我们就可以从该世界中移除身体。

我们正在屏幕上绘制形状,所以不知何故,我必须停止绘制部分。 我的 ShapeRenderer 形状是视图,它的模型是 Box2d 主体,所以当主体到达底部时移除该主体。

private Array<Body> array;

@Override
public void create(){         //create or show depending on who is parent
    array=new ArrayList<Body>();
}

@Override
public void render(float delta) {

    ....
    world.getBodies(array);
    for (Body body:array){
        if(body.getType()== BodyDef.BodyType.DynamicBody) { // I've to draw only circle
            shapeRenderer.circle(body.getPosition().x ,body.getPosition().y ,80f);
        }
    }
} 

【讨论】:

  • 非常感谢阿布舍克
  • 如果我错了,请纠正我 Abhishek 。我从你的sn-p中了解到的是将圆的连续存在置于粘在它上面的身体的存在上。因此,一旦身体从世界中移除,就不会再发生形状的渲染。是这样吗??
  • 去吧!谢谢老哥
猜你喜欢
  • 1970-01-01
  • 2013-07-03
  • 2015-02-09
  • 1970-01-01
  • 2016-03-10
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
相关资源
最近更新 更多