gpt4 book ai didi

java - libgdx 和 Box2d 碰撞优化

转载 作者:行者123 更新时间:2023-12-01 12:13:19 24 4
gpt4 key购买 nike

我是 Libgdx 的新手,我对进行碰撞/移动的最佳方式有点困惑。这让我很困扰,除非我知道我没有以错误的方式做事,否则我似乎无法继续前进。

这是我当前正在使用的类(class)。

public class Play extends GameState{
public Play(GameStateManager {
super(gsm);
world = new World(new Vector2(0, -9.81f), true);
b2dr = new Box2DDebugRenderer();

cl = new MyContactListener();
world.setContactListener(cl);

createPlayer();

b2dCam = new OrthographicCamera();
b2dCam.setToOrtho(false, Game.V_WIDTH / PPM, Game.V_HEIGHT / PPM);
}

public void update(float dt) {

handleInput();

player.update(Gdx.graphics.getDeltaTime());

world.step(dt, 6, 2);
}

public void render() {
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);

cam.update();

tmr.setView(cam);
tmr.render();

sb.setProjectionMatrix(cam.combined);
player.render(sb);

b2dr.render(world, b2dCam.combined);
}



public void handleInput() {
if(MyInput.isPressed(MyInput.BUTTON1)){
if(cl.isPlayerOnGround()){
player.getBody().applyForceToCenter(0, 150, true);
}
}



if(MyInput.isDown(MyInput.BUTTON2)){
if(cl.isPlayerOnGround())
player.setVelocity(new Vector2(1, player.getVelocity().y));
else if(Math.abs(player.getVelocity().y) < .3)
player.getBody().applyLinearImpulse(.15f, 0, player.getPosition().x, player.getPosition().y, true);
}else{
if(MyInput.isDown(MyInput.BUTTON3)){
if(cl.isPlayerOnGround()) {
player.setVelocity(new Vector2(-1, player.getVelocity().y));
}else if(Math.abs(player.getVelocity().y) < .3){
player.getBody().applyLinearImpulse(-.15f, 0, player.getPosition().x, player.getPosition().y, true);
}
}else{
if(cl.isPlayerOnGround())
player.setVelocity(new Vector2(0, player.getVelocity().y));
}
}
}
}

我的 Player 类扩展了这个

public class AnimationHandler {
protected Body body;
protected Animation animation;
protected float width;
protected float height;

private float time;



public AnimationHandler(Body body){
this.body = body;
animation = new Animation(1/12f);
}

public void setAnimation(TextureRegion[] region, float delay){
animation = new Animation(delay, region);
width = region[0].getRegionWidth();
height = region[0].getRegionHeight();
}

public void render(SpriteBatch sb){
time += Gdx.graphics.getDeltaTime();

sb.begin();
sb.draw(
animation.getKeyFrame(time, true),
body.getPosition().x * B2DVars.PPM - width / 2,
body.getPosition().y * B2DVars.PPM - width / 2
);
sb.end();
}

public Body getBody() {
return body;
}

所以我想看的主要内容是第一个类(Play)方法handleInput()。我目前正在使用player.setVelocity()作为运动。这对我来说是它自动执行左右行走的碰撞处理。我承认它效果很好。但我希望有人对此发表意见,我一直觉得我这样做的方式存在缺陷。我正在考虑的一个缺陷是,如果我有一款平台游戏类型的游戏,想要跳上一个平台,但当我回来时降落在平台上,我不确定这是否可能。因为它是自己进行碰撞,而不是手动碰撞正在做。有什么想法吗?任何意见都将非常感激,我是游戏编程的新手,我希望以尽可能最好的方式做事。

最佳答案

我想说 Box2D 非常适合制作平台游戏(我从自己的经验中知道)。这里描述了一个很好的起点:http://www.badlogicgames.com/wordpress/?p=2017

另外,尽量避免创建不必要的新对象,以减少GC压力: player.setVelocity(new Vector2(1,player.getVelocity().y));

这每次都会创建一个新的 Vector2,应该避免,因为它会生成垃圾。在本例中 body.setLinearVelocity(vx, vy);会更好

关于java - libgdx 和 Box2d 碰撞优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27157124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com