Android LibGdx使身体跳跃

Android LibGdx使身体跳跃,android,libgdx,box2d,game-physics,Android,Libgdx,Box2d,Game Physics,我写了下面的代码来让身体跳跃和其他一些事情,但问题是身体只跳跃到一定的极限,而且只有球员的身体不受重力的影响,所以我将重力比例增加到100 请给出跳跃和重力的解 public class Shoot implements ApplicationListener { private OrthographicCamera camera; private World world; private Box2DDebugRenderer renderer; private

我写了下面的代码来让身体跳跃和其他一些事情,但问题是身体只跳跃到一定的极限,而且只有球员的身体不受重力的影响,所以我将重力比例增加到100 请给出跳跃和重力的解

public class Shoot implements ApplicationListener {
    private OrthographicCamera camera;
    private World world;
    private Box2DDebugRenderer renderer;
    private short x, y;
    private float g;
    private SpriteBatch batch;
    private ChainShape groundshape;
    private BodyDef bdef;
    private FixtureDef fdef;
    private Body player;
    private PolygonShape pshape;
    private CircleShape cshape;
    private Vector2 v;
    private ArrayList<Body> d;
    private ArrayList<Body> bullet;
    private Sprite bsprite;
    private boolean right = true;
    private Body enemy;
    private byte l = 3;

    @Override
    public void create() {
        d = new ArrayList<Body>();
        bullet = new ArrayList<Body>();
        dimensions();
        camera();
        renderer();
        world();
        batch();
        input();
        ground();
        player();
        enemy();
        collisions();
        bricks(4, -6);
        sprites();

    }

    @Override
    public void dispose() {
        batch.dispose();
        world.dispose();
        renderer.dispose();
        pshape.dispose();
        cshape.dispose();

    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);
        world.step(1 / 60f, 8, 3);
        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        for (int i = 0; i < bullet.size(); i++) {
            bsprite.setPosition(
                    bullet.get(i).getPosition().x - bsprite.getWidth() / 2f,
                    bullet.get(i).getPosition().y - bsprite.getHeight() / 2f);
            if (bullet.get(i).getLinearVelocity().y == 200)
                bsprite.rotate90(false);
            bsprite.draw(batch);
        }
        batch.end();
        for (int i = 0; i < d.size(); i++) {
            world.destroyBody(d.get(i));
            d.remove(i);
            i -= 1;
        }
        player.setLinearVelocity(v);

        camera.position.x = player.getPosition().x;
        camera.update();
        renderer.render(world, camera.combined);

    }

    @Override
    public void resize(int width, int height) {
        camera.viewportWidth = width / 25f;
        camera.viewportHeight = height / 25f;
        camera.update();
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }

    private void world() {
        world = new World(new Vector2(0, -9.81f), true);

    }

    private void dimensions() {
        x = (short) Gdx.graphics.getWidth();
        y = (short) Gdx.graphics.getHeight();
        g = (float) ((y * 14 / 720f) * (6 / 7f));
    }

    private void renderer() {
        renderer = new Box2DDebugRenderer();
    }

    private void camera() {
        camera = new OrthographicCamera(x / 25f, y / 25f);

    }

    private void batch() {
        batch = new SpriteBatch();
    }

    private void input() {
        Gdx.input.setInputProcessor(new InputProcessor() {

            @Override
            public boolean touchUp(int screenX, int screenY, int pointer,
                    int button) {
                return false;
            }

            @Override
            public boolean touchDragged(int screenX, int screenY, int pointer) {
                return false;
            }

            @Override
            public boolean touchDown(int screenX, int screenY, int pointer,
                    int button) {

                bullet();
                return false;
            }

            @Override
            public boolean scrolled(int amount) {
                return false;
            }

            @Override
            public boolean mouseMoved(int screenX, int screenY) {
                return false;
            }

            @Override
            public boolean keyUp(int keycode) {
                if (keycode == Keys.D || keycode == Keys.A) {
                    v.x = 0;
                }
                return false;
            }

            @Override
            public boolean keyTyped(char character) {
                return false;
            }

            @Override
            public boolean keyDown(int keycode) {
                if (keycode == Keys.ESCAPE) {
                    Gdx.app.exit();
                }
                if (keycode == Keys.D) {
                    v.x = 15;
                    right = true;
                }
                if (keycode == Keys.A) {
                    v.x = -15f;
                    right = false;
                }
                if (keycode == Keys.SPACE) {
                    player.applyLinearImpulse(new Vector2(0, 50000),
                            player.getLocalCenter(), true);
                }
                return false;
            }
        });
    }

    private void ground() {
        bdef = new BodyDef();
        bdef.type = BodyType.StaticBody;
        bdef.allowSleep = true;
        groundshape = new ChainShape();
        groundshape.createChain(new Vector2[] { new Vector2(-x, -g),
                new Vector2(x, -g) });
        fdef = new FixtureDef();
        fdef.shape = groundshape;
        fdef.restitution = 0f;
        fdef.friction = 0f;
        fdef.density = 0.5f;
        world.createBody(bdef).createFixture(fdef);
        groundshape.dispose();
    }

    private void player() {
        v = new Vector2(0, 0);
        bdef.type = BodyType.DynamicBody;
        bdef.allowSleep = true;
        bdef.fixedRotation = true;
        bdef.gravityScale = 100;
        bdef.position.x = 0f;
        bdef.position.y = -g + 2f;
        pshape = new PolygonShape();
        pshape.setAsBox(1, 2);
        fdef.shape = pshape;
        fdef.friction = 0f;
        fdef.restitution = 0f;
        fdef.density = 1f;
        player = world.createBody(bdef);
        player.createFixture(fdef);
        cshape = new CircleShape();
        cshape.setPosition(new Vector2(0, 3.1f));
        cshape.setRadius(1f);
        fdef.shape = cshape;
        player.createFixture(fdef);
    }

    private void bricks(float x, float y) {
        bdef.type = BodyType.StaticBody;
        bdef.allowSleep = true;
        bdef.position.x = x;
        bdef.position.y = y;
        fdef.density = 0.5f;
        fdef.restitution = 0f;
        pshape.setAsBox(3, 1);
        fdef.shape = pshape;
        fdef.friction = 0f;
        world.createBody(bdef).createFixture(fdef);

    }

    private void collisions() {
        world.setContactListener(new ContactListener() {

            @Override
            public void preSolve(Contact contact, Manifold oldManifold) {

            }

            @Override
            public void postSolve(Contact contact, ContactImpulse impulse) {
                if (contact.getFixtureA().getShape().getType() == cshape
                        .getType()
                        || contact.getFixtureB().getShape().getType() == cshape
                                .getType()) {
                    v.y = 0;
                }
                if (contact.getFixtureA().getBody().isBullet()) {
                    d.add(contact.getFixtureA().getBody());
                    bullet.remove(bullet.indexOf(contact.getFixtureA()
                            .getBody()));
                }
                if (contact.getFixtureB().getBody().isBullet()) {
                    d.add(contact.getFixtureB().getBody());
                    bullet.remove(bullet.indexOf(contact.getFixtureB()
                            .getBody()));
                }
                if ((contact.getFixtureA().getBody().equals(enemy) && contact
                        .getFixtureB().getBody().isBullet())
                        || contact.getFixtureB().getBody().equals(enemy)
                        && contact.getFixtureA().getBody().isBullet()) {
                    enemy.setLinearVelocity(0, 0);
                    l--;
                    if (l == 0) {
                        d.add(enemy);
                    }
                }
            }

            @Override
            public void endContact(Contact contact) {

            }

            @Override
            public void beginContact(Contact contact) {

            }
        });
    }

    private void bullet() {
        bdef.type = BodyType.DynamicBody;
        bdef.allowSleep = true;
        bdef.bullet = true;
        bdef.fixedRotation = true;
        bdef.gravityScale = 0;
        pshape.setAsBox(0.25f, 0.15f);
        if (right && !Gdx.input.isKeyPressed(Keys.W)) {
            bdef.position.x = player.getPosition().x + 1.6f;
            bdef.position.y = player.getPosition().y + 1f;

        } else if (!right && !Gdx.input.isKeyPressed(Keys.W)) {
            bdef.position.x = player.getPosition().x - 1.6f;
            bdef.position.y = player.getPosition().y + 1f;

        } else if (Gdx.input.isKeyPressed(Keys.W)) {
            bdef.position.x = player.getPosition().x;
            bdef.position.y = player.getPosition().y + 4.5f;
            pshape.setAsBox(0.15f, 0.25f);

        }
        fdef.density = 0.4f;
        fdef.shape = pshape;
        fdef.restitution = 0f;
        fdef.friction = 0f;
        bullet.add(world.createBody(bdef));
        bullet.get(bullet.size() - 1).createFixture(fdef);
        if (right && !Gdx.input.isKeyPressed(Keys.W)) {
            bullet.get(bullet.size() - 1).setLinearVelocity(50, 0);
        } else if (!right && !Gdx.input.isKeyPressed(Keys.W)) {
            bullet.get(bullet.size() - 1).setLinearVelocity(-50, 0);

        } else if (Gdx.input.isKeyPressed(Keys.W)) {
            bullet.get(bullet.size() - 1).setLinearVelocity(0, 50);

        }

    }

    private void sprites() {
        bsprite = new Sprite(new Texture("data/bullet.jpg"));
        bsprite.setOrigin(bsprite.getWidth() / 2f, bsprite.getHeight() / 2f);
        bsprite.rotate(0);
        bsprite.setSize(0.5f, 0.30f);
    }

    private void enemy() {
        bdef.type = BodyType.DynamicBody;
        bdef.allowSleep = true;
        bdef.fixedRotation = true;
        bdef.gravityScale = 100;
        bdef.position.x = 7f;
        bdef.position.y = -g + 2f;
        pshape = new PolygonShape();
        pshape.setAsBox(1, 2);
        fdef.shape = pshape;
        fdef.friction = 0f;
        fdef.restitution = 0f;
        fdef.density = 1f;
        enemy = world.createBody(bdef);
        enemy.createFixture(fdef);
        cshape = new CircleShape();
        cshape.setPosition(new Vector2(0, 3));
        cshape.setRadius(1f);
        fdef.shape = cshape;
        enemy.createFixture(fdef);
    }

}

在渲染方法中使用player.setLinearVelocity会阻碍身体的运动,设置y方向的线速度始终为0

此代码很难阅读。。。也许你可以把它减少到一些重要的部分?@现在没有人减少了除了删除的导入,没有什么改变。如果你只发布400行完全没有文档的代码,没有人会帮你solved@springrbua这是我应用脉冲后的答案。渲染方法中的setLinearVelocity方法会在所有方向上将速度设置为0。哦,对不起。我不明白这一点。听起来好像这是另一个问题^^抱歉!