2009-08-31 2 views
0

Я делаю Braid. У меня есть класс 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, ..., ...)); 

Надеюсь, я хорошо объяснил. Кто-нибудь знает, в чем проблема?

Благодаря

Edit:

Это мой collition код:

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

Вы делаете оплетку? Последнее, что я проверил, было уже сделано и выпущено. Я не могу найти ссылку на то, что вы делаете Braid? –

+0

Err, что на самом деле проблема? –

+0

Итак, каков именно ваш вопрос; как вызвать конструктор суперкласса в классе Ceiling? Не видя остальной части вашего кода, очень сложно сказать вам, что случилось. Запустите код в среде IDE (например, Eclipse или NetBeans) и используйте отладчик для выполнения кода, чтобы последовательно следовать за строкой, что происходит при запуске программы. – Jesper

ответ

3

Вы уверены в своих настройках аргументов xposition и yposition? То есть, действительно ли потолок, где вы так думаете? Это одно и то же в ваших двух вариантах конструктора?

+0

спасибо вам, что я сделал mutch: я переключил два аргумента ..... Спасибо –

+0

+1 за стиль преподавания ответа - я ценю Это :) – aperkins

0

Я думаю, что проблема в коде, который проверяет для "столкновения". Я не вижу никаких проблем в том, что вы дали.

0

Я не вижу никаких очевидных проблем с вашими классами. Там может быть ошибка где-то еще, и вам придется опубликовать полные классы для нас, чтобы идентифицировать ее.

+0

Теперь моя проблема в том, что я бег и говорю по-голландски, и мне 13 лет. Если вам нужно перевести все мои комментарии, имена, ... –