【问题标题】:ActionScript - Problem moving scrollRect with cacheAsBitmapActionScript - 使用 cacheAsBitmap 移动 scrollRect 时出现问题
【发布时间】:2011-11-06 15:57:54
【问题描述】:

为了提高 scrollRect 的性能,我必须将矢量缓存为位图,否则 scrollRect 将只是一个性能较差的掩码 (info source)。

但是,一旦我应用了 cacheAsBitmap,我似乎无法移动对象/scrollRect。为什么?

package
{
    //Imports
    import flash.display.Screen;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Rectangle;

    //Class
    [SWF(width = "800", height = "500", backgroundColor = "0x444444")]
    public class ScrollRectTest extends Sprite
    {
        //Variables
        private var background:Sprite;
        private var ball:Sprite;
        private var newScrollRect:Rectangle;

        //Constructor
        public function ScrollRectTest()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.frameRate = 60;

            init();
        }

        //Initialize
        private function init():void
        {
            background = new Sprite();
            background.graphics.beginFill(0x000000, 1.0);
            background.graphics.drawRect(0, 0, 200, 400);
            background.graphics.endFill();

            ball = new Sprite();
            ball.graphics.beginFill(0xFF0000, 1.0);
            ball.graphics.drawCircle(0, 0, 100);
            ball.graphics.endFill();
            //ball.cacheAsBitmap = true; //<-- uncomment this
            ball.scrollRect = new Rectangle(background.x, background.y, background.width, background.height);

            stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventHandler);
            stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);

            addChild(background);
            addChild(ball);
        }

        //Mouse Down Event Handler
        private function mouseDownEventHandler(evt:MouseEvent):void
        {   
            addEventListener(Event.ENTER_FRAME, enterFrameEventHandler);
        }

        //Mouse Up Event Handler
        private function mouseUpEventHandler(evt:MouseEvent):void
        {
            removeEventListener(Event.ENTER_FRAME, enterFrameEventHandler);
        }

        //Enter Frame Event Handler
        private function enterFrameEventHandler(evt:Event):void
        {
            newScrollRect = ball.scrollRect;
            newScrollRect.y -= 10;
            newScrollRect.x -= 5;
            ball.scrollRect = newScrollRect;
        }
    }
}

【问题讨论】:

  • 我昏迷了。此代码确实无法按预期工作。我想知道我所有的滚动内容怎么可能真的起作用……不知何故 ball.scaleX = 1 + Math.random() * 0.1;会让你的球重新渲染。但我仍然不明白为什么它不起作用。
  • 我不确定您为什么要将 scrollRect 应用于球。 scrollRect 用于仅显示显示对象的一部分。例如,如果您有一个名为“Page”的对象,它的大小为 2000px x 2000px,并且您只想查看页面的一小部分 100px 矩形正方形部分,您可以将页面的 scrollRect 设置为类似 new Rectangle( 900, 900 , 100, 100 )。这将导致 Page 对象缩小为 100 x 100 像素的正方形,在页面内的点 900、900 处显示 100 像素区域。换句话说,它将点 900,900 带到原点 0,0 并对其进行裁剪。
  • scrollRect 实质上是将显示对象的坐标系移动到scrollRect 的原点,然后将显示对象裁剪为scrollRect 的大小。显示对象始终以其自己的 x,y 坐标呈现。当您将它与使用 cacheAsBitmap 结合使用时,绘图和剪辑会更加高效,因此当您更新 scrollRect 的 x 和 y 坐标时,它会更快地“滚动”,假设您不修改它的宽度或高度。

标签: actionscript-3 caching bitmap scrollrect


【解决方案1】:

更有趣:

package
{
    import flash.display.Graphics;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Rectangle;


    [SWF(width = "800", height = "500", backgroundColor = "0x444444")]
    public class ScrollRectTest extends Sprite
    {
        //Variables
        private var background:Sprite;
        private var ball:Sprite;
        private var newScrollRect:Rectangle;

        //Constructor
        public function ScrollRectTest()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.frameRate = 60;

            init();
        }

        //Initialize
        private function init():void
        {
            background = new Sprite();
            background.graphics.beginFill(0x000000, 1.0);
            background.graphics.drawRect(0, 0, 200, 400);
            background.graphics.endFill();

            ball = new Sprite();
            ball.graphics.beginFill(0xFFFF00, 1.0);
            ball.graphics.drawCircle(0, 0, 100);
            ball.graphics.endFill();

            var foo:Sprite = new Sprite();
            var g:Graphics = foo.graphics;
            g.beginFill(0xFF0000, 0.2);
            g.drawRect(0, 0, 100, 100);
            g.endFill();
            ball.addChild(foo);


            ball.cacheAsBitmap = true; //<-- uncomment this
            ball.scrollRect = new Rectangle(background.x, background.y, background.width, background.height);

            stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventHandler);
            stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);

            addChild(background);
            addChild(ball);
        }

        //Mouse Down Event Handler
        private function mouseDownEventHandler(evt:MouseEvent):void
        {   
            addEventListener(Event.ENTER_FRAME, enterFrameEventHandler);
        }

        //Mouse Up Event Handler
        private function mouseUpEventHandler(evt:MouseEvent):void
        {
            removeEventListener(Event.ENTER_FRAME, enterFrameEventHandler);
        }

        //Enter Frame Event Handler
        private function enterFrameEventHandler(evt:Event):void
        {
            newScrollRect = ball.scrollRect;
            newScrollRect.y -= 1;
            newScrollRect.x -= 1;
            ball.scrollRect = newScrollRect;
//          ball.scaleX = 1 + Math.random() * 0.01;// uncomment this to force redraw
        }
    }
}

所以我认为这是某种错误。

【讨论】:

  • 嗯。我之前从未使用过 scrollRect ,所以您认为这是最近的 Flash 播放器中引入的错误?我在 Mac OS X 10.6.7 上使用 Flash 10.3 / AIR 2.7 和 Flash Builder 4.5。
  • 我想我从来没有尝试在 Sprite 上使用 scrollRect 和 cacheAsBitmap,它有一个通过绘图 API 制作的图形,所以我不知道它是否是一个新的。也没有看到任何关于它的提及。
  • 也许这更像是一个令人困惑的死胡同,而不是一个错误。我的意思是,即使是名称 scrollRect 也意味着滚动或移动,而不是更好的遮罩。此外,当它被缓存为位图并且不移动时,滚动矩形仍在变化,您可以在 entre frame 事件处理程序中查看是否只是 trace(ball.scrollRect)
  • 我认为 scrollRect 可能有点不发达或至少没有记录。如果我移动的是位图资产,而不是缓存为位图的精灵,它会起作用。此外,当使用位图资源时,仍然需要分配cacheAsBitmap = true,否则它的性能只能与蒙版一样好。
  • 有人还说不能对 TextField 使用 scrollRect.. 记住。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多