4

単純なゲームのすべてのオブジェクト(プレーヤー、敵、ビームなど-速度、位置、ダメージなどの多くの共通点があります)を表すクラスがあります。そこで、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;
    }
}

クラスPlayerを拡張しました:

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を拡張するクラスから新しいオブジェクトを作成するときは、コンストラクターで言われているように、すべてのフィールドをコピーして初期化します。それで、それを修復する方法は?

4

2 に答える 2

5

、はクラスの変数であるためgetX()getY()などを使用する必要があります。xyspeedprivateThing

プレーヤーがフィールドにアクセスできるという意味でPlayer extends Thingはありません。その変数にアクセスするために提供されます。privateThingpublic get... set...private

于 2013-01-04T21:15:30.783 に答える
-1

変数、、を保護に変更するxy、アクセサーspeed、、getX()(この場合は追加する必要があります)を使用して、アクセスの問題を解決します。getY()getSpeed()getSpeed()

それらをデフォルトに変更した後に表示されたエラーは、のabs(...)代わりに呼び出しているという事実でしたMath.abs(...)。のすべてのインスタンスをに変更しabs(...)Math.abs(...)、新しいエラーを取り除きます。

于 2013-01-04T21:17:20.233 に答える