将Flash / AS3 Sprite包装为Flex MXML组件

时间:2011-01-10 11:44:46

标签: flex flash actionscript-3

对于我的游戏,我将主游戏视图作为普通的Flash / AS3类,如:

public class GameArena extends Sprite

这只是一个绘制游戏对象的大矩形,所以不需要花哨的UI,我想保持主游戏引擎无Flex,所以我可以使用Sprites而不是更重的Flex组件。

然而,对于整个游戏/应用程序,我仍然希望使用Flex进行GUI /布局。所以我想我可以创建一个Flex类子类UIComponent,它有一个GameArena对象作为孩子......现在我可以在MXML中将它用作标准的Flex组件。

e.g。

    public class ArenaView extends UIComponent 
    {
    public var gameArena:GameArena;
    override protected function createChildren():void
    {
        super.createChildren();
        if (!gameArena)
        {
            gameArena = new GameArena();
            gameArena.width = 200;
            gameArena.height = 200;
            addChild(gameArena);
        }
    }
}

然后我在我的主App MXML中有一个简单的行:

<logic:Arena x="0" y="0" width="50%" height="100%" name="TestArenaPanel" />

但到目前为止,当我的代码编译时,Flash类没有被渲染。也许这很简单,但我想问一下这是一种合理的方法,还是有更好的方法?

顺便说一下:我有很多次“应该使用Flex”对话。如果你想讨论,请在评论中这样做,但要保留主题的答案。

2 个答案:

答案 0 :(得分:3)

我认为你会以一种奇怪的方式解决这个问题。 GameView不是为你的GameView类创建一个包装器,而是扩展了一个已经为你做的包装:SpriteVisualElement。然后你应该可以直接在mxml中使用你的GameView,而不必将它包装在ArenaView中。

令您感到困惑的是,Flex大小/布局的方式与Sprite和Shape等低级类的大小之间存在差异。您可能已经知道,当您在Sprite中绘制精灵的宽度&amp;高度将反映绘图的最远边界。现在使用Flex,父母告诉孩子它的大小(通过setActualSize())。

然后,孩子可能会或可能不会向父母请求,“但我不想那么大!我想这个大小”,它通过呈现给父母来实现来自measure()函数的值。

最后,父母仍然告诉孩子究竟应该是什么尺寸,但作为一个好父母,它允许孩子有一些自由来做它想要的新尺寸(所以孩子的updateDisplayList()被调用,它可以拉出蜡笔,并根据它给出的尺寸制作漂亮的照片。)

有了这个小小的故事,你将不得不做出决定:我的GameView是否应该不假思索地吸引自己?或者我的GameView应该根据可用的浏览器窗口大小等参数绘制它需要的内容吗?

答案 1 :(得分:1)

您没有向我们展示您的measure()代码,也没有向我们展示ArenaView Flex组件的updateDisplayList()代码。您是否在measure()中设置measuredWidth和measuredHeight属性?您是否在updateDisplayList()中定位和调整gameArena的大小?

请记住,父母总是负责确定孩子的大小和位置。我猜你的组件没有给gameArena一个大小,有效地使它在零宽度和零高度下不可见。尝试这样的事情:

override protected function upldateDisplayList(unscaledWidth:int, unscaledHeight: int):void{
 super.updateDisplayList(unscaledWidth, unscaledHeight);
 gameArena.setActualSize(unscaledWidth, unscaledHeight);
 gameArea.move(0,0);
}

这是我在浏览器中编写的代码,但它应该适度接近。

许多Flex容器会尝试定位他们的孩子,但如果组件没有设置measuredWidth / measuredHeight属性,我认为不会尝试调整它们的大小。您扩展的UIComponent没有此代码。