简体   繁体   English

LibGDX - 不出现阴影

[英]LibGDX - shadows don't appear

I tried to implement Box2dLights in my game and it also works pretty well.我尝试在我的游戏中实现 Box2dLights,它也运行良好。 But I cannot get shadows working although I read a lot of articles and watched a lot of videos but I just cannot figure out what my mistake is.但是,尽管我阅读了很多文章并观看了很多视频,但我无法使阴影起作用,但是我无法弄清楚我的错误是什么。 Maybe you can, this would be just great.也许你可以,这会很棒。 Here is my code:这是我的代码:

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;
    }
}

And here are the lights:这是灯:

//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);
                }
            }
        }
    }

As I said light is already appearing and physics etc. work just fine but there is not shadow visible although there're bodies added to the world.正如我所说,光已经出现,物理等工作得很好,但没有阴影可见,尽管世界上添加了身体。 Hope anyone can help me.希望任何人都可以帮助我。

Oh.. yeah I actually kind of solved it already by reading this question: Unable to get Box2dLigh... Using this post I got them working, but now the only appear at 0,0 of the object which looks kind of weird: Shadow casted at the wrong position哦..是的,我实际上已经通过阅读这个问题解决了它: 无法获得 Box2dLigh...使用这篇文章我让它们工作,但现在只出现在看起来有点奇怪的对象的 0,0 处: Shadow投错位置

Here is my Screen-Class:这是我的屏幕类:

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;
}

Furthermore, here are my dynamic / static bodies此外,这是我的动态/静态机构

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;
}

The lights have no longer got the * Global.PPM (which is 32):灯不再有 * Global.PPM(即 32):

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

If really would appreciate your help!如果真的很感激你的帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM