这个标题并不能很好地表达我的意思,我道歉,但我很难表达得更好,因为我不太清楚由于缺乏OOP知识而发生了什么和经验。
我正在建立一个基本的游戏,这将让玩家围绕着一个拥有英雄'精灵,被一个' badGuy'追赶精灵。因为这两个精灵分享了5-6种方法,所以我决定制作一个超级精灵' Sprite'两个班级' Hero延伸了Sprite'并且' BadGuy扩展了Sprite'。现在为所有这些超级方法,包括:
getX(); getY(); getBounds(); render();
上班我需要超级班来跟踪“英雄”的位置。并且' badGuy'。所以我实施了#Sprite'像这样:
package game.sprites;
import javafx.scene.shape.Rectangle;
import javax.swing.*;
import java.awt.*;
public class Sprite {
public static int x;
public static int y;
private int imageWidth;
private int imageHeight;
public Image image;
public Sprite(int x, int y) {
Sprite.x = x;
Sprite.y = y;
}
public static void render(Graphics g, Image image) {
g.drawImage(image, x, y, null);
}
public Image loadImage(String filePath) {...}
public void getImageDimensions() {...}
public Rectangle getBounds() {
return new Rectangle(x, y, imageWidth, imageHeight);
}
public Image getImage() {
return image;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
当我想给“英雄”提供不同的起始坐标时,问题就出现了。和'BadGuy'对象。目前,如果我将它们设置为不同,则第二次调用' Sprite'覆盖第一个并且都在同一个地方开始(如果你的目标是从'badGuy')开始,这将是非常令人沮丧的。 '英雄'和'BadGuy'目前正在以这种方式初始化:
public class BadGuy extends Sprite {
public BadGuy() {
super(x, y);
initBadGuy();
}
public void initBadGuy() {
loadImage("resources/craft.gif");
getImageDimensions();
x = 860; // Hero x = 20;
y = 560; // Hero y = 20;
}
所以我试图做的是让子类覆盖Sprite的x和y。但我用谷歌搜索它,我明白这是一个非常糟糕的主意,因此是不可能的。所以我的问题是这样的:我如何制作' Sprite'继承子类' x'并且' y'变量并在调用某个子类时执行必要的方法。
现在我看一下 - 构造函数和init<>()对于子类都是相同的,所以也许它们可以在' Sprite'中实现。代替?只是一个想法,但我已经非常困惑,所以不知道。
感谢。
答案 0 :(得分:1)
您遇到此问题是因为x
和y
被声明为Sprite
类中的静态字段。
来自JLS 8.3.1.1. static Fields
如果一个字段被声明为static,那么无论该类最终可以创建多少个实例(可能为零),都只存在该字段的一个化身。静态字段(有时称为类变量)在初始化类时实现(第12.4节)。
使用以下代码:
更改您的Sprite类,如下所示:
public class Sprite {
public int x;
public int y;
....
}
BadGuy课程:
public class BadGuy extends Sprite {
public BadGuy(int x, int y) {
super(x, y);
...
}
....
}
英雄课程:
public class Hero extends Sprite {
public Hero(int x, int y) {
super(x, y);
...
}
....
}
从Main类执行以下操作://从哪里创建两个类的Object
public static void main(String[] args){
Hero hero = new Hero(20,20);
BadGuy badGuy= new BadGuy(860,560);
}