簡體   English   中英

LibGDX - 不出現陰影

[英]LibGDX - shadows don't appear

我嘗試在我的游戲中實現 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);
                }
            }
        }
    }

正如我所說,光已經出現,物理等工作得很好,但沒有陰影可見,盡管世界上添加了身體。 希望任何人都可以幫助我。

哦..是的,我實際上已經通過閱讀這個問題解決了它: 無法獲得 Box2dLigh...使用這篇文章我讓它們工作,但現在只出現在看起來有點奇怪的對象的 0,0 處: Shadow投錯位置

這是我的屏幕類:

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

如果真的很感激你的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM