java - PlayN JBox2D Y 速度增加但发生碰撞

标签 java box2d collision playn jbox2d

所以我看到了一个非常奇怪的问题。

使用展示中的 PlayN 豌 bean 演示,我组装了一个简单的应用程序 - 我有一个动态实体掉落到静态实体上,但我无法弄清楚为什么它不弹跳。

在做了一些打印输出后,我发现碰撞正在发生 - y 位置保持不变,但 y 速度不断增加

这是我在动态实体中的更新代码

  @Override
  public void paint(float alpha) {
    float x = (body.getPosition().x * alpha) + (previousX * (1f - alpha));
    float y = (body.getPosition().y * alpha) + (previousY * (1f - alpha));
    float w = (body.getAngle() * alpha) + (previousRotationAngle * (1f - alpha));
    if (body.m_type == BodyType.DYNAMIC) {
      System.out.println("body x = " + body.getPosition().x + ", y = " + body.getPosition().y);
      System.out.println("velocity x = " + body.m_linearVelocity.x + ", y = "
      + body.m_linearVelocity.y);
    }
    imageLayer.setTranslation(x, y);
    imageLayer.setRotation(w);
  }

  @Override
  public void update(float delta) {
    previousX = body.getPosition().x;
    previousY = body.getPosition().y;
    previousRotationAngle = body.getAngle();
  }

这是打印输出 - 正如您所看到的,速度不断上升,但 y 位置保持不变,为 8.46

  [java] body x = 17.024979, y = 0.5199691
 [java] velocity x = 0.0, y = 1.2983631
 [java] body x = 17.024979, y = 0.79601336
 [java] velocity x = 0.0, y = 2.562787
 [java] body x = 17.024979, y = 0.8908453
 [java] velocity x = 0.0, y = 2.8736944
 [java] body x = 17.024979, y = 0.99586946
 [java] velocity x = 0.0, y = 3.18255
 [java] body x = 17.024979, y = 0.99586946
 [java] velocity x = 0.0, y = 3.18255
 [java] body x = 17.024979, y = 1.1110185
 [java] velocity x = 0.0, y = 3.489367
 [java] body x = 17.024979, y = 1.2362258
 [java] velocity x = 0.0, y = 3.794159
 [java] body x = 17.024979, y = 1.2362258
 [java] velocity x = 0.0, y = 3.794159
 [java] body x = 17.024979, y = 1.3714248
 [java] velocity x = 0.0, y = 4.096939
 [java] body x = 17.024979, y = 1.5165496
 [java] velocity x = 0.0, y = 4.3977213
 [java] body x = 17.024979, y = 1.6715348
 [java] velocity x = 0.0, y = 4.696518
 [java] body x = 17.024979, y = 1.6715348
 [java] velocity x = 0.0, y = 4.696518
 [java] body x = 17.024979, y = 1.8363149
 [java] velocity x = 0.0, y = 4.993343
 [java] body x = 17.024979, y = 2.0108259
 [java] velocity x = 0.0, y = 5.2882085
 [java] body x = 17.024979, y = 2.195003
 [java] velocity x = 0.0, y = 5.581128
 [java] body x = 17.024979, y = 2.388783
 [java] velocity x = 0.0, y = 5.8721147
 [java] body x = 17.024979, y = 2.388783
 [java] velocity x = 0.0, y = 5.8721147
 [java] body x = 17.024979, y = 2.5921018
 [java] velocity x = 0.0, y = 6.1611805
 [java] body x = 17.024979, y = 2.5921018
 [java] velocity x = 0.0, y = 6.1611805
 [java] body x = 17.024979, y = 2.804897
 [java] velocity x = 0.0, y = 6.4483385
 [java] body x = 17.024979, y = 3.0271058
 [java] velocity x = 0.0, y = 6.733601
 [java] body x = 17.024979, y = 3.0271058
 [java] velocity x = 0.0, y = 6.733601
 [java] body x = 17.024979, y = 3.2586663
 [java] velocity x = 0.0, y = 7.016981
 [java] body x = 17.024979, y = 3.4995165
 [java] velocity x = 0.0, y = 7.298491
 [java] body x = 17.024979, y = 3.4995165
 [java] velocity x = 0.0, y = 7.298491
 [java] body x = 17.024979, y = 3.7495952
 [java] velocity x = 0.0, y = 7.5781426
 [java] body x = 17.024979, y = 4.0088415
 [java] velocity x = 0.0, y = 7.8559484
 [java] body x = 17.024979, y = 4.277195
 [java] velocity x = 0.0, y = 8.131921
 [java] body x = 17.024979, y = 4.5545955
 [java] velocity x = 0.0, y = 8.406072
 [java] body x = 17.024979, y = 4.5545955
 [java] velocity x = 0.0, y = 8.406072
 [java] body x = 17.024979, y = 4.840983
 [java] velocity x = 0.0, y = 8.678413
 [java] body x = 17.024979, y = 4.840983
 [java] velocity x = 0.0, y = 8.678413
 [java] body x = 17.024979, y = 5.1362987
 [java] velocity x = 0.0, y = 8.948957
 [java] body x = 17.024979, y = 5.440483
 [java] velocity x = 0.0, y = 9.217716
 [java] body x = 17.024979, y = 5.440483
 [java] velocity x = 0.0, y = 9.217716
 [java] body x = 17.024979, y = 5.753478
 [java] velocity x = 0.0, y = 9.484701
 [java] body x = 17.024979, y = 6.0752254
 [java] velocity x = 0.0, y = 9.749924
 [java] body x = 17.024979, y = 6.0752254
 [java] velocity x = 0.0, y = 9.749924
 [java] body x = 17.024979, y = 6.4056673
 [java] velocity x = 0.0, y = 10.013396
 [java] body x = 17.024979, y = 6.7447467
 [java] velocity x = 0.0, y = 10.275129
 [java] body x = 17.024979, y = 7.0924063
 [java] velocity x = 0.0, y = 10.535135
 [java] body x = 17.024979, y = 7.0924063
 [java] velocity x = 0.0, y = 10.535135
 [java] body x = 17.024979, y = 7.4485893
 [java] velocity x = 0.0, y = 10.793425
 [java] body x = 17.024979, y = 7.8132396
 [java] velocity x = 0.0, y = 11.05001
 [java] body x = 17.024979, y = 7.8132396
 [java] velocity x = 0.0, y = 11.05001
 [java] body x = 17.024979, y = 8.186301
 [java] velocity x = 0.0, y = 11.304901
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 11.55811
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 11.55811
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 11.8096485
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 12.059526
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 12.059526
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 12.307755
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 12.554346
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 12.554346
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 12.799309
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 13.042655
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 13.042655
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 13.284395
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 13.52454
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 13.7631
 [java] body x = 17.024979, y = 8.465522
 [java] velocity x = 0.0, y = 13.7631
 [java] body x = 17.024979, y = 8.465522

