LibGDX-不出现阴影

时间:2019-03-05 20:31:27

标签: java libgdx box2dlights

我试图在我的游戏中实现Box2dLights,而且效果也很好。但是,尽管我阅读了许多文章并观看了许多视频,但我还是无法摆脱阴影,但是我只是无法弄清楚我的错误是什么。也许您可以,那就太好了。 这是我的代码:

public class GameScreen implements Screen {

    //Handler
    private Handler handler;

    //Graphics
    private OrthographicCamera camera;
    private Box2DDebugRenderer b2dr;
    private OrthogonalTiledMapRenderer renderer;

    //World
    private RoomStage stage;
    private World world;
    private RayHandler rayHandler;

    //Creatures
    private Player player;

    //Game
    private int level = 0;
    private FPSLogger fps;

    public GameScreen(Handler handler) {
        this.handler = handler;
    }
    //METHODS

    @Override
    public void show() {

        fps = new FPSLogger();

        handler.setLevel(level);

        //Graphics
        camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        camera.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        ScreenViewport viewport = new ScreenViewport(camera);


        //Box2d
        world = new World(new Vector2(0f, 0f), false);
        b2dr = new Box2DDebugRenderer();
        handler.setWorld(world);

        RayHandler.setGammaCorrection(true);
        RayHandler.useDiffuseLight(true);
        rayHandler = new RayHandler(world);
        rayHandler.setAmbientLight(new Color(0f, 0f, 0f,  0.05f));
        rayHandler.setBlurNum(3);
        rayHandler.setShadows(true);

        handler.setRayHandler(rayHandler);



        stage = new RoomStage(handler, viewport, "start");
        handler.setStage(stage);
        Gdx.input.setInputProcessor(stage);
        stage.loadRoom();

        //Creatures
        player = new Player(handler, 12.5f * Global.PPM, 1f * Global.PPM);
        stage.addActor(player);
        stage.setKeyboardFocus(player);

        renderer = new OrthogonalTiledMapRenderer(stage.getMap());

    }

    @Override
    public void render(float delta) {

        update(Gdx.graphics.getDeltaTime());

        //Clear and Update
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);


        camera.update();

        //Render
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        renderer.setView(camera);



        int[] backgroundLayers = new int[] {0, 1};
        int[] foregroundLayers = new int[] {2, 3};

        renderer.render(backgroundLayers);
        stage.draw();
        renderer.render(foregroundLayers);

        rayHandler.setCombinedMatrix(camera);
        rayHandler.setShadows(true);
        rayHandler.update();
        rayHandler.render();
        fps.log();

    }

    public void update(float delta) {
        stage.act(Gdx.graphics.getDeltaTime());
        world.step(1 / 60f, 6, 2);
        rayHandler.update();
    }

    @Override
    public void resize(int width, int height) {

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {
        rayHandler.dispose();
        world.dispose();
        b2dr.dispose();
        stage.dispose();
    }




    //Getters

    public int getLevel() {
        return level;
    }

    public World getWorld() {
        return world;
    }



    //Setters

    public void setLevel(int level) {
        this.level = level;
    }
}

这是灯:

//Light
    rayHandler = handler.getRayHandler();
    for(int x = 0; x < lightLayer.getWidth(); x++) {
        for(int y = 0; y < lightLayer.getHeight(); y++) {
            Cell cell = lightLayer.getCell(x, y);
            if(cell != null && cell.getTile() != null) {
                if(cell.getTile().getId() != 0) {
                    box2dLight.PointLight pl = new box2dLight.PointLight(handler.getRayHandler(), 20, new Color(4f, 1f, 0f, 0.2f), 12 * Global.PPM, x * Global.PPM + Global.PPM / 2, y * Global.PPM + Global.PPM / 2);
                    pl.setXray(false);
                    pl.setActive(true);
                }
            }
        }
    }

正如我所说的那样,光已经出现了,物理等也可以正常工作,但是虽然世界上增加了物体,但是看不到阴影。 希望任何人都能帮助我。

1 个答案:

答案 0 :(得分:0)

哦..是的,我实际上已经通过阅读以下问题解决了它: Unable to get Box2dLigh... 通过这篇文章,我让它们工作了,但是现在唯一出现在看起来有点怪异的对象的0,0处: Shadow casted at the wrong position

这是我的屏幕课程:

private Handler handler;

