简体   繁体   English

扩展类的问题

[英]problem with extending classes

I'm making Braid. 我在编辫子。 I have a class Wall that prevents that an object goes into a wall. 我有一个Wall类,可以防止物体进入墙壁。 Everything with Wall is working. Wall所有功能都可以正常工作。 But now I'm trying to make the same with the ceilings. 但是现在我正在尝试使天花板也一样。 My ceiling class extends Wall . 我的天花板课延伸到Wall I've simply made a constructor like this: 我只是做了一个这样的构造函数:

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);
}

Now I have in my level-class an ArrayList of all the Walls and an ArrayList of all the Ceilings. 现在,我有我的水平一流的ArrayList所有的墙和一个ArrayList所有的天花板。 I have to add the Walls on this way: 我必须以这种方式添加墙:

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

And the Ceilings on this way: 天花板以这种方式:

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

The ... replaces the coordinates. ...替换坐标。

If I check if there is an object in a Ceiling: there has nothing happened: the object goes through the ceiling. 如果我检查天花板中是否有物体:什么也没发生:物体穿过天花板。 And if I use this way to add a Ceiling, it works: 而且,如果我使用这种方式添加天花板,它会起作用:

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

I hope I've explained well. 我希望我解释得很好。 Does somebody know what the problem is?? 有人知道问题出在哪里吗?

Thanks 谢谢

Edit: 编辑:

This is my collition code: 这是我的公司代码:

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;
}

My Code 我的密码


' doodelijk ' means deadly doodelijk ”意味着致命

Wall: 壁:

 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); } } 

Ceiling: 天花板:

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

Are you sure about your settings of the xposition and yposition arguments? 您确定关于xposition和yposition参数的设置吗? That is, is the ceiling really where you think it is? 也就是说,天花板真的在您认为的位置吗? Is it the same in your two variants of the constructor? 在构造函数的两个变体中是否相同?

I guess the problem is in the code that checks for the "collision". 我猜问题出在检查“冲突”的代码中。 I cant see any problem in the one you've given. 我看不到您给出的任何问题。

I don't see any obvious problems with your classes. 我的课程没有明显的问题。 There might be a bug somewhere else and you would have to post the complete classes for us to identify it. 其他地方可能存在错误,您必须发布完整的类以供我们识别。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM