0

我在我的项目中使用 box2dlights,似乎有问题。当我实际RayHandler在程序中使用时,只绘制了灯光,没有绘制纹理。因此,当我RayHandler从渲染循环中删除时,一切正常。我想要绘制光线,然后在其上方绘制纹理。我如何达到这一点?这是代码:

public class GameScreen implements Screen {

private Core core;

private SpriteBatch batch;
private Sprite spiderSprite;
private OrthographicCamera camera;
private RayHandler rayHandler;
private Box2DDebugRenderer debugRenderer;

private World world;
private Body spider, prop;
private PointLight spiderLight;

private Stage stage;

private boolean paused, lost, check;
private int pointsCount;
private float time;


public GameScreen(Core c) {
    core = c;

    stage = new Stage();

    batch = new SpriteBatch();
    camera = new OrthographicCamera();
    camera.setToOrtho(false, core.SCREEN_WIDTH, core.SCREEN_HEIGHT);
    batch.setProjectionMatrix(camera.combined);
    debugRenderer = new Box2DDebugRenderer();

    spiderSprite = core.chars.createSprite("spider");

    world = new World(new Vector2(.0f, -10.0f), true);

    BodyDef spiderDef = new BodyDef();
    spiderDef.type = BodyDef.BodyType.DynamicBody;
    spiderDef.position.set(core.SCREEN_WIDTH / 2, core.SCREEN_HEIGHT / 2);
    spider = world.createBody(spiderDef);
    CircleShape shape = new CircleShape();
    shape.setRadius(core.SCREEN_WIDTH / 15);
    spider.createFixture(shape, .1f);

    BodyDef propDef = new BodyDef();
    propDef.type = BodyDef.BodyType.StaticBody;
    propDef.position.set(core.SCREEN_WIDTH / 2, core.SCREEN_HEIGHT);
    prop = world.createBody(propDef);
    CircleShape propShape = new CircleShape();
    propShape.setRadius(0.1f);
    prop.createFixture(propShape, 1.0f);

    RopeJointDef rope = new RopeJointDef();
    rope.bodyA = spider;
    rope.bodyB = prop;
    rope.maxLength = core.SCREEN_HEIGHT / 2;
    world.createJoint(rope);

    rayHandler = new RayHandler(world);
    rayHandler.setAmbientLight(.5f);

    spiderLight = new PointLight(rayHandler, 100, Color.WHITE, core.SCREEN_WIDTH, 100, 100);
    spiderLight.attachToBody(spider);
}

@Override
public void show() {
    Gdx.input.setInputProcessor(stage);
    stage.addAction(Actions.fadeIn(0.85f));
}

@Override
public void render(float delta) {
    clearScreen();
    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    if (!lost && !paused) {
        updateWorld();
        updateSpider();
    }
    drawSpider();
    stage.act();
    stage.draw();
    batch.end();
}

private void clearScreen() {
    Gdx.gl.glClearColor(0, 0, 0, 0);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

}

private void updateSpider() {
    //spider.setLinearVelocity(Gdx.input.getAccelerometerX() > 0 ? 50.0f : -50.0f, 0.0f); 
    float angle = MathUtils.radiansToDegrees * MathUtils.atan2(core.SCREEN_HEIGHT - spider.getPosition().y, core.SCREEN_WIDTH / 2 - spider.getPosition().x) - 90;
    spiderSprite.setPosition(spider.getPosition().x, spider.getPosition().y);
    spiderSprite.setRotation(angle);
}

private void drawSpider() {
    spiderSprite.draw(batch);
    rayHandler.render();
}

private void updateWorld() {
    world.step(1/60f, 6, 2);
    rayHandler.setCombinedMatrix(camera);
    rayHandler.update();
    time += Gdx.graphics.getDeltaTime();
}

}

我还删除了与问题无关的冗余代码部分。

4

2 回答 2

0

我发现了。RayHandler.render()不能在batch.begin()和之间调用batch.end()

于 2017-04-06T07:05:56.497 回答
0

Stagehas it's ownbatch和 it's own .begin()and .end()。你应该在打电话batch.end();之前打电话stage.draw();

于 2017-04-05T17:39:32.810 回答