[英]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.