繁体   English   中英

(更新)碰撞 box2d 后如何停止物体

[英](updated) How to stop bodies after collision box2d

如何停止的力作用在动态物体与动态物体碰撞 在此处输入图片说明

我期望在碰撞的那一刻,一个body可以移动body2,碰撞后body2会停止。 我尝试了很多次,通过 ContactListener、地面摩擦和玩家活动状态来解决这个问题。 不幸的是,我无法解决这个问题。 有谁知道这应该如何工作?

我没有看到附加代码的意义,但无论如何我都会这样做:

public class GameScreen implements Screen {
  ... 
  Player player;
  Player player2;
  
  @Override 
  public void show() {
    ... 
    world = new World(new Vector2(0, 0f), true);
    
    player = new Player(world);
    player2 = new Player(world);
    
    moveDirection = new MoveDirection(player);
    shotDirection = new ShotDirection(player);
    ... 
  }
  
  @Override
  public void render(float delta) {
    world.step(1f/60f, 6, 2); 
    player.update();
    player2.update();
    ... 
  }
  ... 
}
public class Player {
  private final float PIXELS_TO_METERS = 100f;  
  private Sprite sprite;
  private World world;
  private Body body;
  ... 
  
  public Body getBody() 
  public void createBody() {
    BodyDef bodyDef = new BodyDef();
    bodyDef.type = BodyDef.BodyType.DynamicBody;
    bodyDef.fixedRotation = true;
    bodyDef.position.set(
      sprite.getX() / PIXELS_TO_METERS, 
      sprite.getY() / PIXELS_TO_METERS 
    );
    body = world.createBody(bodyDef);
    
    CircleShape shape = new CircleShape();
    shape.setRadius((long) (20) / PIXELS_TO_METERS);
    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.shape = shape;
    fixtureDef.density = 0.1f; 
    body.createFixture(fixtureDef);
    shape.dispose();  
  }  
  public void update() {
    if(!isBodyCreated) {
      createBody();
      isBodyCreated = true;
    }
    //Previously used:
    /*if(!isActive()) {
      body.setLinearVelocity(0, 0);
    }*/
    ... 
  }
  ... 
}
  

谢谢阅读。

编辑:好的,我找到了一个解决方案,但它有延迟,我能做些什么来解决它? 在此处输入图片说明

public class GameScreen implements Screen {
  ...
  @Override
  public void render(float delta) {
    world.step(1f/60f, 6, 2); 
    player.update();
    player2.update();
    ...
  } 
  ... 
} 

public class MoveDirection extends Actor {
  ... 
  addListener(new InputListener() {
    ... 
    @Override
    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {   
      ... 
      player.setActive(true);
      ... 
    } 
    ... 
    @Override
    public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
      ... 
      player.setActive(false); 
      player.getBody().setLinearVelocity(0, 0);
    } 
  ... 
} 

public class Player {
  private boolean active = false;
  ... 
  public void createBody() {
    BodyDef bodyDef = new BodyDef();
    bodyDef.type = BodyDef.BodyType.DynamicBody;
    bodyDef.fixedRotation = true;
    bodyDef.position.set(
      (sprite.getX()) / PIXELS_TO_METERS, 
      (sprite.getY()) / PIXELS_TO_METERS 
    );
    body = world.createBody(bodyDef);
    CircleShape shape = new CircleShape();
    shape.setRadius((long) (20) / PIXELS_TO_METERS);
    fixtureDef = new FixtureDef();
    fixtureDef.shape = shape;
    fixtureDef.density = 0.1f; 
    //fixtureDef.restitution = 0; 
    body.createFixture(fixtureDef);
    shape.dispose();  
    body.setBullet(true);
    body.setUserData("player");
  }  
  public void setActive(boolean bool) {
    this.active = bool;
  }
  public boolean isActive() {
    return this.active;
  }  
  public boolean isContact() {
    boolean isContact = false;
    for(Contact contact : world.getContactList()) {
      if((contact.getFixtureA().getBody() == this.body || contact.getFixtureB().getBody() == this.body) && (contact.getFixtureA().getBody().getUserData() == "player" && contact.getFixtureB().getBody().getUserData() == "player")) {
        isContact = true;
        break;
      } 
    }
    return isContact; 
  } 
  public void update() {
    ... 
    if(!isContact() && !isActive()) {
      body.setLinearVelocity(0, 0);
    } 
  }
} 

我对box2d没有任何经验,所以我不能给出详细的答案。 但也许这就是要实现 EndContact 和 PostSolve 方法的地方。

https://www.iforce2d.net/b2dtut/collision-anatomy

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM