Java 通过LibGDX使用Box2D getContactList时遇到问题
我遇到了一些问题,因为Java 通过LibGDX使用Box2D getContactList时遇到问题,java,box2d,libgdx,Java,Box2d,Libgdx,我遇到了一些问题,因为getContactList返回的一些联系人似乎不是真正的联系人 相关代码: List < Contact > contacts = theBall.body.getWorld().getContactList(); //get all contacts in current world if (contacts.size() == 0) selected = -1; // if there are no contacts, set select
getContactList
返回的一些联系人似乎不是真正的联系人
相关代码:
List < Contact > contacts = theBall.body.getWorld().getContactList(); //get all contacts in current world
if (contacts.size() == 0) selected = -1; // if there are no contacts, set selected to -1, meaning no menu item is selected
/* loop through all contacts */
for (Contact con: contacts) {
Fixture fixtureA = con.getFixtureA();
Fixture fixtureB = con.getFixtureB();
LogapPlatform lplat = LogapUtils.cast(fixtureA.getBody().getUserData(), fixtureB.getBody().getUserData(), LogapPlatform.class);
LogapBall lball = LogapUtils.cast(fixtureA.getBody().getUserData(), fixtureB.getBody().getUserData(), LogapBall.class);
/* check if the contact is between a LogapBall object and a LogapPlatform object */
if (lball != null && lplat != null) {
/* if true, determine which of the five menu platforms the ball has been placed on top of */
for (int i = 0; i < LogapLevel.ctrPlat.size(); i++) {
if (lplat.equals(LogapLevel.ctrPlat.get(i)) && (lball.getPos().y > lplat.getPos().y)) {
selected = (int) Math.floor(i / 5); // set selected to the "id" of the selected menu platform
}
}
} else {
selected = -1; // if false, set selected to -1
}
}
/* "NEW GAME" is the only menu item currently implemented. its "id" = 2 */
if (selected == 2)
LogapGame.font.setColor(Color.YELLOW); // if the ball is placed on top of the menu platform for NEW GAME, set the font color of the text to yellow
else
LogapGame.font.setColor(Color.PINK); // else, keep the text pink
/* draw the text on the screen */
if (logLev.menuLevel) {
LogapGame.font.draw(batch, "NEW GAME", 135, 150);
LogapGame.font.setColor(LogapGame.GRAY_192);
}
Listcontacts=theBall.body.getWorld().getContactList()//获取当前世界中的所有联系人
如果选择了(contacts.size()==0)=-1;//如果没有联系人,则将selected设置为-1,表示未选择任何菜单项
/*通过所有触点循环*/
用于(联系人con:联系人){
Fixture fixtureA=con.getFixtureA();
Fixture fixtureB=con.getFixtureB();
LogapPlatform lplat=LogapUtils.cast(fixtureA.getBody().getUserData(),fixtureB.getBody().getUserData(),LogapPlatform.class);
LogapBall lball=LogapUtils.cast(fixtureA.getBody().getUserData(),fixtureB.getBody().getUserData(),LogapBall.class);
/*检查触点是否位于LogapBall对象和LogapPlatform对象之间*/
if(lball!=null&&lplat!=null){
/*如果为真,确定球放在五个菜单平台中的哪个平台上*/
对于(int i=0;ilplat.getPos().y)){
selected=(int)Math.floor(i/5);//将selected设置为所选菜单平台的“id”
}
}
}其他{
selected=-1;//如果为false,则将selected设置为-1
}
}
/*“新游戏”是当前实现的唯一菜单项。其“id”=2*/
如果(所选==2)
LogapGame.font.setColor(Color.YELLOW);//如果球被放置在新游戏的菜单平台顶部,则将文本的字体颜色设置为黄色
其他的
LogapGame.font.setColor(Color.PINK);//否则,保持文本为粉红色
/*在屏幕上绘制文本*/
如果(logLev.menuLevel){
LogapGame.font.draw(批处理,“新游戏”,135150);
LogapGame.font.setColor(LogapGame.GRAY_192);
}
要查看这段代码的运行情况(以及我遇到的问题),这里有一个视频示例来说明(顺便说一句,我启用了Box2DebugRenderer):
所以,正如你可能已经看到的,我遇到的问题是,文本变为黄色,即使球还没有接触到平台。应该发生的是,只有当球接触到平台时,文本才会变成黄色。如果对他们是否真的没有联系有任何疑问,这里有一个特写:
即使两个物体还没有接触,文本为什么会改变颜色
附言-对于任何想知道我为什么不使用碰撞侦听器的人,嗯,我是。只是不是为了这个特定的逻辑。我遇到了一些碰撞侦听器的怪癖,所以我决定,对于游戏中的一些对象行为,我宁愿手动查询这样的联系人。 < P>我从未使用过BIX2D与LIGBGX,但我已经广泛地使用它与其他引擎(通常基于C++的),并且不会有太大的不同。 我得到的第一个问题是 -“为什么不使用联系人侦听器回调来获取有关正在发生的冲突的信息?” GetContactList返回所有可能的联系人。这意味着两个物体AABB已经被穿透,但不一定是固定装置发生碰撞 一般来说,最好使用contact listener。 您可以在此处进一步了解碰撞和联系人侦听器:
“相关代码:”1)要更快地获得更好的帮助,请发布一个。2) 请学习类、方法和属性名称的通用(特别是用于名称的大小写)并一致使用它们。对不起?我在问题中提到的所有内容以及包含的代码都与我遇到的问题完全相关。“完全相关…”对不起,我从来没有说过不是!SSCCE可以比上面看到的更长,但要专注于其余字母。。SC,C&an E(发布的代码…不是其中之一)。发布的代码怎么不是我遇到的问题的一个例子?它清楚地表明,我通过getContactList()获取了所有联系人,并在其中循环,检查了我要检查的联系人,但程序的运行方式与我预期的不同。“确保您发布的代码显示问题!”它显示问题。如果您注意到我发布的特写图像,这个平台实际上是由更小的正方形组成的。我的contactListener问题发生在球从同一平台的一个方块滚到另一个方块上时。。。endContact()发生在球和正方形#2之间,例如,beginContact()发生在球和正方形#3之间。因此,结果是,从程序的角度来看,球没有与平台接触,而事实上,球是与平台接触的。这就是为什么我选择不使用contactListener的原因。我刚刚读了不使用contactListener的原因。我想如果是那样的话,你需要打电话到夹具上检查是否发生了碰撞。哇,太好了。这很好地解决了问题。代码现在完全按照预期工作。非常感谢!没问题,很乐意帮忙。我知道你用iTouch()解决了这个问题,这是额外的检查,看看夹具是否真的接触了。。。但是根据Box2DebugRenderer显示的内容,AABB一开始就没有接触,所以我仍然不明白文本为什么会变成黄色。如果不太麻烦的话,我希望你能给我一些进一步的建议。谢谢