Swing
来显示图形。我有点遵循Derek Banas的教程,但决定自己扩展一下。最初的想法是游戏中的每个图形元素(即小行星、飞船和子弹)都会扩展
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
-type类变量。因此,这些数组仅描述了对象的形状,而子类move()
方法将影响中心的坐标。负责实际绘制的类将调用move()
方法,然后应用仿射变换来移动和旋转形状(根据适当定义的角度参数)。我这样做是为了避免处理double
算术相关的精度问题。
现在,由于这些元素共享许多“相等”的变量(它们的中心坐标,我需要这些变量才能使用仿射变换将它们平移,它们的速度分量等等...)和方法(获取器和设置器,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中描述的情况非常相似,但提出的解决方案似乎不起作用,因为我需要这些变量在构造函数中。是否有一种方法可以克服或避开这个问题?无论采取何种程序,我的主要目标是拥有一个所有图形元素共同的超类,以避免复制粘贴代码的几十行。
polyXArray
和polyYArray
应该是实例变量。 - MichaelPolygon
长什么样子?为什么你必须写super(polyXArray, polyYArray, polyXArray.length);
这一行代码呢? - Michael