Actionscript 3 AS3粒子虚拟阵列
不久前,我根据教程制作了一个粒子类。基本上,它使用了某种虚拟列表,取代了数组方法,这使得它成为一个非常快速的解决方案。所以一切都很顺利,除了我真的不明白到底发生了什么。这是相当混乱,所以我试图找到这个东西的逻辑,不幸的是没有成功。如果有人能真正解释这一点,我会很高兴,这样我就能把它变成有用的东西Actionscript 3 AS3粒子虚拟阵列,actionscript-3,actionscript,particles,Actionscript 3,Actionscript,Particles,不久前,我根据教程制作了一个粒子类。基本上,它使用了某种虚拟列表,取代了数组方法,这使得它成为一个非常快速的解决方案。所以一切都很顺利,除了我真的不明白到底发生了什么。这是相当混乱,所以我试图找到这个东西的逻辑,不幸的是没有成功。如果有人能真正解释这一点,我会很高兴,这样我就能把它变成有用的东西 package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.dis
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import Part;
import FPSCounter;
public class Pixels extends Sprite
{
private var num:int = 500000;
private var sw:Number = stage.stageWidth;
private var sh:Number = stage.stageHeight;
private var bdata:BitmapData=new BitmapData(sw,sh,false,0x111111);
private var bmp:Bitmap = new Bitmap(bdata);
private var firstParticle:Part;
private var radius:Number;
private var range:Number;
private var color:uint = 0xffffff;
public function Pixels()
{
addChild(bmp);
addChild(new FPSCounter());
createParticles();
addEventListener(Event.ENTER_FRAME,anim);
}
private function createParticles():void
{
var lastParticle:Part;
for (var i:int = 0; i < num; i++)
{
radius = Math.random() * (2 * Math.PI);
range = Math.random() * (2 * Math.PI);
var thisP:Part = new Part;
thisP.x = sw / 2;
thisP.y = sh / 2;
thisP.xvel=Math.sin(range) * radius;
thisP.yvel = Math.cos(range) * radius;
if (i == 0)
{
firstParticle = thisP; }
else
{
lastParticle.next = thisP; // ????
}
lastParticle = thisP;
}
}
private function anim(event:Event):void
{
var p:Part = firstParticle;
bdata.lock();
p = firstParticle;
bdata.fillRect(bdata.rect, 0x111111);
do
{
p.y += p.xvel;
p.x += p.yvel;
bdata.setPixel(p.x, p.y, color);
p = p.next;
}
while (p != null)
bdata.unlock();
}
}
包
{
导入flash.display.Bitmap;
导入flash.display.BitmapData;
导入flash.display.Sprite;
导入flash.events.Event;
进口部分;
进口柜台;
公共类像素扩展了Sprite
{
私有变量数:int=500000;
专用var sw:编号=stage.stageWidth;
私有变量sh:Number=stage.stageHeight;
私有变量bdata:BitmapData=新的BitmapData(sw、sh、false、0x111111);
私有变量bmp:Bitmap=新位图(bdata);
私人物品:第二部分;
私有变量半径:数字;
私有var范围:数字;
私有变量颜色:uint=0xffffff;
公共功能像素()
{
addChild(bmp);
addChild(新的FPSCounter());
创建粒子();
addEventListener(事件输入帧,动画);
}
私有函数createParticles():void
{
粒子:部分;
for(变量i:int=0;i
这称为链表。请参阅
此应用程序的更好结构可能是向量。这是AS3中的一种数组数据类型,与您现在所做的一样,针对顺序访问进行了优化。因为您有固定数量的粒子,所以您不必担心调整向量大小的成本。在需要添加或删除不在当前位置的元素的情况下,链表非常有用e列表的末尾,或者当您需要高度可变的元素数时
使用如下向量:
// This is a member variable
private var particles : Vector.<Part> = new Vector.<Part>(num);
// This fills the particle list
for(var ii : int = 0; ii < num; ++ii) {
var part : Part = new Part();
// Initialize the particle here
particles.push_back(part);
}
// This iterates through the particles
for each(var part : Part in particles) {
// Draw part
}
//这是一个成员变量
私有变量粒子:向量=新向量(num);
//这将填充粒子列表
对于(变量ii:int=0;ii
谢谢你的回答。我认为vector在这里不是一个好的选择,因为我在示例中有50万个粒子。在所有粒子之间循环将花费很多时间。在任何情况下都会花费很多时间,vector非常适合索引访问。但一般来说,如果粒子繁殖和销毁,人们会为它们编写列表这是因为ActionScript缺少默认值链表比表快vector@Patrick链表比矢量快,但性能与矢量相同。请参阅。对于粒子引擎,粒子不断被破坏和创建,粒子的每个属性(而不是对象)的矢量通常最快。(例如,粒子_x[],粒子_y[])