这是一个图像 - 花是我的测试动态实体 - 它显然停在砖上,但我不明白为什么速度继续上升

enter image description here


我不知道还有什么其他代码在这里会有帮助 - 我的设置几乎与展示中的 Peas 演示相同 - 以至于我从展示演示中删除了一些内容并且无法重新创建问题就在于此。

我在这里百分百不知所措,因为这是一个物理问题,它有点阻碍我的进步。豌 bean 演示完全可以工作

任何帮助将不胜感激 - 我已经尝试了 4 个小时,现在尝试了我能想到的所有方法,但没有任何效果


编辑添加的主要世界级(这绝对是相当难看 - 请不要评判我)

public class LevelWorld implements ContactListener, Paintable, Updatable, Destroyable {

  private static final float PHYSICS_UNITS_PER_PIXEL = PhysicsScale.PHYSICS_UNITS_PER_PIXEL
  .getScaleFactor();

  private final playn.core.GroupLayer worldLayer;

  private final Context context;
  private final World world;
  private final float frameRate;

  private final List<playn.core.GroupLayer> groupLayers;
  private final List<Entity> entities;
  private final Stack<Contact> contacts;
  private final Map<Body, PhysicsEntity> bodies;

  public LevelWorld(Level level, Context context) {
    worldLayer = graphics().createGroupLayer();
    worldLayer.setScale(1.F / PHYSICS_UNITS_PER_PIXEL);
    this.context = context;
    final Integer fps = (Integer) context.get(FPS);
    this.frameRate = 1.F / fps.floatValue();
    final Vec2 gravity = new Vec2(0.F, 10.0F);
    world = new World(gravity, true);
    world.setWarmStarting(true);
    world.setAutoClearForces(true);
    groupLayers = new ArrayList<playn.core.GroupLayer>();
    entities = new ArrayList<Entity>();
    contacts = new Stack<Contact>();
    bodies = new HashMap<Body, PhysicsEntity>();
    for (final GroupLayer groupLayer : level) {
      final playn.core.GroupLayer gl = graphics().createGroupLayer();
      gl.setDepth(groupLayer.getDepth());
      gl.setScale(groupLayer.getScaleFactor());
      groupLayers.add(gl);
      for (final Entity entity : groupLayer.getEntities()) {
        if (entity instanceof PhysicsEntity) {
          final FixtureDef fixtureDef = new FixtureDef();
          final BodyDef bodyDef = new BodyDef();
          if (PhysicsType.DYNAMIC.equals(entity.getEntityMetadata().getPhysicsType())) {
            bodyDef.type = BodyType.DYNAMIC;
          } else if (PhysicsType.STATIC.equals(entity.getEntityMetadata().getPhysicsType())) {
            bodyDef.type = BodyType.STATIC;
          }
          final Body body = world.createBody(bodyDef);
          fixtureDef.shape = entity.getEntityMetadata().getShape();
          fixtureDef.density = 0.4f;
          fixtureDef.friction = 0.1f;
          fixtureDef.restitution = 0.5f;
          body.setLinearDamping(0.2f);
          body.createFixture(fixtureDef);
          body.setTransform(new Vec2(entity.getPosition().x, entity.getPosition().y),
          entity.getRotationAngle());
          ((PhysicsEntity) entity).setBody(body);
          bodies.put(body, (PhysicsEntity) entity);
        }
        gl.add(entity.getImageLayer());
      }
      entities.addAll(groupLayer.getEntities());
      worldLayer.add(gl);
    }
    graphics().rootLayer().add(worldLayer);
    world.setContactListener(this); // kinda sketchy
  }

