修改父类变量

时间:2017-03-05 14:56:46

标签: haxe openfl

我在网上寻找解决这个问题的方法,但是我无法解决这个问题。

我想扩展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变量。

4 个答案:

答案 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实现等。

http://old.haxe.org/forum/thread/685

答案 3 :(得分:2)

请注意,您正在处理2个坐标空间。一个是Sprite将被添加和该Sprite的图形对象。如果设置this.xthis.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函数,而不设置任何属性。