我正在编写一个简单的小行星克隆游戏,使用 Swing
来显示图形。我有点关注 Derek Banas' tutorials , 但决定自己扩展。
最初的想法是游戏中的每个图形元素(即小行星、宇宙飞船和子弹)都扩展了 Polygon
类。他们的构造函数看起来像这样:
public class SpaceShip extends Polygon {
//x and y coordinates
public static int[] polyXArray = {...};
public static int[] polyYArray = {...};
//other class variables
{...}
public SpaceShip() {
super(polyXArray, polyYArray, polyXArray.length);
}
}
其他图形元素也是类似的。
编辑:这里的关键元素是两个数组不存储对象的实际坐标,而是它们相对于中心的位置,其坐标是double
类型的类变量。因此,数组仅描述对象的形状,而子类move()
方法将影响中心的坐标。负责实际绘图的类将调用 move()
方法,然后应用仿射变换来移动和旋转形状(根据正确定义的角度参数)。我这样做是为了避免与处理 double
算术相关的精度问题。
现在,由于元素共享许多“相等”变量(它们的中心坐标,我需要用仿射变换来转换它们,它们的速度分量等...)和方法(getter 和 setter,move()
方法等...)我想过让它们成为一个抽象类的扩展 - 比如 GameShape
- 它包含所有这些通用方法和变量。 GameShape
现在将是直接扩展 Polygon
的那个:
public abstract class GameShape extends Polygon {
//x and y coordinates, still unassigned
public static int[] polyXArray, polyYArray;
//other class variables
{...}
public GameShape() {
super(polyXArray, polyYArray, polyXArray.length);
}
}
然后,当我定义不同的子类以便绘制我需要的不同形状时,我想将所需的值分配给 polyXArray
和 polyYArray
,但是我一直无法找到一种方法。
我确实希望这些变量是静态的,因为它们是单个类的特定属性,我不想在每次实例化新对象时都将它们作为参数传递。
我的情况与this question中描述的非常相似,但建议的解决方案似乎不起作用,因为我需要构造函数中的那些变量。有没有办法克服或绕过这个问题?不管程序如何,我的主要目标是拥有一个所有图形元素通用的父类(super class),以避免数十行复制粘贴代码。
最佳答案
您有一对描述特定类型游戏对象形状的数组。如果不同的游戏对象可以有不同的形状,那么它们就不能共享一对数组,就像它们是所有游戏对象类的公共(public)父类(super class)的静态属性一样。相同种类的不同对象可以共享同一对数组(假设不需要在每个对象的基础上修改),这可能对应于那些数组是具体的游戏对象类。然而,在那种情况下,如果您希望这些类的父类(super class)能够访问给定游戏对象的正确形状数据,则必须告知这些形状数据是什么。
主要有两种方法:
您可以将适当的形状数组传递给父类(super class)的构造函数。你说你不想这样做,但我不明白为什么。
您可以在子类应该覆盖的父类(super class)上定义访问器方法以提供正确的形状数据(这称为模板方法模式)。
关于java - 在子类中初始化父类(super class)变量(构造函数中需要),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33002225/