这是一个有点基本的问题。但是,我无法理解如何解决它。我有一个应用程序,它有几个实体。例如梭鱼<--鱼-->鲨鱼。其中fish是基类。
我正在做一些湖,所以我的鱼类的所有实例只能在一些边界内移动。更重要的是,它们都是随机创建在湖的一个边缘,并根据它们所在的边缘游到另一个边缘。下面是它查找基类的方式:
public class Fish extends FlxSprite
{
[Embed(source="./resources/Elipse.png")]
public var image:Class;
// Variable which stores the direction of item movement (false - Move right)
// (true - Move Left)
private var movement:Boolean;
public function Fish(x:int, y:int)
{
super(x, y, image);
// Move right
if ( x < 5 )
{
movement = false;
}
else
{
movement = true;
}
}
public override function update():void
{
if( movement )
{
this.velocity.x -= 3;
}
else
{
this.velocity.x += 3;
}
super.update();
}现在我想扩展这个模型,为fish类添加一些额外的行为。我想做一条鲨鱼。为此,我需要:
1)将抽象的鱼图像替换为鲨鱼图像
2)稍微改变一下行为(shark仍然需要知道方向,但可能会使用另一种速度的方法)
3)定义大小属性(例如,基于大小,鲨鱼会更强或更弱)
问题是:
我该如何定义鲨鱼..。作为Fish的子类?或者从雪碧子类化它更好?
我认为从Fish派生子类会更自然,但在这种情况下,我不知道如何覆盖Fish的视觉表示(例如图像),因为不可能覆盖变量。
另一方面,如果我使用FlxSprite作为基类,将很容易重新定义表示,但在这种情况下,我将无法重用运动代码(例如,这样鱼就知道往哪个方向游了)……
我知道这个问题有点难以理解。如果有任何问题,我很乐意重新定义它。
发布于 2012-03-13 18:52:51
您不能覆盖变量(这没有任何意义),但您可以在构造函数中设置它的值。
在Fish中
public var image:Class;在Shark中
[Embed(source="./resources/shark.png")]
private const _sharkImage:Class;
public function Shark(x:int, y:int)
{
image = _sharkImage;
super(x, y);
}您也可以使用getter。
在Fish中
[Embed(source="./resources/Elipse.png")]
public var _image:Class;
public function get image():Class
{
return _image;
}然后在Shark中
[Embed(source="./resources/shark.png")]
private const _sharkImage:Class;
override public function get image():Class
{
return _sharkImage;
}我认为重写getter和setter对你来说是一个很好的选择。然后,您可以更改每个物种的行为速度/大小。
https://stackoverflow.com/questions/9682371
复制相似问题