Java 使用相同id的链表冲突检测

Java 使用相同id的链表冲突检测,java,list,linked-list,collision,detection,Java,List,Linked List,Collision,Detection,我正在开发一个小游戏,现在我需要实现一些碰撞检测。我对所有游戏对象使用一个链表。我区分这些对象的方法是使用对象ID。我能够成功地检测到与具有不同ID的对象的碰撞,但我无法使用具有相同ID的对象有效地检测碰撞。我想知道是否有一种简单的方法可以做到这一点,也许有人可以给我举个例子。或者我需要更多的if语句。下面的代码正在运行,但正如您所看到的,每个对象的对象ID都不同。是否有办法修改此代码,使其使用相同的ID工作。例如,我想知道敌人何时相互接触,以便我能够检测到它并相应地采取行动 public vo

我正在开发一个小游戏,现在我需要实现一些碰撞检测。我对所有游戏对象使用一个链表。我区分这些对象的方法是使用对象ID。我能够成功地检测到与具有不同ID的对象的碰撞,但我无法使用具有相同ID的对象有效地检测碰撞。我想知道是否有一种简单的方法可以做到这一点,也许有人可以给我举个例子。或者我需要更多的if语句。下面的代码正在运行,但正如您所看到的,每个对象的对象ID都不同。是否有办法修改此代码,使其使用相同的ID工作。例如,我想知道敌人何时相互接触,以便我能够检测到它并相应地采取行动

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。