我刚开始学习flash / actionscript 3并决定编写一个简单的粒子模拟器。
最初的设计只需要在屏幕上填充一个buncha粒子,如果你点击它就会离开光标。
这有效,但有点反应迟钝。我使用graphics.drawCircle()来绘制粒子,每个粒子都是从Sprite继承的。
mouseclick事件的监听器:
private function mouseClick(e:MouseEvent):void
{
trace("click");
var now:Date = new Date();
trace("Before: "+now.getTime());
for each (var p:Particle in particleList)
{
var dist:Number = distance(e.localX,e.localY,p.x,p.y);
if (dist < 50)
{
var xVel:Number = p.x - e.localX;
var yVel:Number = p.y - e.localY;
xVel *= Math.max(0,50 - dist) * 0.05;
yVel *= Math.max(0,50 - dist) * 0.05;
p.xVel += xVel;
p.yVel += yVel;
}
}
var later:Date = new Date();
trace("After: "+later.getTime());
trace("Total: "+(later.getTime()-now.getTime()));
//e.
}
在“粒子”中,每帧都有一个帧监听器:
public function loop(e:Event):void
{
if (xVel != 0 || yVel != 0 || setup)
{
setup = false;
x += xVel;
y += yVel;
if (x < 0)
{
x = 0;
xVel = - xVel;
}
if (x > stageRef.stageWidth)
{
x = stageRef.stageWidth;
xVel = - xVel;
}
if (y < 0)
{
y = 0;
yVel = - yVel;
}
if (y > stageRef.stageHeight)
{
y = stageRef.stageHeight;
yVel = - yVel;
}
graphics.clear();
graphics.lineStyle(.25,0xFFFFFF,0.5);
graphics.drawCircle(0,0,1);
xVel *= Engine.friction;
yVel *= Engine.friction;
}
if (xVel < 0.01 && xVel > -0.01)
{
xVel = 0;
}
if (yVel < 0.01 && yVel > -0.01)
{
yVel = 0;
}
}
我应该如何提高效率?我计划稍后进行碰撞检测和其他物理交互,即使没有我打算稍后添加的大量数字运算代码,这已经有点慢了。
答案 0 :(得分:3)
对于太多的形状使用图形是非常慢的...你的代码没有太大的变化你可以尝试,每个框架,在BitmapData中绘制你的形状(首先在单个形状或多种形状中绘制它们,然后使用BitmapData绘制,然后清除所有图形)。我认为你应该得到一点改进。基本代码是:
for(...) {
shape.graphics.drawCircle(0,0,1);
}
bitmapData.draw(shape);
shape.graphics.clear();
另一方面,我知道1像素粒子的最快方法是为每个粒子使用BitmapData和setPixel:
bitmapData.fillRect(bitmapData.rect, 0);
bitmapData.lock();
for(...) {
bitmapData.setPixel(x,y,0xFFFFFF);
}
bitmapData.unlock();
对于更大或更复杂的粒子,我听说copyPixels是要走的路,但是你需要预先对所有不同的粒子进行打击(虽然我没有太多经验,但是我我发现很多情况下使用BitmapData绘图更好,或者甚至将每个bitmapData放在不同的精灵中):
bitmapData.fillRect(bitmapData.rect, 0);
for(...) {
bitmapData.copyPixels(myParticle10, myParticle10.rect, new Point(tx, ty));
}
击> <击> 撞击>
我希望这会有所帮助。
答案 1 :(得分:1)
在Actionscript中拥有大量粒子的最好和最快的方法是将它们blit到bitmapdata。我对颗粒很有帮助,我真的很喜欢这种方法。 这是一个关于如何操作的教程,带有一个很酷的粒子效果时钟。