//Graphics
private OrthographicCamera camera;
private OrthogonalTiledMapRenderer renderer;
private static final int viewportWidth = 768;
private static final int viewportHeight = 768;

// Create a separate camera for box2dlights
OrthographicCamera b2dCam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());


//World
private RoomStage stage;
private World world;
private RayHandler rayHandler;

//Creatures
private Player player;

//Game
private int level = 0;
private FPSLogger fps;

public GameScreen(Handler handler) {
    this.handler = handler;
}
//METHODS

@Override
public void show() {

    fps = new FPSLogger();

    handler.setLevel(level);

    //Graphics
    camera = new OrthographicCamera(viewportWidth, viewportHeight);
    camera.setToOrtho(true, viewportWidth, viewportHeight);
    camera.position.set(0, viewportHeight / 2f, 0);
    camera.update();
    ScreenViewport viewport = new ScreenViewport(camera);

    //Box2d
    world = new World(new Vector2(0f, 0f), false);
    handler.setWorld(world);

    RayHandler.useDiffuseLight(false);
    RayHandler.setGammaCorrection(false);

    rayHandler = new RayHandler(world);
    rayHandler.setWorld(world);
    rayHandler.setAmbientLight(new Color(0f, 0f, 0f,  0.02f));
    rayHandler.setBlurNum(5);

    handler.setRayHandler(rayHandler);
    b2dCam.setToOrtho(true);
    b2dCam.update();


    stage = new RoomStage(handler, viewport, "start");
    handler.setStage(stage);
    Gdx.input.setInputProcessor(stage);
    stage.loadRoom();

    //Creatures
    player = new Player(handler, 12.5f * Global.PPM, 1f * Global.PPM);
    stage.addActor(player);
    stage.setKeyboardFocus(player);

    renderer = new OrthogonalTiledMapRenderer(stage.getMap());

}

@Override
public void render(float delta) {

    update(Gdx.graphics.getDeltaTime());

    //Clear and Update
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);


    camera.update();
    b2dCam.update();

    //Render
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    renderer.setView(camera);



    int[] backgroundLayers = new int[] {0, 1};
    int[] foregroundLayers = new int[] {2, 3};

    renderer.render(backgroundLayers);
    stage.draw();
    renderer.render(foregroundLayers);
    rayHandler.setCombinedMatrix(b2dCam.combined.scale(Global.PPM, Global.PPM, Global.PPM), b2dCam.position.x / Global.PPM + 0.5f, b2dCam.position.y / Global.PPM + 0.5f, b2dCam.viewportWidth * b2dCam.zoom, b2dCam.viewportHeight * b2dCam.zoom);
    rayHandler.updateAndRender();
    fps.log();


}

public void update(float delta) {
    stage.act(Gdx.graphics.getDeltaTime());
    world.step(1 / 60f, 6, 2);
    rayHandler.update();
}

@Override
public void resize(int width, int height) {

}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {
    rayHandler.dispose();
    world.dispose();
    stage.dispose();
}




//Getters

public int getLevel() {
    return level;
}

public World getWorld() {
    return world;
}



//Setters

public void setLevel(int level) {
    this.level = level;
}

此外,这是我的动态/静态物体

private void createBody() {
    BodyDef def = new BodyDef();
    def.type = BodyDef.BodyType.StaticBody;
    def.position.set(getX() / Global.PPM, getY() / Global.PPM);
    def.fixedRotation = true;
    body = handler.getWorld().createBody(def);

    PolygonShape shape = new PolygonShape();
    shape.setAsBox(getWidth() / 2 / Global.PPM, getHeight() / 2 / Global.PPM, new Vector2(0.5f, 0.5f), 0);

    body.createFixture(shape, 0.0f);

    shape.dispose();
}

private Body createBody() {
    BodyDef def = new BodyDef();
    def.type = BodyDef.BodyType.DynamicBody;
    def.position.set(getX() / Global.PPM, getY() / Global.PPM);
    def.fixedRotation = false;
    body = handler.getWorld().createBody(def);
    body.setLinearDamping(10f);
    PolygonShape shape = new PolygonShape();
    shape.setAsBox(getWidth() / 2 / Global.PPM, getHeight() / 2 / Global.PPM);

    body.createFixture(shape, 0.0f);
    shape.dispose();

    return body;
}

灯光不再具有* Global.PPM(即32):

pl = new PointLight(handler.getRayHandler(), 100, color, 12, x, y);

如果真的感谢您的帮助!

相关问题