2016-07-05 25 views
0

我正在對我的動態車身施加線性衝擊力,但是過了某個點後,車身速度停止增加,即。 player.b2body.applyLinearImpulse(new Vector2(0, 1000), player.b2body.getWorldCenter(), true);player.b2body.applyLinearImpulse(new Vector2(0, 10000), player.b2body.getWorldCenter(), true);都產生相同的動作,這並不像我需要精靈移動那麼快。限制box2d在libgdx中的車身速度

有誰知道這可能是爲什麼?相關的課程如下。

PlayScreen.java

public class PlayScreen implements Screen { 
    private BlobGame game; 
    private OrthographicCamera gamecam; 
    private FitViewport gamePort; 
    private Hud hud; 
    private TmxMapLoader mapLoader; 
    private TiledMap map; 
    private OrthogonalTiledMapRenderer renderer; 
    private World world; 
    private Box2DDebugRenderer b2dr; 
    private GoodBlob player; 
    private TweenManager tweenManager; 
    private BadBlob enemy; 

    public PlayScreen(BlobGame game){ 
     this.game = game; 
     gamecam = new OrthographicCamera(); 
     gamePort = new FitViewport(BlobGame.V_WIDTH, BlobGame.V_HEIGHT, gamecam); 
     hud = new Hud(game.batch); 
     mapLoader = new TmxMapLoader(); 
     map = mapLoader.load("game_board.tmx"); 
     renderer = new OrthogonalTiledMapRenderer(map); 
     gamecam.position.set(BlobGame.V_WIDTH/2, BlobGame.V_HEIGHT/2, 0); 
     world = new World(new Vector2(0, 0), true); 
     b2dr = new Box2DDebugRenderer(); 
     new B2WorldCreator(this); 
     player = new GoodBlob(this, 200, 200); 
     enemy = new BadBlob(this, 100, 50); 
     tweenManager = new TweenManager(); 
     world.setContactListener(new WorldContactListener()); 
    } 

    public TiledMap getMap(){ 
     return map; 
    } 

    public World getWorld(){ 
     return world; 
    } 

    public void update(float dt){ 
     handleInput(dt); 
     tweenManager.update(dt); 
     Tween.registerAccessor(GoodBlob.class, new GoodBlobAccessor()); 
     hud.update(dt); 
     world.step(1/60f, 6, 2); 
     player.update(dt); 
     enemy.update(dt); 
     renderer.setView(gamecam); 
    } 

    private void handleInput(float dt){ 
     if (Gdx.input.isKeyJustPressed(Input.Keys.UP)){ 
      player.b2body.applyLinearImpulse(new Vector2(0, BlobGame.GOOD_BLOB_SPEED), player.b2body.getWorldCenter(), true); 
      Tween.set(player, GoodBlobAccessor.ALPHA).target(player.getAngle()).start(tweenManager); 
      Tween.to(player, GoodBlobAccessor.ALPHA, .4f).target(180).start(tweenManager).ease(Back.IN); 
     } else if (Gdx.input.isKeyJustPressed(Input.Keys.DOWN)){ 
      player.b2body.applyLinearImpulse(new Vector2(0, -BlobGame.GOOD_BLOB_SPEED), player.b2body.getWorldCenter(), true); 
      Tween.set(player, GoodBlobAccessor.ALPHA).target(player.getAngle()).start(tweenManager); 
      Tween.to(player, GoodBlobAccessor.ALPHA, .4f).target(0).start(tweenManager).ease(Back.IN); 
     } else if (Gdx.input.isKeyJustPressed(Input.Keys.LEFT)){ 
      player.b2body.applyLinearImpulse(new Vector2(-BlobGame.GOOD_BLOB_SPEED, 0), player.b2body.getWorldCenter(), 
        true); 
      Tween.set(player, GoodBlobAccessor.ALPHA).target(player.getAngle()).start(tweenManager); 
      Tween.to(player, GoodBlobAccessor.ALPHA, .4f).target(270).start(tweenManager).ease(Back.IN); 
     } else if (Gdx.input.isKeyJustPressed(Input.Keys.RIGHT)){ 
      player.b2body.applyLinearImpulse(new Vector2(BlobGame.GOOD_BLOB_SPEED, 0), player.b2body.getWorldCenter(), true); 
      Tween.set(player, GoodBlobAccessor.ALPHA).target(player.getAngle()).start(tweenManager); 
      Tween.to(player, GoodBlobAccessor.ALPHA, .4f).target(90).start(tweenManager).ease(Back.IN); 
     } 
    } 

    @Override 
    public void show() { 

    } 

    @Override 
    public void render(float delta) { 
     update(delta); 
     Gdx.gl.glClearColor(0, 0, 0, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     renderer.render(); 
     b2dr.render(world, gamecam.combined); 
     game.batch.setProjectionMatrix(gamecam.combined); 
     game.batch.begin(); 
     player.draw(game.batch); 
     enemy.draw(game.batch); 
     game.batch.end(); 
     hud.stage.draw(); 

    } 

GoodBlob.java

public class GoodBlob extends Sprite { 
    public World world; 
    public Body b2body; 
    public PlayScreen screen; 
    private Texture goodBlobSmall; 
    private float stateTimer; 
    private float rotation; 

    public GoodBlob(PlayScreen screen, float x, float y) { 
     super(); 
     this.world = screen.getWorld(); 
     this.rotation = 0; 
     stateTimer = 0; 
     defineGoodBlob(); 
     setPosition(x, y); 
     goodBlobSmall = new Texture("blob_1.png"); 
     setBounds(0, 0, 27, 27); 
     setRegion(goodBlobSmall); 
    } 

    public void update(float dt) { 
     setOrigin(getWidth()/2, getHeight()/2); 
     setPosition(b2body.getPosition().x - getWidth()/2, b2body.getPosition().y - getHeight()/2); 
     setRotation(getAngle()); 

     Gdx.app.debug("this", "shown"); 
    } 

    public float getAngle() { 
     return this.rotation; 
    } 

    public void setAngle(float rotation){ 
     this.rotation = rotation; 
    } 

    public void defineGoodBlob() { 
     BodyDef bdef = new BodyDef(); 
     bdef.position.set(100, 100); 
     bdef.type = BodyDef.BodyType.DynamicBody; 
     b2body = world.createBody(bdef); 
     FixtureDef fdef = new FixtureDef(); 
     CircleShape shape = new CircleShape(); 
     shape.setRadius(13); 
     fdef.filter.categoryBits = BlobGame.GOOD_BLOB_BIT; 
     fdef.filter.maskBits = BlobGame.GROUND_BIT | BlobGame.BAD_BLOB_BIT; 
     fdef.shape = shape; 
     b2body.createFixture(fdef); 
    } 
} 

回答

0

問題已經回答了here。我希望這對別人有幫助。