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 接触到球后立即发生一些事情。该示例代码似乎非常适合这个范围,对吧?毕竟它在我的电脑上工作。
所以,我开始复制相关部分:
- 我在代码开头复制粘贴了所有“导入”;
- 我在 setup();
中添加了 box2d.listenForCollisions();
我还在草图的最底部添加了这两个函数:
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;
首先,检查一下 (link):这是从 github 上的 Processing Box2D 库中获取的示例程序,它在屏幕中央显示一个框(它可以用鼠标四处移动),同时一连串的小球落在上面;每当球击中盒子时,该球就会变成红色。我将四个 .pde 文件复制粘贴到一个 .pde 草图中,运行 它,它工作 完美。
现在,谈谈我的问题。我目前正在使用 Processing 制作游戏:你有一个球、一个玩家 1 和一个玩家 2(两者都可以使用键盘移动)。 Box2D 负责每个球员和球之间的物理交互,我必须说它处理得很好。三个主要 objects 中的每一个都有自己的 class。现在,我希望玩家 1 接触到球后立即发生一些事情。该示例代码似乎非常适合这个范围,对吧?毕竟它在我的电脑上工作。
所以,我开始复制相关部分:
- 我在代码开头复制粘贴了所有“导入”;
- 我在 setup(); 中添加了 box2d.listenForCollisions();
我还在草图的最底部添加了这两个函数:
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;