Box2D(处理):如何解决'Could not invoke the "beginContact()" method for some reason'错误?

Box2D (Processing): how to solve the 'Could not invoke the "beginContact()" method for some reason' error?

首先,检查一下 (link):这是从 github 上的 Processing Box2D 库中获取的示例程序,它在屏幕中央显示一个框(它可以用鼠标四处移动),同时一连串的小球落在上面;每当球击中盒子时,该球就会变成红色。我将四个 .pde 文件复制粘贴到一个 .pde 草图中,运行 它,它工作 完美。

现在,谈谈我的问题。我目前正在使用 Processing 制作游戏:你有一个球、一个玩家 1 和一个玩家 2(两者都可以使用键盘移动)。 Box2D 负责每个球员和球之间的物理交互,我必须说它处理得很好。三个主要 objects 中的每一个都有自己的 class。现在,我希望玩家 1 接触到球后立即发生一些事情。该示例代码似乎非常适合这个范围,对吧?毕竟它在我的电脑上工作。

所以,我开始复制相关部分:

我还在草图的最底部添加了这两个函数:

void beginContact(Contact cp) {
  Fixture f1 = cp.getFixtureA();
  Fixture f2 = cp.getFixtureB();
  Body b1 = f1.getBody();
  Body b2 = f2.getBody();
  Object o1 = b1.getUserData();
  Object o2 = b2.getUserData();

  if (o1.getClass() == Box.class) {
    Particle p = (Particle) o2;
    p.change();
  } 
  else if (o2.getClass() == Box.class) {
    Particle p = (Particle) o1;
    p.change();
  }
}

void endContact(Contact cp) {
}

我立即将其更改为这个(我基本上重命名了 classes,并替换了 p.change(),该草图中将球变成红色的方法,以及我想要发生的事情正在联系时):

(... same ...)

  if (o1.getClass() == Player.class) {
    Ball p = (Ball) o2;
    //do stuff when contact happens
  } 
  else if (o2.getClass() == Player.class) {
    Ball p = (Ball) o1;
    //do stuff when contact happens
  }
}

void endContact(Contact cp) {
}

但是你猜怎么着?我收到 'Could not invoke the "beginContact()" method for some reason' 错误!我不认为我缺少任何重要的文件或库,因为那个例子在我的电脑上运行良好,我所做的只是复制粘贴和 运行 代码。

我不能在这里粘贴我的整个代码,因为它很大,但我发誓玩家 class(玩家 1 class),敌人 class(玩家 2 class) 和 Ball class 都有它们的固定装置,而且在我的 classes 中几乎没有任何东西与示例草图中的那些有实质性的不同。身体都是动感型的,球员是像例子中的方框一样的长方体,球是纯圆的,就像那里变红的小球一样。

这是怎么回事?我错过了该代码中的重要一行吗?尽管示例代码 运行s 完美地不需要任何额外的文件,但我应该提到控制台还会打印一个 'at shiffman.box2d.Box2DContactListener.beginContact(Box2DContactListener.java:54)' 错误:现在,就像我说的,我不需要计算机中的那个 Box2DContactListener.java 文件来 运行 示例草图...但是无论如何,如果我在线阅读它 (link),我可以看到这是什么它指的是:

public void beginContact(Contact c) {
    if (beginMethod != null) {
        try {
            beginMethod.invoke(parent, new Object[] { c });
        } catch (Exception e) {
            System.out.println("Could not invoke the \"beginContact()\" method for some reason.");
            e.printStackTrace();
            beginMethod = null;
        }
    }
}

你知道这里发生了什么吗?

基本上,在 if 语句之前,您必须检查其中一个对象是否为 'null'。 如果是这样,你只需要打破。 你可以简单地粘贴这个:

if (o1==null || o2==null) return;