Actionscript 3:正确绘制线条和位图
Actionscript 3: Drawing lines and bitmaps the right way
我才刚刚开始使用 Flash/ActionScript,创建 Sprite
s、Bitmap
s、MovieClip
s 等似乎是普遍共识各种对象,以表示图片和其他图形。
然而,我习惯用其他语言编写游戏和诸如此类的东西的方式是重复循环,每一帧使用类似于 Graphics
对象的东西在主 [=11] 上重绘场景=].这也是在 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.
}
}
这可以接受吗?
"Flash way"是使用EnterFrame事件而不是定时器来绘制。您必须随时进行计算,但让 Flash 绘制您的场景。
它在 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.
}
}
请记住,图形 API 是基于矢量的,因此在降低性能之前只会绘制这么多东西。
Sprite 是一个通用容器,不要与术语 "sprite" 在 sprite sheet 中的含义混淆。
当你说 "main Sprite
" 时,你可能指的是一些矩形像素区域,你可以 manipulate.In 在这种情况下,BitmapData
就是你想要的,用 [=13= 显示] 对象。
BitmapData
不提供图形 属性。本质上,绘制矢量和操纵像素在 As3 中是分开处理的。如果你想在 BitmapData 对象中画一条线,你必须首先将线作为矢量绘制到 Sprite
(或者更好的 Shape
,如果你只想在它上面画) 使用它的 graphics
属性,然后使用 BitmapData
的 draw()
根据绘制的线条设置它的像素。
好吧,这取决于。
在 Flash 中,您可以选择依赖 Flash Player 的矢量光栅化器和渲染系统,它会为您计算出所有的重绘。例如,您可以在 Sprite
上绘制一次,然后简单地将变换应用于精灵(设置 x
、y
、width
、height
、rotation
、scaleX
、scaleY
、transform.matrix
、transform.colorTransform
等)。这些对象中的任何一个都可以是矢量形状或位图,您还可以使用 cacheAsBitmap
和 cacheAsBitmapMatrix
进行更多重绘优化。 Flash Player 只会在更改的框架上重绘更改的区域。我认为这是传统的 "Flash way".
使用Graphics
API 只是一种创建矢量形状数据的编程方式。将其视为在 Flash 中绘图的替代代码 IDE。您可以在创建对象时使用 Graphics
绘制一次,或者如果您需要更改实际形状(即不仅仅是变换),您应该 clear()
并重新绘制它是正确的。但是,理想情况下,您不会经常这样做。如果您发现自己经常重绘形状,您可能想转而使用预渲染的 sprite-sheet 方法。在这种情况下,您可以使用 BitmapData
更快地将预绘制的像素数据复制到 Bitmap
对象。这通常比依靠矢量光栅化器渲染 Graphics
命令更快,只要您使用像 copyPixels()
这样的快速像素方法。这可能更接近于您在其他没有内置矢量光栅器的平台上使用的渲染系统。
最后,值得注意的是,在 Flash 中呈现对象的最新(也是最快)方式与所有这些方式完全不同。它被称为 Stage3D,它使用与矢量光栅器完全不同的渲染管道。它由 GPU 渲染 APIs 提供支持,因此速度非常快(非常适合游戏)但没有矢量光栅化功能。它可用于 3D 和 2D。使用起来有点复杂,但是有一些有用的框架可以使它更容易,最值得注意的是 Starling 2D framework.
希望对您有所帮助。
我才刚刚开始使用 Flash/ActionScript,创建 Sprite
s、Bitmap
s、MovieClip
s 等似乎是普遍共识各种对象,以表示图片和其他图形。
然而,我习惯用其他语言编写游戏和诸如此类的东西的方式是重复循环,每一帧使用类似于 Graphics
对象的东西在主 [=11] 上重绘场景=].这也是在 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.
}
}
这可以接受吗?
"Flash way"是使用EnterFrame事件而不是定时器来绘制。您必须随时进行计算,但让 Flash 绘制您的场景。
它在 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.
}
}
请记住,图形 API 是基于矢量的,因此在降低性能之前只会绘制这么多东西。
Sprite 是一个通用容器,不要与术语 "sprite" 在 sprite sheet 中的含义混淆。
当你说 "main Sprite
" 时,你可能指的是一些矩形像素区域,你可以 manipulate.In 在这种情况下,BitmapData
就是你想要的,用 [=13= 显示] 对象。
BitmapData
不提供图形 属性。本质上,绘制矢量和操纵像素在 As3 中是分开处理的。如果你想在 BitmapData 对象中画一条线,你必须首先将线作为矢量绘制到 Sprite
(或者更好的 Shape
,如果你只想在它上面画) 使用它的 graphics
属性,然后使用 BitmapData
的 draw()
根据绘制的线条设置它的像素。
好吧,这取决于。
在 Flash 中,您可以选择依赖 Flash Player 的矢量光栅化器和渲染系统,它会为您计算出所有的重绘。例如,您可以在 Sprite
上绘制一次,然后简单地将变换应用于精灵(设置 x
、y
、width
、height
、rotation
、scaleX
、scaleY
、transform.matrix
、transform.colorTransform
等)。这些对象中的任何一个都可以是矢量形状或位图,您还可以使用 cacheAsBitmap
和 cacheAsBitmapMatrix
进行更多重绘优化。 Flash Player 只会在更改的框架上重绘更改的区域。我认为这是传统的 "Flash way".
使用Graphics
API 只是一种创建矢量形状数据的编程方式。将其视为在 Flash 中绘图的替代代码 IDE。您可以在创建对象时使用 Graphics
绘制一次,或者如果您需要更改实际形状(即不仅仅是变换),您应该 clear()
并重新绘制它是正确的。但是,理想情况下,您不会经常这样做。如果您发现自己经常重绘形状,您可能想转而使用预渲染的 sprite-sheet 方法。在这种情况下,您可以使用 BitmapData
更快地将预绘制的像素数据复制到 Bitmap
对象。这通常比依靠矢量光栅化器渲染 Graphics
命令更快,只要您使用像 copyPixels()
这样的快速像素方法。这可能更接近于您在其他没有内置矢量光栅器的平台上使用的渲染系统。
最后,值得注意的是,在 Flash 中呈现对象的最新(也是最快)方式与所有这些方式完全不同。它被称为 Stage3D,它使用与矢量光栅器完全不同的渲染管道。它由 GPU 渲染 APIs 提供支持,因此速度非常快(非常适合游戏)但没有矢量光栅化功能。它可用于 3D 和 2D。使用起来有点复杂,但是有一些有用的框架可以使它更容易,最值得注意的是 Starling 2D framework.
希望对您有所帮助。