首先,对不起,如果我的英语不好,我是Actionscript 3的新手。 我有一个movieclip,我给它一个实例名称“symbol1”,其中包含一个代码,如下所示:
var a: int = 2;
var b: int = 3;
var total: int = a + b;
如何在主时间轴中访问该movieclip中的“total”整数变量?我尝试跟踪它,但结果是0.在主时间轴中我写了这段代码:
trace(symbol1.total);
感谢您的帮助,谢谢
答案 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
你传给游戏的得分Game
。 Game
会修改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还修改了幕后代码。这可能导致意外执行代码。在这方面,纯粹基于代码的工作流确实是有利的并且被推荐。