我在网上寻找解决这个问题的方法,但是我无法解决这个问题。
我想扩展sprite类来创建自己的交互式圈子。一切正常但设置自定义类的X,Y,宽度和高度不起作用:
class CircleDraw extends Sprite
{
public function new(x:Int,y:Int,width:Int,height:Int)
{
super();
this.x = x;
this.y = y;
this.width = width;
this.height = height;
drawCircle();
}
private function drawCircle()
{
this.graphics.beginFill(0xffffff);
this.graphics.drawCircle(this.x,this.y, this.width);
this.graphics.endFill();
}
}
上面的方法没有按预期工作,通过构造函数设置x,y和width导致字面上没有任何显示。然而,如果我在课堂上手动设置它们
this.graphics.drawCircle(200,200, 30);
或者在addChild之前:
circle = new CircleDraw(10,10,100,200);
circle.x=100;
circle.y=100;
然后它出现在屏幕上。一旦在类中手动添加了值而不是this.x等,就像这样添加它之后:
circle = new CircleDraw(10,10,100,200);
addChild(circle);
所以我的问题是这样,我如何扩展一个类(Sprite)并允许构造函数修改其父类默认变量并保留值?
只是按要求提供所有代码:
这不起作用:
circle = new CircleDraw(10,10,100,200);
addChild(circle);
当Circle绘制如下:
class CircleDraw extends Sprite
{
public function new(x:Int,y:Int,width:Int,height:Int)
{
super();
this.x = x;
this.y = y;
this.width = width;
this.height = height;
drawCircle();
}
private function drawCircle()
{
this.graphics.beginFill(0xffffff);
this.graphics.drawCircle(this.x, this.y, this.width);
this.graphics.endFill();
}
}
如果我修改方法,它确实有效:
private function drawCircle()
{
this.graphics.beginFill(0xffffff);
this.graphics.drawCircle(200, 200, 30);
this.graphics.endFill();
}
或者,如果在对象实例化过程中,我在编辑之前设置了X和Y变量。
答案 0 :(得分:3)
您确实成功设置了基类变量,只是DisplayObject.width
具有相当具体(可能不那么明显)的行为。
<强>
width:Float
强>指示显示对象的宽度(以像素为单位)。基于显示对象的内容的边界来计算宽度。设置width属性时,会相应地调整
scaleX
属性,如以下代码所示:除TextField和Video对象外,即使您尝试将
width
设置为其他值,也没有内容的显示对象(例如空精灵)的宽度为0。 - OpenFL API: DisplayObject: width
从这个意义上讲,OpenFL遵循ActionScript 3.0 API。
答案 1 :(得分:2)
根据您发布的(部分)代码,它看起来应该有效。
换句话说,设置像这样的父变量应该有效。
我怀疑还有一些你没有发布的其他代码会妨碍我们。我建议你在drawCircle调用中打印出x,y值来调试。
我也怀疑这个圆圈是在屏幕外绘制的,所以你看不到它。因为您首先将精灵移动到(x,y),然后在精灵内的(x,y)中绘制一个圆。因此圆圈在全球空间中有效(2x,2y)
修改强>
this.graphics.drawCircle(200,200, 30);
你声称这有效。应绘制在(210,210)半径30
circle = new CircleDraw(10,10,100,200);
circle.x=100;
circle.y=100;
你声称这有效。应绘制在(200,200)半径100
circle = new CircleDraw(10,10,100,200);
addChild(circle);
你声称这不起作用。应绘制在(20,20)半径100
从以上三个版本中,您实际上是在不同的地方绘制不同尺寸的。所以我仍然怀疑“没有用”可能是因为你正在某些不在眼前的地方画画。
所以我仍然建议你在私人drawCircle函数中打印出x,y,width的值来看看发生了什么
答案 2 :(得分:2)
从我可以猜测的情况来看,你似乎试图覆盖一个不带参数的构造函数(new)。
我不完全确定,但这可能无法满足你的需求。我认为你真正做的只是创造一种方法&#34; new&#34;在扩展类上,然后在其中,没有任何东西(super())。所以父节点不会有构造函数参数。在调试器中查看该对象并查看实例属性与父实例属性会很有趣。
可能还有一种解决方法,但我认为您可能希望通过合成而不是继承来实现这一目标。例如,在&#34; new&#34;中,创建一个精灵的新实例,并操纵它的属性。
class MySprite
{
public var sprite : Sprite;
public function new ( ) {
sprite = new Sprite ();
}
}
然后,您将在该sprite实例上执行操作。基本上,你只是在自己的类中包装一个精灵。装饰者,或多或少。
我在这里找到了一些对这个主题的引用(自从我做任何Flash编程以来已经有一段时间了),它显示了addChild和removeChild实现等。
答案 3 :(得分:2)
请注意,您正在处理2个坐标空间。一个是Sprite将被添加和该Sprite的图形对象。如果设置this.x
和this.width
,则实际上是在设置此Sprite的属性。因此,在定位方面,你正在移动Sprite本身。 Sprite“graphics”属性具有自己的坐标空间。
例如,如果在CircleDraw构造函数中传递x=100
,则首先将精灵本身移动x=100
,然后绘制x偏移为100的圆。所以如果要添加精灵直接进入舞台,您将开始在x=200
实际绘制圆圈,因为您有效地应用了两次位置。在我看来,这不是你真正想要的。
当你构建它时,你的CircleDraw实例(当然也是一个Sprite)是“空的”。因此,在构造函数中调用this.width = width
无效。 this.width
将保持为0,因为Sprite此时没有内容。因此,在drawCircle方法中,您绘制的是一个width
为0的圆圈。
可能更好的解决方案是简单地将构造函数的参数传递给drawCircle函数,而不设置任何属性。