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);
}
}