Starling 在做出决定时重新创建新对象

Posted

技术标签:

【中文标题】Starling 在做出决定时重新创建新对象【英文标题】:Starling Recreation of new Objects when a decision is made 【发布时间】:2014-02-17 08:43:42 【问题描述】:

创建一个点触式游戏,每当用户点击交互的东西时,它就会显示一个提供 3 个选择的决策轮。行动、聊天或检查。我将所有内容集中在一个主要的触摸处理程序周围。因此,如果它是一个交互式对象,则创建一个新的决策轮并添加一个侦听器以在做出决策时调用,然后调用继续进行决策。在显示之前,我添加了一个深色覆盖,以便用户在做出决定之前不能篡改屏幕上的任何内容。

有什么更好的解决方法的建议吗?显然,我知道每次都创建一个新对象,然后在每次完成时调用 removeFromParent(true),这对性能来说是个坏主意。

传入的对象包含被触摸对象的属性。比如 id 和 x 和 y 位置,这样我就知道在屏幕上的哪个位置放置决策轮。

我的主要问题: 如何设置它,以便我只有一个决策对象,而不必在每次触摸某些东西时重新创建一个新实例?

override protected function createDecisionWheel(object:Object):void
    
        if (!GameState.AWAITING_DECISION) 

            //create bg overlay
            _overlay = new Overlay();
            addChild(_overlay);

            //waiting for decision from user
            GameState.AWAITING_DECISION = true;

            _decisionWheel = new DecisionWheel(object);
            addChild(_decisionWheel);

            _decisionWheel.x = _decisionWheel.positionDecisionWheelX(object._x, _backgroundPosition);
            _decisionWheel.y = _decisionWheel.positionDecisionWheelY(object._y, _backgroundPosition);

            addEventListener("DecisionMade", proceedWithDecision);
        
    

    override protected function proceedWithDecision(e:Event):void
    
        removeEventListener("DecisionMade", proceedWithDecision);

        //remove once decision has been made @TODO
        _decisionWheel.removeDecisionWheel();
        _overlay.removeOverlay();

        //reset
        GameState.AWAITING_DECISION = false;

        trace("proceed with decision");
    

【问题讨论】:

不确定您要的是什么。你问的是 touchable = false 吗? 用一个主要问题更新了帖子:) 【参考方案1】:

定义一个成员变量:

private var _decisionWheel:DecisionWheel;

在你的构造函数中:

_decisionWheel = new DecisionWheel(object);
addChild(_decisionWheel);
_decisionWheel.visible = false;

然后只需切换 _decisionWheel.visible - 做出决定时:

_decisionWheel.visible = true;
_decisionWheel.x = _decisionWheel.positionDecisionWheelX(object._x, _backgroundPosition);
_decisionWheel.y = _decisionWheel.positionDecisionWheelY(object._y, _backgroundPosition);
// and watever more mapping you need to add

然后继续做决定:

_decisionWheel.visible = true;

请注意,如果您想使用 removeFromParent,请确保您执行 removeFromParent(false),这样您的对象就不会被释放。

【讨论】:

以上是关于Starling 在做出决定时重新创建新对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将消息发布到运行消息泵的 STA 线程?

关闭已创建 STA COM 对象的线程时避免断开上下文警告

如何在新实现的接口或基类之间做出决定?

Starling中文站开发教程

Filecoin投资200万美元建立Starling实验室

AS3 Starling Framework Texture Atlas TypeError #1007