【问题标题】:libGDX - My Box2D Body doesnt jumplibGDX - 我的 Box2D 身体不跳
【发布时间】:2019-05-24 20:04:15
【问题描述】:

我正在尝试使用名为 libGDX 的 java 游戏引擎制作一个小游戏。我已经拿到了播放器,但他不能跳,我不知道为什么。

这是我的 GameScreen 类:

public class GameScreen extends ScreenManager{
    //For the view of the game and the rendering
    private SpriteBatch batch;
    private OrthographicCamera cam;

    //DEBUG
    private Box2DDebugRenderer b2dr;

    //World, Player and so on
    private GameWorld world;
    private Player player;
    private Ground ground;


    public static float w, h;

    public GameScreen(Game game) {
        super(game);
        //vars
        w = Gdx.graphics.getWidth();
        h = Gdx.graphics.getHeight();

        //view and rendering
        batch = new SpriteBatch();
        cam = new OrthographicCamera();
        cam.setToOrtho(false, w/2, h/2);

        //debug
        b2dr = new Box2DDebugRenderer();

        //world, bodies ...
        player = new Player(world);
        ground = new Ground(world);

    }

    @Override
    public void pause() {


    }

    @Override
    public void show() {


    }

    @Override
    public void render(float delta) {
        //clearing the screen
        Gdx.gl.glClearColor(0, 0, 0, 0);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        //updating
        update(Gdx.graphics.getDeltaTime());

        //render
        batch.setProjectionMatrix(cam.combined);

        //debug
        b2dr.render(world.getWorld(), cam.combined);    


    }

    @Override
    public void resize(int width, int height) {


    }

    @Override
    public void hide() {


    }


    @Override
    public void dispose() {


    }

    @Override
    public void onKlick(float delta) {


    }

    public void update(float delta){
        world.update(delta);
        player.keyInput();
        System.out.println(player.getBody().getPosition().x);
        System.out.println(player.getBody().getPosition().y);
    }



}

这是我的 Player 类:

public class Player {
    public static Body body;
    public static BodyDef def;
    private FixtureDef fd;

    //set form
    private PolygonShape shape;

    private GameScreen gs;

    public Player(GameWorld world){
        def = new BodyDef();
        def.fixedRotation = true;
        def.position.set(gs.w / 4, gs.h / 4);
        def.type = BodyType.DynamicBody;

        body = world.getWorld().createBody(def);

        shape = new PolygonShape();
        shape.setAsBox(32 / 2, 32 / 2);

        fd = new FixtureDef();
        fd.shape = shape;
        fd.density = 30;

        body.createFixture(fd);
        shape.dispose();
    }

    public static Body getBody() {
        return body;
    }

    public static BodyDef getDef() {
        return def;
    }

    public static void keyInput(){
        if(Gdx.input.isKeyPressed(Input.Keys.UP)){
            body.applyForceToCenter(0, 900, false);
            System.out.println("PRESSED");
        }
    }



}

这终于是我的 GameWorld 课程了:

public class GameWorld {
    public static World world;

    public GameWorld(){
        world = new World(new Vector2(0f, -10f), false);

    }

    public void update(float delta){
        world.step(1 / 60f, 5, 2);
        System.out.println("WorldUPDATE");
    }

    public static World getWorld() {
        return world;
    }



}

我不知道为什么身体不能跳,如果可以请帮助我(:提前谢谢。

【问题讨论】:

    标签: java libgdx game-engine


    【解决方案1】:

    力会在每个时间步长推动身体,而重力会再次将身体向下推。有一个功能applyLinearImpulse() 在重力干扰之前用它的所有“力”推动它一次。

    当你使用applyForceToCenter()时,身体应该向上推,但与冲动相比,它的过程非常缓慢。

    【讨论】:

    • 好的,非常感谢您的回答。可以举个例子吗?
    • 是的,它成功了!非常感谢,但现在一切看起来都非常缓慢。你也知道怎么解决吗?
    • 这是因为你没有缩放你的播放器尺寸,所以 Box2d 认为它比你看到的要大得多(米而不是像素)。见:stackoverflow.com/questions/17701142/…
    • Ouuuh :D 非常感谢你帮助我 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多