Java 使用相同id的链表冲突检测
我正在开发一个小游戏,现在我需要实现一些碰撞检测。我对所有游戏对象使用一个链表。我区分这些对象的方法是使用对象ID。我能够成功地检测到与具有不同ID的对象的碰撞,但我无法使用具有相同ID的对象有效地检测碰撞。我想知道是否有一种简单的方法可以做到这一点,也许有人可以给我举个例子。或者我需要更多的if语句。下面的代码正在运行,但正如您所看到的,每个对象的对象ID都不同。是否有办法修改此代码,使其使用相同的ID工作。例如,我想知道敌人何时相互接触,以便我能够检测到它并相应地采取行动Java 使用相同id的链表冲突检测,java,list,linked-list,collision,detection,Java,List,Linked List,Collision,Detection,我正在开发一个小游戏,现在我需要实现一些碰撞检测。我对所有游戏对象使用一个链表。我区分这些对象的方法是使用对象ID。我能够成功地检测到与具有不同ID的对象的碰撞,但我无法使用具有相同ID的对象有效地检测碰撞。我想知道是否有一种简单的方法可以做到这一点,也许有人可以给我举个例子。或者我需要更多的if语句。下面的代码正在运行,但正如您所看到的,每个对象的对象ID都不同。是否有办法修改此代码,使其使用相同的ID工作。例如,我想知道敌人何时相互接触,以便我能够检测到它并相应地采取行动 public vo
public void Collision(LinkedList<GameObject> object, Graphics g){
for(int i = 0; i < handler.object.size(); i++){
GameObject enemy = handler.object.get(i);
for(int j = 0; j < handler.object.size(); j++){
GameObject tempObject1 = handler.object.get(j);
if(enemy.getId() == ObjectId.Enemy && tempObject1.getId() == ObjectId.Bullet){
if(getBounds().intersects(enemy.getBounds())){
handler.removeObject(enemy);
handler.removeObject(tempObject1);
}
}
}
}
}
公共无效冲突(LinkedList对象,图形g){
对于(int i=0;i
嗯,伙计,您需要实现equals和hash代码,并验证它们在单元测试中是否正常工作
两个主要的IDE都将为您生成代码。约书亚·布洛赫的书中也有关于这一点的精彩讨论
永远不要检查ID是否相等。这是一个需要重新分解代码的答案。它使用已知的模式来解决碰撞及其检测问题。假定存在的
GameObject
类应该有intersects
方法可用
我可能会用冲突调度器接口实现冲突侦听器接口,并在需要的地方使用它们
接口将具有如下方法:
CollisionListener
是需要了解冲突的类实现的接口:
public interface CollisionListener {
// respond to a collision event
public void collisionEvent(CollisionEvent ce);
}
CollisionDispatcher
是发现冲突并向其他人通知冲突的类实现的接口,其他类注册到该接口。这可能是您的游戏
类,或类似的主类
interface CollisionDispatcher {
// add a collision listener who should be notified about each collision
public void addCollisionListener(CollisionListener cl);
// notify all subscribers (listeners) on collision event
public void notifyCollision(CollisionEvent ce);
}
我添加了一个main示例,它同时实现了和。你可能想要一些不同的东西
这是部分代码:
private Collection<CollisionListener> cls;
private Collection<GameObject> gameObjects;
public Game(){
this.cls = new ArrayList<CollisionListener>();
this.addCollisionListener(this);
}
@Override
public void collisionEvent(CollisionEvent ce) {
System.out.println("Collision occured between "
+ ce.getGameObject1().toString() + " and "
+ ce.getGameObject1().toString());
}
@Override
public void addCollisionListener(CollisionListener cl) {
this.cls.add(cl);
}
@Override
public void notifyCollision(CollisionEvent ce) {
// notify to all listeners
for (CollisionListener cl : this.cls){
cl.collisionEvent(ce);
}
}
public void checkForCollisions(){
// check for collisions
for (GameObject go1 : gameObjects){
for (GameObject go2 : gameObjects){
// first part is ok cause we are looking for the same object
if (go1 != go2 && go1.interesects(go2)){
this.notifyCollision(new CollisionEvent(go1, go2));
}
}
}
}
我希望你觉得这有用。如果你这样做
一个非常有用的优化是只让移动的对象在移动时检查碰撞,这样您只需要一个这样的循环:
public class CollisionEvent {
private GameObject go1, go2;
public CollisionEvent(GameObject g1, GameObject g2){
this.go1 = go1;
this.go2 = go2;
}
public GameObject getGameObject1(){
return this.go1;
}
public GameObject getGameObject2(){
return this.go2;
}
}
// in GameObject
public void checkForCollisions(){
// check for collisions
for (GameObject go2 : gameObjects){
// first part is ok cause we are looking for the same object
if (this != go2 && this.interesects(go2)){
this.notifyCollision(new CollisionEvent(go1, go2));
}
}
}
您还可以通过通知直接碰撞到的对象来优化(以牺牲设计为代价),如果这是您正在寻找的行为。这次CollisionEvent只能有一个参数(相应地重新计算其余代码的系数),GameObject类将有notifyCollision
和CollisionEvent
方法:
// in GameObject
public void checkForCollisions(){
// check for collisions
for (GameObject go2 : gameObjects){
// first part is ok cause we are looking for the same object
if (this != go2 && this.interesects(go2)){
go2.notifyCollision(new CollisionEvent(go2));
}
}
}
您也可以在侦听器上直接调用方法,而不使用事件对象。不熟悉您正在处理的问题空间,但我猜一些GameObjects id可能会有所帮助?您在哪里使用传递给碰撞函数的参数?为什么冲突函数用大写字母命名而不是Java标准?关于它的论点,“冲突”的目的是什么?谢谢你,我觉得你的回答很有用。在这一点上,对我来说似乎有点复杂,但我想这是因为我缺乏java方面的实践。然而,我会尽我最大的努力将这种模式应用到我的游戏中…确保它符合你的需要。我不是专家,但也不是新手。命名约定应该是优先事项,您可以做的第一件事是将“碰撞”方法的名称更改为“碰撞”。与C#或其他编程语言不同,Java中的方法以小写字母开头,并使用camelCase。