0

図形のセットがあり、どの図形がどの図形と交差しているかを判断する必要があります。現在、2 つの拡張forループ (1 つを別のループ内) を使用していますが、期待どおりに動作しません。Shapeaをそれ自体と比較しているだけのようです。println()デバッグ目的で追加しました。コンソール出力はこの質問の最後にあります。

編集:インターフェイスのコードを追加して、公開方法と公開Drawables方法を示しました。また、クラスを追加して、そのメソッドが何をするかを示しました。intersects(Rectangle rectangle)Shape.getBounds()Collisions

編集 2:言及するのを怠ったなんて信じられません:drawablesはセットです! drawables.add()のように振る舞うSet.add()

* EDIT 8564985294238424: * Set を初期化することはありませんcollisions。これを修正しました。それは今動作します。


Class CollisionMonitorSet<Collision> getCollisions() (クラスの最後にある問題メソッドを含む)

package platformer;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;


public class CollisionMonitor
{

private Set<Collision> collisions;
private Set<Drawable> drawables;

public CollisionMonitor(Set<Drawable> drawables)
{
    this.drawables = drawables;
}

public Set<Drawable> getDrawables()
{
    return drawables;
}

public void setDrawables(Collection<? extends Drawable> drawables)
{
    if (drawables != null)
        this.drawables = (new HashSet<Drawable>(drawables));
}

public Set<Drawable> addDrawables(Collection<? extends Drawable> drawables)
{
    if (drawables != null && drawables.isEmpty() == false)
        this.drawables.addAll(drawables);
    return this.drawables;
}

public Set<Collision> getCollisions()    //Problem method!
{
    Set<Drawable> temp = drawables;

    for (Drawable s : drawables)
    {
        for (Drawable ss : temp)
        {
            System.out.println(s + ", " + ss);
            /*if (s.intersects(ss.getBounds()))
            {
                collisions.add(new Collision(s, ss));
            }*/
        }
    }

    return collisions;
}

}

インターフェイス ドローアブル:

public interface Drawable extends Shape
{
    Color color = new Color(0, 0, 0);

    public Color getColor();
}

クラス衝突

public class Collision
{

    Drawable drawable1, drawable2;

    public Collision(Drawable drawable1, Drawable drawable2)
    {
        this.drawable1 = drawable1;
        this.drawable2 = drawable2;
    }

}

出力:

platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Bullet@26dea769, platformer.Bullet@26dea769
platformer.Bullet@f1e9457d, platformer.Bullet@f1e9457d
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Bullet@11bd2f5a, platformer.Bullet@11bd2f5a
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Bullet@70a511a, platformer.Bullet@70a511a
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Enemy@660de2f0, platformer.Enemy@660de2f0
platformer.Bullet@6ada16bc, platformer.Bullet@6ada16bc
platformer.Bullet@6ba127e8, platformer.Bullet@6ba127e8
4

1 に答える 1

0

tempとなんら変わりませんdrawables。同じオブジェクトを指しています。

まったく同じ要素を除外する場合は、次を使用します。

for (Drawable s : drawables)
{
    for (Drawable ss : temp)
    {
        if (s == ss) continue;  // don't compare the object to itself
于 2013-05-20T05:09:12.643 に答える