Box2d用不同的屏幕尺寸照亮不同的行为

时间:2018-03-11 08:48:31

标签: java libgdx light box2dlights

我试着用灯光玩一点,但很快我就发现了一些我不理解的怪异行为。任何人都可以向我解释,为什么会发生这种情况,如果是故意的,或者我做错了什么。

在第一张图像上,光线很少通过障碍物(这也很奇怪)。

Game screen wider

当屏幕尺寸变为较低宽度时,光线会越过障碍物。

红色背景是“黑条”,因为我使用FitViewport。 “真实”的世界已经遍布badlogic.jpg。

Game screen narrow

在接下来的图片中,您可以看到,如果没有灯光渲染,它的工作原理 - 无论屏幕大小如何,屏幕都呈现相同的世界(仅缩放)。多数民众赞成,即使有照明,我也希望它能够发挥作用。

enter image description here

enter image description here

该项目是标准的,由libgdx项目生成器生成。我的所有代码都只是一个类,所以我可以在这里上传:

package com.gobanit.sandbox.main;

import com.badlogic.ashley.core.Engine;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.CircleShape;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.PolygonShape;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport;

import box2dLight.PointLight;
import box2dLight.RayHandler;

public class SandboxTestGame extends ApplicationAdapter {
    SpriteBatch batch;
    World world;
    Engine engine;
    Viewport viewport;
    Box2DDebugRenderer debugRenderer;
    Texture texture;
    RayHandler rayHandler;

    Body playerBody;

    @Override
    public void create () {
        batch = new SpriteBatch();
        texture = new Texture(Gdx.files.internal("badlogic.jpg"));
        engine = new Engine();
        world = new World(new Vector2(0, 0), true);
        viewport = new FitViewport(1000, 500);
        viewport.getCamera().position.set(new Vector3(0, 0, 0));
        debugRenderer = new Box2DDebugRenderer();   
        rayHandler = new RayHandler(world);
        rayHandler.setShadows(true);

        createPlayerBody();
        createObstacleBody();       

        PointLight l1 = new PointLight(rayHandler, 100, null, 500, 0, 0);
        l1.attachToBody(playerBody);
        //l1.setSoft(true);

        //new PointLight(rayHandler, 100, null, 500, 0, 200);

    }

    private void createObstacleBody() {
        BodyDef bodyDef = new BodyDef();
        bodyDef.position.add(new Vector2(-10000, 100));
        bodyDef.type = BodyType.StaticBody;

        Body body = world.createBody(bodyDef);

        FixtureDef fixDef = new FixtureDef();
        PolygonShape shape = new PolygonShape();
        shape.set(new float[] {0f,0f,0f,40f,20000f,40f,20000f,0f});
        fixDef.shape = shape;

        body.createFixture(fixDef);

        body.setActive(true);       
    }

    private void createPlayerBody() {
        BodyDef bodyDef = new BodyDef();
        bodyDef.position.add(new Vector2(100, 50));
        bodyDef.type = BodyType.DynamicBody;

        Body body = world.createBody(bodyDef);

        FixtureDef fixDef = new FixtureDef();
        CircleShape circle = new CircleShape();
        circle.setRadius(20);
        fixDef.shape = circle;

        body.createFixture(fixDef);

        body.setActive(true);

        playerBody = body;      
    }



    @Override
    public void render () {
        update();
        draw();
    }

    private void draw() {
        Gdx.gl.glClearColor(100, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        viewport.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

        batch.setProjectionMatrix(viewport.getCamera().combined);
        batch.begin();
        batch.draw(texture, -1000, -1000, 2000, 2000);
        batch.end();

        debugRenderer.render(world, viewport.getCamera().combined);

        rayHandler.setCombinedMatrix((OrthographicCamera) viewport.getCamera());
        rayHandler.render();    
    }

    private void update() {
        world.step(1f/60f, 8, 3);
        rayHandler.update();

        if(Gdx.input.isKeyPressed(Keys.D)) {
            //viewport.getCamera().position.add(new Vector3(1,0,0));
            playerBody.applyForceToCenter(100, 0, true);
        }
        if(Gdx.input.isKeyPressed(Keys.A)) {
            //viewport.getCamera().position.add(new Vector3(-1,0,0));
            playerBody.applyForceToCenter(-100, 0, true);
        }
        if(Gdx.input.isKeyPressed(Keys.W)) {
            //viewport.getCamera().position.add(new Vector3(0,1,0));
            playerBody.applyForceToCenter(0, 100, true);
        }
        if(Gdx.input.isKeyPressed(Keys.S)) {
            //viewport.getCamera().position.add(new Vector3(0,-1,0));
            playerBody.applyForceToCenter(0, -100, true);
        }   

        viewport.getCamera().position.set(new Vector3(playerBody.getPosition().x, playerBody.getPosition().y, 0));
    }

    @Override
    public void dispose () {
        batch.dispose();
        texture.dispose();
        world.dispose();
        debugRenderer.dispose();
        rayHandler.dispose();
    }
}

非常感谢。如果需要更多信息,请告诉我,我将编辑问题。

0 个答案:

没有答案