2013-01-04 45 views
1

我拥有代表简单游戏中的每个对象(玩家,敌人,射线等等)的类 - 它们都有许多共同点,如速度,位置,dmg)。所以我做了一个叫Thing的课。下面是它的样子:抽象类中的私有字段不能在子类中访问

public abstract class Thing { 
    private Image image; 
    private float x; 
    private float y; 
    private float speed; 
    private final int WIDTH; 
    private final int HEIGHT; 

    public Thing(String filename, float x, float y, float speed) { 
     try { 
      Image image = ImageIO.read(new File(filename)); 
     } catch (Exception e) {} 
     this.x = x; 
     this.y = y; 
     this.speed = speed; 
     WIDTH = image.getWidth(null); 
     HEIGHT = image.getHeight(null); 
    } 

    //Zwraca ksztalt do sprawdzania czy contains... 
    public Rectangle2D getShade() { 
     return new Rectangle2D.Float(x, y, WIDTH, HEIGHT); 
    } 

    public Image getImage() { 
     return image; 
    } 

    public Point2D getPoint() { 
     return new Point2D.Float(x, y); 
    } 

    public float getX() { 
     return x; 
    } 

    public float getY() { 
     return y; 
    } 
} 

我已扩展的类球员:

public class Player extends Thing { 
    public Player(String filename, float x, float y, float speed) { 
     super(filename, x, y, speed); 
    } 

    public void moveToPoint(Point2D targetPoint) { 
     int targetX = (int)targetPoint.getX(); 
     int targetY = (int)targetPoint.getY(); 
     if (((int)x+20 < targetX+3) && ((int)x+20 > targetX-3)) { 
      return; 
     } 
     float distanceX = targetX - x; 
     float distanceY = targetY - y; 
     //Dodanie 20px wymiarow statku 
     distanceX -= 20; 
     distanceY -= 20; 
     //Ustalenie wartosci shiftow 
     float shiftX = speed; 
     float shiftY = speed; 
     if (abs(distanceX) > abs(distanceY)) { 
      shiftY = abs(distanceY)/abs(distanceX) * speed; 
     } 
     if (abs(distanceY) > abs(distanceX)) { 
      shiftX = abs(distanceX)/abs(distanceY) * speed; 
     } 
     //Zmiana kierunku shifta w zaleznosci od polozenia 
     if (distanceX < 0) { 
      shiftX = -shiftX; 
     } 
     if (distanceY < 0) { 
      shiftY = -shiftY; 
     } 
     //Jezeli statek mialby wyjsc poza granice to przerywamy 
     if ((((int)x+shiftX < 0) || ((int)x+shiftX > 260)) || ((y+shiftY < 0) || (y+shiftY > 360))) { 
      return; 
     } 
     //Zmiana pozycji gracza 
     x += shiftX; 
     y += shiftY; 
    } 
} 

这里是问题,因为我的IDE强调x,y和速度场红色,并告诉他们不能被访问来自Player类。我试图将它们更改为私有和默认,但之后出现错误。我究竟做错了什么?当我从扩展Thing的类创建新的对象时,我想复制所有的字段,并像在构造函数中那样初始化它们。那么如何修复它?

+2

“问题”这个词不是没有理由在标题中被禁止的。如果每个人都把他的问题称为“Java问题”,那么只要看看标题,人们就会知道它是什么问题?尝试在标题中描述具体问题本身,而不是使用“问题”这个词:) :) – BalusC

回答

4

您需要使用getX()getY()等,因为xyspeedThingprivate变量。

Player extends Thing并不意味着玩家可以访问private字段。 Thing提供了publicget... set...来访问它的private变量。

+0

但我不想访问Thing类中的字段。我想在Player类中创建新的字段。我们在谈论同样的事情吗?请注意,我也尝试使用受保护的前缀(因此不需要getters)并且错误也会出现 –

+0

在Thing类中,您尚未定义x,y,speed变量,您需要像在Thing类中所做的那样定义它们。顺便说一句,在Player类中定义它们的动机是什么? – kosa

+0

我改变了保护,现在我得到另一个错误。动机是玩家,光束和敌人都有速度,x,y,宽度和高度,这些字段总是以相同的方式定义。所以我决定把这个代码放在抽象类中,所以我不必将它复制到子类中 –

-1

变化的变量xy,并且speed受保护的,或者使用存取getX()getY()getSpeed()getSpeed()需要在这种情况下,要添加)来解决访问问题。

将您更改为默认值后出现的错误是您拨打abs(...)而不是Math.abs(...)。将abs(...)的所有实例更改为Math.abs(...)以摆脱新的错误。