2

この関数を使用して、パーティクル システムのパーティクルを作成しています。

function particle()
{
    this.speed = {x: -1.5+Math.random()*3, y: -12+Math.random()*12};
    this.location = {x: 50, y: 150};
    this.radius = 5+Math.random()*8;
    this.life = 4+Math.random()*8;
    this.remaining_life = this.life;
    this.r = 255;
    this.g = 140;
    this.b = 30;
}

この関数を使用して、アニメーションの過程でパーティクルの特性を更新しています。

particle.prototype.updateparticle = function()
{
    this.remaining_life--;
    this.radius--;
    this.location.x += this.speed.x;
    this.location.y += this.speed.y;

    if(this.remaining_life < 0 || this.radius < 0)
    {
        this.speed = {x: -1.5+Math.random()*3, y: -12+Math.random()*12};
        this.location = {x: 50, y: 150};
        this.radius = 5+Math.random()*8;
        this.life = 4+Math.random()*8;
        this.remaining_life = this.life;
        this.r = 255;
        this.g = 140;
        this.b = 30;    
    }
}

冗長なコードを回避する方法はありますか?

また、使用this = new particle()してみましたが、うまくいきませんでした。うまくいかない理由が思いつきません。なぜそうではないのですか?

まったく関係のない話ですが、Firefox はパーティクル アニメーションを処理できませんか? Chrome が CPU の 5% を使用しています。Firefox は約 30 を使用しますが、まだ遅れています! 私はi5 2500kを持っているので、問題はないはずです。両方の最新バージョンを実行しています。

4

4 に答える 4

2

this現在のオブジェクトを引数として渡して、関数を適用します。

particle.prototype.updateparticle = function()
{
    this.remaining_life--;
    this.radius--;
    this.location.x += this.speed.x;
    this.location.y += this.speed.y;

    if(this.remaining_life < 0 || this.radius < 0)
    {
        particle.apply(this);
    }
}
于 2013-04-21T04:59:38.977 に答える
2

値を初期化するためのプロトタイプ関数を作成する

function particle() {
    this.init();
}

particle.prototype.init = function(){
    this.speed = {x: -1.5+Math.random()*3, y: -12+Math.random()*12};
    this.location = {x: 50, y: 150};
    this.radius = 5+Math.random()*8;
    this.life = 4+Math.random()*8;
    this.remaining_life = this.life;
    this.r = 255;
    this.g = 140;
    this.b = 30;
}

particle.prototype.updateparticle = function() {
    this.remaining_life--;
    this.radius--;
    this.location.x += this.speed.x;
    this.location.y += this.speed.y;

    if(this.remaining_life < 0 || this.radius < 0) {
        this.init();  
    }
}
于 2013-04-21T04:59:44.927 に答える
2

別の関数にして、必要なときにいつでも呼び出すことができます。

function particle()
{
    this.initialize();
}

particle.prototype.initialize = function(){
    this.speed = {x: -1.5+Math.random()*3, y: -12+Math.random()*12};
    this.location = {x: 50, y: 150};
    this.radius = 5+Math.random()*8;
    this.life = 4+Math.random()*8;
    this.remaining_life = this.life;
    this.r = 255;
    this.g = 140;
    this.b = 30;    
}

particle.prototype.updateparticle = function()
{
    this.remaining_life--;
    this.radius--;
    this.location.x += this.speed.x;
    this.location.y += this.speed.y;

    if(this.remaining_life < 0 || this.radius < 0)
    {
        this.initialize();
    }
}
于 2013-04-21T04:59:46.957 に答える
0
function particle(x, y, r, g, b) {
  this.location = {x: x, y: y};
  this.r = r;
  this.g = g;
  this.b = b;

  // Group everything that randomises in update()
  this.update = function() {
    this.speed = {x: -1.5+Math.random()*3, y: -12+Math.random()*12};
    this.radius = 5+Math.random()*8;
    this.life = 4+Math.random()*8;
    this.remaining_life = this.life;
  }

  this.update();
}


particle.prototype.updateparticle = function() {
  this.remaining_life--;
  this.radius--;
  this.location.x += this.speed.x;
  this.location.y += this.speed.y;

  if(this.remaining_life < 0 || this.radius < 0) {
    this.update();
  }
}

//Instantiation
var p1 = new particle(50, 150, 255, 140, 30);
于 2013-04-21T05:10:27.420 に答える