  @Override
  public void beginContact(Contact contact) {
    System.out.println("BEGIN CONTACT HAPPENED");
    contacts.push(contact);
  }

  @Override
  public void endContact(Contact contact) {

  }

  @Override
  public void preSolve(Contact contact, Manifold oldManifold) {

  }

  @Override
  public void postSolve(Contact contact, ContactImpulse impulse) {

  }

  @Override
  public void destroy() {
    worldLayer.destroy();
  }

  @Override
  public void update(float delta) {
    // worldLayer.setOrigin(worldLayer.originX() + (delta / 250.F),
    // worldLayer.originY());
    for (final Entity entity : entities) {
      entity.update(delta);
    }
    world.step(0.033F, 10, 10);
    // processContacts();
  }

  @Override
  public void paint(float alpha) {
    for (final Entity entity : entities) {
      entity.paint(alpha);
    }
  }

  private void processContacts() {
    while (!contacts.isEmpty()) {
      final Contact contact = contacts.pop();
      final PhysicsEntity a = bodies.get(contact.m_fixtureA.m_body);
      final PhysicsEntity b = bodies.get(contact.m_fixtureB.m_body);

      if (a != null && b != null) {
        if (a instanceof PhysicsEntity.IsContactListener) {
          ((PhysicsEntity.IsContactListener) a).contact(b);
        }
        if (b instanceof PhysicsEntity.IsContactListener) {
          ((PhysicsEntity.IsContactListener) b).contact(a);
        }
      }
    }
  }
}

最佳答案

万一有人遇到这个问题 - 经过一整天半的尝试解决这个问题并创建一个单独的简单项目,将 1 个动态实体放到一个静态实体上,并看到它做了同样的事情。

如果您看到这种情况发生在实体停止移动但速度不断增加的地方 - 您放入的碰撞形状是向后的 - 我有 4 个顶点按 0,1,2,3 的顺序放入形状中 - 如果我把它们设置为 3,2,1,0 就可以了。我想如果您遇到同样类型的问题,请尝试颠倒创建形状的顺序,看看碰撞是否有效。

关于java - PlayN JBox2D Y 速度增加但发生碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13329906/

相关文章:

java - 可以无限地创建和删除实体吗?

javascript - 与二维碰撞有关的四叉树

Java - 如何使用 XML Pull Parser 轻松解析 XML?

java:在 BigInteger 的情况下 for 循环如何工作

java - 空值的 Spring 格式化程序

java - Box2D - 落体在重力作用下不加速

c++ - 如何转换 box2d 返回的 void 指针?

java - 如何从java中捕获的异常返回到特定点

algorithm - circle-AABB 包含测试

java - 在 Java 中通过 Maps.newHashMapWithExpectedSize(...) 限制 Map 的大小会导致冲突