2

有没有办法防止 DisplayObject 的高度属性自动更改?它会自动调整大小以匹配内容,尽管我的 swf 文件的高度为 32 像素。下面的代码可以证明这一点,第一帧的敌人高度是 32,但后来是 27.5,这弄乱了我的脚本。

getRect() 和 getBounds() 返回完全相同。另外,我想知道为什么在第一帧它显示正确的高度,而在第二帧它改变了,它应该从一开始就显示 27.5。

package {
    import flash.display.Sprite;
    import flash.events.Event;
    public class Main extends Sprite {
        private var enemy:Sprite;
        [Embed(source = '../lib/enemy.swf')] private var swf:Class;
        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function update(e:Event):void {
            trace(enemy.height);
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            enemy = new swf();
            addChild(enemy);
            addEventListener(Event.ENTER_FRAME, update);
        }

    }

}
4

4 回答 4

4

这与您正在实例化整个 SWF 的事实有关,并且必须通过 1 帧才能将其同步到主 swf。我要做的是在 .fla 中导出符号,然后在 Flex 中使用“嵌入符号”语法:

[Embed(source='enemy.swf#Symbol1')]
private var swf:Class;

在这种情况下,高度即使在第一个中也是一致的ENTER_FRAME。如果不是你想要的高度,你可以使用不可见的形状来设置边界。

于 2011-03-11T08:23:11.973 回答
2

一个“hacky”的解决方案可能是给敌人添加一个你想要的最大尺寸的形状,然后将它设置为不可见。我以这种方式为对象创建了命中框,并且效果很好。

一种方法是在 Flash IDE 中创建对象时添加它。只需绘制它并将其定位为您想要的形状,然后给它一个实例名称,例如“sizeHolder”。创建敌人后,您将调用

enemy.sizeHolder.visible = false;

在 Flash IDE 中,您可以将其放置在另一个时间轴上,然后使该时间轴不可见并将其锁定,这样在编辑实际对象时它就不会妨碍您。

另一种方法是通过代码添加它。在另一个 DisplayObject 中绘制对象,将其设置为不可见,然后将其添加到敌人。

于 2011-03-08T14:00:24.207 回答
1

敌人精灵动画序列的高度会有所不同。这是动画过程的一部分。因此,每帧的实际高度将根据精灵的边界框而有所不同。正如您很好地观察到的,这是 默认行为。

道路:

  • 您目前正在关注的存储高度并用于计算的那个。(更好)
  • 正如 EyeSeeEm 所建议的那样,如果我正确理解他有一个不可见的高度精灵背景,影片剪辑中心点的正确居中和每帧中精灵的居中将包含在不可见的高度精灵边界中。

您会经常发现您会遇到动作脚本中的功能无法按您希望的方式工作。重要的是您调整编码以促进解决方案。当和编码/方法允许轻松地进行进一步的更改/扩展时,它不是 hack y 或低效的。

PS:

这将取决于情况,但我个人希望高度根据精灵动画实例是动态的,因此射弹几乎在敌人的头顶上击中敌人并不会真正杀死敌人。

于 2011-03-16T06:54:32.950 回答
0

尝试

import flash.display.StageAlign;
import flash.display.StageScaleMode;

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
于 2011-03-08T12:27:37.197 回答