【发布时间】: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