簡體   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