Actionscript 3 - 如何从MovieClip内部访问主时间轴中的整数变量

时间:2015-08-23 09:10:17

标签: actionscript-3

首先,对不起,如果我的英语不好,我是Actionscript 3的新手。 我有一个movieclip,我给它一个实例名称“symbol1”,其中包含一个代码,如下所示:

var a: int = 2;
var b: int = 3;
var total: int = a + b;

如何在主时间轴中访问该movieclip中的“total”整数变量?我尝试跟踪它,但结果是0.在主时间轴中我写了这段代码:

trace(symbol1.total);

感谢您的帮助,谢谢

1 个答案:

答案 0 :(得分:1)

“问题”是order of execution of frames。父母先被执行。

值为0而不是undefined,因为该属性确实存在,因为在上一个单独步骤中创建了对象。

您应该可以通过使用调试器单步调试代码来验证。

  

我做了6场比赛。每个游戏都在MovieClip中,包括游戏功能,时间,分数,变量等。我希望每个游戏的总分在每个MoviClips之外总结,这是在主时间轴中。这个问题有解决方案吗?

这使您的计时问题更加明显。 你到达一个框架,其中包含一个游戏,你立即想要访问它的总分。很明显,首先必须玩游戏才能从中获得分数。

询问一个刚出生的婴儿,他生命的最初60年里他最喜欢的时刻没有多大意义。

您必须通知主时间线游戏已完成。执行此操作的最佳方法是从游戏中发送Event。框架是完全没必要的。

您的代码可能如下所示:

var game:Game = new Tetris();
addChild(game);
game.addEventListener(GameEvent.FINISH, onFinish);

function onFinish(e:GameEvent):void
{
    trace("finished game with score " + game.score);
}

如果你想在游戏运行时更新外部分数总和(以便立即反映分数的任何变化,而不仅仅是游戏结束时),最好的办法是为游戏创建一个ScoreModel你传给游戏的得分GameGame会修改ScoreModel,从而导致其发送Event

var score:ScoreModel = new ScoreModel();
var game:Game = new Tetris(score);
addChild(game);

score.addEventListener(Event.CHANGE, onScoreChange);

function onScoreChange(e:Event):void
{
    trace("score changed to " + score);
}

这两个例子都是“你的代码看起来像什么”的例子。有很多关于如何发送事件的问题,这些事件可以更详细地解释如何做到这一点。

@Jezzamon的评论中提到的一些事情:

  

我很确定你正确访问变量total,否则我会指望它会导致错误(你可以通过尝试运行trace(symbol1.variableNameThatDoesntExist)来测试它。)

不,如问题中所示,访问变量不会出错。原因是该属性是在MovieClip对象上访问的,该对象是dynamic类。因此,编译器不知道访问特定属性是否有效,因为它可以在运行时更改。并且因为没有别的东西依赖于有效的值,所以也没有运行时错误。

以下是一些示例代码来说明这一点:

trace("toString: " + {}.toString); //toString: function Function() {}
trace("bananas: " + {}.bananas); //bananas: undefined

这是使用MovieClip可能是一个坏主意的原因之一。除此之外,Flash IDE还修改了幕后代码。这可能导致意外执行代码。在这方面,纯粹基于代码的工作流确实是有利的并且被推荐。