2

私はフラッシュ/アクション スクリプト 3 を学び始めたばかりで、単純なパーティクル シミュレーターをコーディングすることにしました。

非常に初期のデザインでは、クリックするとカーソルから離れて散らばるバンチャ粒子で画面を埋めるだけです。

これは機能しますが、少し反応しません。パーティクルを描画するために 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.
}

Particle には、フレームごとにこれを実行するフレーム リスナーがあります。

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;
    }
}

これをより効率的にするにはどうすればよいですか?後で衝突検出やその他の物理的相互作用を行う予定ですが、後で追加する予定の大量の計算コードがなくても、これはすでに少し遅いです。

4

2 に答える 2

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));
}

これが役立つことを願っています。

于 2011-05-17T08:41:20.160 に答える
1

Actionscript で膨大な数のパーティクルを使用する最善かつ最速の方法は、それらをビットマップデータにブリットすることです。私は粒子が好きなので、この方法がとても気に入っています。これは、クールな見た目のパーティクルエフェクトクロックを使用して、それを行う方法に関するチュートリアルです。

http://plasticsturgeon.com/2010/08/make-super-cool-as3-particle-effects-for-flash-games-with-bitmapdata/

于 2011-05-19T18:39:47.927 に答える