【问题标题】:Why this rectangle is not drawn?为什么不绘制这个矩形?
【发布时间】:2025-11-29 01:05:01
【问题描述】:
public class Greeter extends MovieClip
{

    public function Greeter()
    {
        addEventListener(Event.ADDED_TO_STAGE, go);
    }

    private function go(evt:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, go);
        var _root:MovieClip = parent.parent as MovieClip;

        var sp:Sprite = new Sprite();

        // Desenhando com um objeto graphics
        var g:Graphics = sp.graphics;
        g.beginFill(0xFF0000, 1);
        g.drawRect(10, 10, 300, 200);
        g.endFill();

        _root.addChild(sp);
    }
}

mxml 文件:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="1024" minHeight="768"
               creationComplete="initApp()">

        <fx:Script>
            <![CDATA[
                public function initApp():void
                {
                    var greeter:Greeter = new Greeter();
                }
            ]]>
        </fx:Script>

</s:Application>

--答案:

使用 addElement 添加到舞台并扩展 spark.core.SpriteVisualElement。

【问题讨论】:

    标签: actionscript-3 flash apache-flex flash-builder mxml


    【解决方案1】:

    你只是在调用构造函数。

    在构造函数中添加一个事件监听器。

    代码中的任何地方都在绘制矩形。

    【讨论】:

    • (负数不是我的)我在 go() 方法上绘制矩形,该方法由 ADDED_TO_STAGE 事件触发.. ;)
    • 抱歉,我误点击了负数。
    • 现在我的否定,这应该是评论,而不是答案.. ;)
    【解决方案2】:

    您需要在舞台上添加问候语

    public function initApp():void
    {
        var greeter = new Greeter();
        addChild( greeter );
    }
    

    当调用 addChild(greeter) 时,它将触发您在 Greeter 构造函数中添加的事件侦听器,并调用您在其中绘制矩形的 go 方法。 请注意,您不需要这样做: _root.addChild( sp ); 由于在 initApp 方法中将 greeter 添加到 stage 中,您可以通过在 go 方法中执行 addChild( sp ) 将 sp 添加到 greeter。

    【讨论】:

    • 谢谢!但现在我得到:“错误:addChild() 在此类中不可用。相反,使用 addElement() 或修改皮肤,如果有的话。”;使用 addElement 会导致编译器错误:“将 Greeter 类型的值隐式强制转换为不相关的类型 mx.core:IVisualElement。”
    • Greeter 类需要实现 IVisualElement
    • 添加“implements IVisualElement”时出现错误,需要实现的方法列表很大。难道我不能扩展一些东西吗?
    • 我想如果您只想在舞台上添加一个显示对象,也许您应该考虑创建一个 AS3 项目而不是 Flex 项目。无论如何,您可以做的是:Greeter 扩展 SpriteVisualElement,并在 initApp 方法中,使用 addElement() 而不是 addChild
    【解决方案3】:

    你为什么要这样做?

    var _root:MovieClip = parent.parent as MovieClip;
    ...
    _root.addChild(sp);
    

    这种显示列表管理风格让人想起 ActionScript 2 对封装和多态的宽容。

    您的 Greeter 对象不应尝试以这种方式访问​​显示列表上它上面的项目。 Greeter 应该将此矩形添加为它自己的子对象,在这种情况下没有理由使用 MovieClip 对象,Sprites 更合适。

    为了回答您的问题并修正关于 addChild 的结果,使用 Spark 应用程序而不是 mx:Application 是 addChild 不是有效函数的原因。 Spark 应用程序实例必须包含一种新的显示对象,如上所述,可以是 SpriteVisualElement 的扩展,也可以是实现 IVisualElement 中定义的功能的对象。

    如果您没有利用 Spark 的布局和皮肤功能,只需更改为使用 Flex 3/Halo/mx Application 标签,您就可以使用扩展 Sprite 而不是 SpriteVisualElement 的标准对象按预期添加 addChild()。

    【讨论】:

    • 我自己并没有这样做,我只是从网上获得了一个示例.. 没有太多使用 ActionScript 3 进行游戏开发.. 现在,我将尝试扩展 SpriteVisualElement 并回到这里。 .
    最近更新 更多