0

我在做辫子。我有一个类Wall可以防止物体进入墙壁。一切都在Wall工作。但现在我正试图在天花板上做同样的事情。我的天花板课程扩展了Wall。我只是做了一个这样的构造函数:

public Ceiling(boolean deadly, int[] xPositions, int[] yPositions)
{
     super(deadly,
     Direction.Down, //Enum: the direction you have to leave the wall (Left, Right)
                     //Here of course down
     xPositions, yPositions);
}

现在,我在我的级别中拥有ArrayList所有墙壁和ArrayList天花板中的一个。我必须以这种方式添加墙壁:

walls.add(new Wall(false, Direction.Right, ..., ...));

还有这样的天花板:

ceilings.add(new Ceiling(false, ..., ...));

...替换坐标。

如果我检查天花板中是否有物体:什么都没有发生:物体穿过天花板。如果我使用这种方式添加天花板,它可以工作:

ceilings.add(new Wall(false, Direction.Down, ..., ...));

我希望我已经解释得很好。有人知道问题是什么吗??

谢谢

编辑:

这是我的碰撞码:

public boolean intersects(Rectangle r)
{
    if (!bounds.intersects(r))
    {
        return false;
    }
    for (int i = 1; i < yPositions.length; i++) {
        Line l = new Line(xPositions[i - 1], yPositions[i - 1], xPositions[i], yPositions[i]);
        if (r.intersectsLine(l)) {
            return true;
        }
    }
    return false;
}

我的代码


' doodelijk' 意味着致命

墙:

package levels;

import domein.Direction;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

public class Wall
{

    public boolean doodelijk;
    public int[] yPositions;
    public int[] xPositions;
    private Rectangle bounds;
    public Direction directionToLeave;

    public Wall(boolean doodelijk, Direction directionToLeave, int[] yPositions, int[] xPositions)
    {
        this.doodelijk = doodelijk;
        this.yPositions = yPositions;
        this.xPositions = xPositions;
        this.directionToLeave = directionToLeave;
        createRectangle();
    }

    public boolean intersects(Rectangle r)
    {
        if (!bounds.intersects(r))
        {
            return false;
        }
        for (int i = 1; i < yPositions.length; i++) {
            Line l = new Line(xPositions[i - 1], yPositions[i - 1], xPositions[i], yPositions[i]);
            if (r.intersectsLine(l)) {
                return true;
            }
        }
        return false;
    }

    private void createRectangle()
    {
        int x = Integer.MAX_VALUE;
        int y = Integer.MAX_VALUE;
        int x1 = 0;
        int y1 = 0;
        for (int i = 0; i < xPositions.length; i++)
        {
            int tx = xPositions[i];
            int ty = yPositions[i];
            if (x > tx)
            {
                x = tx;
            }
            if (y > ty)
            {
                y = ty;
            }
            if (x1 < tx)
            {
                x1 = tx;
            }
            if (y1 < ty)
            {
                y1 = ty;
            }
        }
        bounds = new Rectangle(x, y, x1 - x + 1, y1 - y +1);
        System.out.println("Rect: " + bounds);
    }

    class Line extends Line2D
    {

        Point2D p1;
        Point2D p2;

        public Line()
        {
            p1 = new Point();
            p2 = new Point();
        }

        public Line(Point2D p1, Point2D p2)
        {
            this.p1 = p1;
            this.p2 = p2;
        }

        public Line(double X1, double Y1, double X2, double Y2)
        {
            this();
            setLine(X1, Y1, X2, Y2);
        }

        @Override
        public double getX1()
        {
            return p1.getX();
        }

        @Override
        public double getY1()
        {
            return p1.getY();
        }

        @Override
        public Point2D getP1()
        {
            return p1;
        }

        @Override
        public double getX2()
        {
            return p2.getX();
        }

        @Override
        public double getY2()
        {
            return p2.getY();
        }

        @Override
        public Point2D getP2()
        {
            return p2;
        }

        @Override
        public void setLine(double X1, double Y1, double X2, double Y2)
        {
            p1.setLocation(X1, Y1);
            p2.setLocation(X2, Y2);
        }

        public Rectangle2D getBounds2D()
        {
            return new Rectangle((int) getX1(), (int) getY1(), (int) (getX2() - getX1()), (int) (getX2() - getY1()));
        }
    }

    public void setXpositions(int ... xPos)
    {
        this.xPositions = xPos;
    }

    public void setYpositions(int ... yPos)
    {
        this.yPositions = yPos;
    }

    public void setPositions(int[] yPos, int[] xPos)
    {
        setXpositions(xPos);
        setYpositions(yPos);
    }
}

天花板:

package levels;

import domein.Direction;


public class Ceiling extends Wall
{
    public Ceiling(boolean doodelijk, int[] xPositions, int[] yPositions)
    {
        super(doodelijk, Direction.Down, yPositions, xPositions);
    }
}
4

3 回答 3

3

您确定 xposition 和 yposition 参数的设置吗?也就是说,天花板真的在你认为的地方吗?您的构造函数的两个变体是否相同?

于 2009-08-31T12:55:21.983 回答
0

我猜问题出在检查“碰撞”的代码中。我看不出你给的那个有什么问题。

于 2009-08-31T12:14:22.390 回答
0

我没有看到你的课程有任何明显的问题。其他地方可能存在错误,您必须发布完整的类以供我们识别。

于 2009-08-31T12:17:55.327 回答