我尝试在我的游戏中实现 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);
}
}
}
}
正如我所说,光已经出现,物理等工作正常,但是虽然世界上添加了物体,但没有可见的阴影。希望任何人都可以帮助我。