防止DisplayObject的高度更改

时间:2011-03-08 12:21:25

标签: actionscript-3 displayobject

有没有办法阻止自动更改DisplayObject的height属性?虽然我的swf文件高度为32像素,但它会自动调整大小以匹配内容。下面的代码可以证明这一点,第一帧 enemy.height 是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 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

“hacky”解决方案可能是为具有您想要的最大尺寸的敌人添加形状,然后将其设置为不可见。我已经创建了对象的命中框,它运行得很好。

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

enemy.sizeHolder.visible = false;

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

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

答案 2 :(得分:1)

  

敌人精灵动画序列   高度会有所不同。这是其中的一部分   动画过程。因此   每帧的实际高度会有所不同   基于精灵的边界框。   正如你很好地观察到的那样   默认行为。

方式:

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

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

P.S:

这取决于情况,但我个人认为根据精灵动画实例,高度是动态的,因此任何对射弹几乎超过其头部的命中物都不会杀死敌人。

答案 3 :(得分:0)

尝试

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

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;