As3 gotoAndStop 一个输入帧中的多个调用

Posted

技术标签:

【中文标题】As3 gotoAndStop 一个输入帧中的多个调用【英文标题】:As3 gotoAndStop multiple calls in one enter frame 【发布时间】:2011-07-17 01:25:46 【问题描述】:

我正在尝试为 DisplayObjects 的旋转制作精灵表,似乎 gotoAndStop() 调用不起作用。

下面是一个例子:

function createRotationalSpriteSheet ( displayObject : DisplayObject )

    findMaxTileDimensions( displayObject );
    MovieClip( displayObject ).gotoAndStop( 1 ); // this call does not work.


function findMaxTileDimensions ( displayObject : DisplayObject )

    MovieClip( displayObject ).gotoAndStop( 1 ); // this call works fine

对于不起作用的 gotoAndStop 调用,标签和帧号已更新,但是当我尝试使用 BitmapData.draw 绘制 DisplayObject 时,该帧仍然停留在它被告知要转到的最后一帧上findMaxTileDimensions 函数。

这是因为我在一个输入帧中多次调用 gotoAndStop 函数吗?这是因为我在同一个输入框架中从两个不同的函数调用 gotoAndStop 吗?

【问题讨论】:

相当确定帧数从 1 开始而不是 0 【参考方案1】:

这里似乎发生了一些事情。您正在使用 gotoAndStop(),但这不会更新图像,直到 其他一切都发生了。来自文档 - http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/MovieClip.html#gotoAndStop() - “将播放头带到影片剪辑的指定帧并在那里停止。这发生在帧中的所有剩余动作都完成执行之后。” 所以如果如果你想让它工作,那么你需要在多个帧上执行它。

其次,您提到这是为了整理 DisplayObjects 的旋转以将它们绘制为 BitmapData-MovieClip 中是否有动画?或者是MovieClip 旋转的动画。如果是后者,那么通过代码设置旋转并绘制不同的角度将按照您的尝试进行(即全部在一帧中)

还可以通过 bit101 查看 SWFSheet:http://www.bit-101.com/blog/?s=swfsheet。它被用来制作动画并为其导出 PNG 精灵。那里可能有代码,我不确定。在任何情况下,您都可以保存您的动画,然后嵌入/加载它

【讨论】:

帧中没有动画。我正在尝试一次创建一帧的旋转动画。你说这一切都必须在同一帧上,但在 findMaxTileDimensions 函数中,gotoAndStop 调用工作得很好。只有当我尝试在 createRotationalSpriteSheet 函数中 gotoAndStop 时它才会中断。【参考方案2】:

这听起来可能是 AIR 中的这个已知错误(假设它只发生在 AIR 中): https://bugbase.adobe.com/index.cfm?event=bug&id=3340012

错误报告提到了一种 hacktastic 解决方法,我刚刚验证它确实有效:在运行之前将您的 MovieClip 添加到舞台。完成后您可以将其删除。

或者,您可以将 MovieClip 实例化两次(一次用于获取尺寸,一次用于创建 BitmapDatas),或者在您的 MovieClip 开头添加一个空的虚拟帧并忽略第一帧。

【讨论】:

【参考方案3】:

这里发生了两件事。主要问题是 gotoAndStop 是基于 1 的,而不是基于 0 的。 gotoAndStop(0) 不会产生错误,因为它需要一个对象(因此它可以采用标签或帧号)。

gotoAndStop 是基于 1 的,因为遗留原因 - 即与 Flash IDE 中的旧处理方式相关联。

如果将其更改为基于 1 的系统仍然不起作用,则需要添加框架脚本(基于 0),请在此处查看我的答案

AS3 - gotoAndStop with immediate action

【讨论】:

gotoAndStop 基于 0 或 1 不是问题,因为 Jordan 说第一个调用有效。似乎代码区的其他地方正在发生更深/更暗的事情 是的,我实际上使用 1 作为帧号,我将用 1 更新问题。 @乔丹。没关系,那么问题就在于在 gotoAndStop 方法调用之后阶段资源的可用方式。请参阅我的答案的第二部分,尤其是。链接【参考方案4】:

作为一个更好的用例,我认为最好使用位图,然后将其缓存在一些数据结构中: 读这个: http://www.8bitrocket.com/2010/3/3/Tutorial-AS3-How-to-Blit-an-animation-from-a-tile-sheet-embedded-at-compile-time/ 另外,也许我对这个问题不是 100% 清楚,但为什么需要使用 enterframe 来创建精灵表?

您可以旋转位图然后将其捕获为位图数据,或者简单地对位图数据使用矩阵变换 http://www.8bitrocket.com/2010/05/01/tutorial-exploring-the-as3-bitmap-class-lesson-3-scale-from-the-center-with-a-matrix/

【讨论】:

感谢您的回复。我正在使用 MovieClip 并使用 MovieClip.rotation 属性进行旋转。然后我像你说的那样使用矩阵变换。问题是在第一个函数中框架不能改变。 @Jordan 我很困惑你用这些框架做什么?动画?编辑:另外,您能否确保在调用第一个函数时初始化对象。 每个帧都以 0 的旋转角保持资产的状态。这两个函数的目的是在所有 360 个角度创建每个状态的精灵表。 findMaxTileDimensions 函数用于找出每个状态的最大宽度和高度,以便可以在每个图块的精灵表中使用这些尺寸。 createRotationalSpriteSheet 函数创建作为精灵表的实际 BitmapData 对象。 所以只有 1 帧,对吗?第 1 帧包含旋转 0 的所有内容?或者你有多个框架? 所以显示对象包含一个图形对吗?而您要做的就是让一个图形旋转它并将其缓存为不同旋转的位图数据? 我感到困惑的原因是因为显示对象是一个抽象类,实际上并没有引用帧(livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/…),但是你将它转换为movieclip,这在语法上是有意义的,但是为什么要引用一个框架。您是在尝试将对象缓存到来自 displayobj 的 diff 旋转位图数据中,还是将其放入 MC 中?

以上是关于As3 gotoAndStop 一个输入帧中的多个调用的主要内容,如果未能解决你的问题,请参考以下文章

自动转到下一个场景,没有按钮单击as3

ActionScript 3 AS3 gotoAndStop下一帧有循环

AS3/AIR 使用 SharedObject 保存/加载多个用户名

我如何使用Movieclip名称数组控制as3中的这些剪辑?

自动转到下一个场景,无需单击按钮 as3

搜索框 as3 无法正常工作