动作脚本3:以正确的方式绘制线条和位图

时间:2015-01-28 03:07:47

标签: actionscript-3 flash actionscript

我刚开始使用Flash / ActionScript,似乎是按顺序为各种对象创建Sprite s,BitmapMovieClip等的一般共识代表图片和其他图形。

然而,我习惯于在其他语言中编写游戏和诸如此类的东西的方法是重复循环,每个帧使用类似于Graphics对象的东西来重绘主Sprite上的场景。这是如何在Flash中完成的,这是一个好习惯吗?我可以这样做,但我想知道是否有一些Flash生态系统标准。

这是我习惯的方式的一个例子:

public class MyApp extends Sprite
    {
        public function MyApp()
        {
            var t:Timer = new Timer(20);
            t.addEventListener(TimerEvent.TIMER, update);
            t.start();
        }

        public function update(e:TimerEvent)
        {
            this.graphics.clear();
            //Rendering code and updating of objects.
        }
    }

这可以接受吗?

3 个答案:

答案 0 :(得分:1)

嗯,这取决于。

在Flash中,您可以选择依赖Flash Player的矢量光栅化器和渲染系统,它将为您找出所有重绘。例如,您可以只绘制一次Sprite,然后只需将变换应用于精灵(设置xywidthheight,{{1 }},rotationscaleXscaleYtransform.matrix等)。这些对象中的任何一个都可以是矢量形状或位图,您还可以使用transform.colorTransformcacheAsBitmap进行更多重绘优化。 Flash Player将仅在其更改的帧上重绘更改的区域。我认为这是传统的“Flash方式”。

使用cacheAsBitmapMatrix API只是一种创建矢量形状数据的编程方式。可以将其视为Flash IDE中绘图的替代代码。您可以在创建对象时使用Graphics绘制一次,或者如果您需要更改实际形状(即不仅仅是变换),那么您应该Graphics并重新绘制它。但是,理想情况下,你不会做那么多。如果你发现自己重绘了很多形状,你可能想要转向预渲染的精灵表方法。在这种情况下,您可以使用clear()更快速地将预先绘制的像素数据复制到BitmapData对象。这通常比依靠矢量光栅化器渲染Bitmap命令更快,只要您使用像Graphics这样的快速像素方法。这可能更接近于您在其他没有内置矢量光栅化器的平台中使用的渲染系统。

最后,值得注意的是,在Flash中渲染对象的最新(也是最快)方式与完全不同。它被称为 Stage3D ,它使用与矢量光栅化器完全不同的渲染管道。它由GPU渲染API提供支持,因此速度极快(非常适合游戏),但没有矢量栅格化功能。它可以用于3D和2D。使用它需要更多参与,但有一些有用的框架可以使它更容易,最明显的是Starling 2D framework

希望有所帮助。

答案 1 :(得分:0)

" Flash方式"是使用EnterFrame事件而不是使用计时器绘制。你必须随时进行计算,但让flash绘制你的场景。

答案 2 :(得分:0)

它在actionscript中的工作方式相同。

public class App extends Sprite // adding "my" to identifier names doesn't add any information, so there's no real point in doing it
    {
        public function App()
        {
            addEventListener(Event.ENTER_FRAME, update); // "each frame"
        }

        private function update(e:Event):void //not just parameters of functions have a type, but also their return value
        {
            graphics.clear(); // no need for "this" here
            //Rendering code and updating of objects.
        }
    }

请记住,Graphics API是基于矢量的,因此在删除性能之前只会绘制很多东西。

Sprite是一个通用的容器,不要与术语" sprite"代表精灵表。 在说" main Sprite"时,您可能会指的是什么?是一些可以操作的矩形像素区域。在这种情况下,BitmapData就是您想要的,它与Bitmap对象一起显示。

BitmapData不提供图形属性。基本上,绘制矢量和操纵像素在As3中单独处理。如果你想在BitmapData对象中绘制一条线,你必须先将这条线作为矢量绘制到Sprite(或更好的Shape,如果你想做的就是绘制使用其graphics属性,然后使用draw() BitmapData根据绘制的线设置其像素。