-2

私は船体とシールドを持っており、損傷したときにダメージを受けて最初にシールドから差し引き、それが空のときに船体から取るようにしたい. しかし、シールドの残りが 100 でダメージが 400 の場合、1000 で開始した場合の船体は 700 になります。

ここでなんとかできたのは、シールド部分は機能しますが、船体アルゴリズムが難しすぎて把握できません。

Player.prototype.deductHealth = function(damage)
{

  var shield = (this.PlayerShield - damage);
  var remainder = (damage - this.PlayerShield);
  var hull = this.PlayerHull;

  if(this.PlayerShield < 0)
   {

     hull = (this.PlayerHull - remainder);
   }

   if(hull <=0)
   {
   hull = 0;
   shield = 0;
   }

   this.PlayerHull = hull;
   this.PlayerShield = shield;

}
4

3 に答える 3

0

うーん...これを試してみてください。船体とシールドの強度を表すローカル変数と、船体とシールドを表すメンバー変数を混乱して参照しているため、問題があると思います。私の提案は、次のようにメンバー変数のみを使用することです。

Player.prototype.deductHealth = function(damage)
{

  var shieldOverkill = (damage - this.PlayerShield);
  this.PlayerShield = this.PlayerShield - damage;

  if ( shieldOverkill > 0 )
  {
      this.PlayerHull = this.PlayerHull - shieldOverkill;
  }

  if( this.PlayerHull < 0)
  {
      this.PlayerHull= 0;
  } 
  if ( this.PlayerShield < 0 )
  {
      this.PlayerShield = 0;
  }

}

于 2013-06-09T17:53:37.340 に答える
0

今はテストできませんが、このようなものはうまくいくと思います。

Player.prototype.deductHealth = function(damage)
    {

      var shield = (this.PlayerShield - damage);   
      var remainder = 0;
      if (shield<0) {
          remainder=-shield; 
          shield=0;
      }

      var hull = this.PlayerHull;        
      if(remainder > 0)
       {        
         hull = (this.PlayerHull - remainder);
       }

       if(hull <=0)
       {
          hull = 0;
          shield = 0;
       }

       this.PlayerHull = hull;
       this.PlayerShield = shield;

    }
于 2013-06-09T17:48:13.177 に答える
0

それでは、順を追って説明しましょう。

Player.protoype.deductHealth = function (damage) {
   this.PlayerShield -= damage; // First deduct the damage from the shields:
   if (this.PlayerShield < 0) { // If shields are negative
     // Take the damage not absorbed by shields from hull;
     this.PlayerHull += this.PlayerShield;  // note we use + since shields are negative
     this.PlayerShield = 0; // Set shields to 0
     if (this.PlayerHull < 0) { // If hull now negative
       this.PlayerHull = 0; // set to zero.
     }
   }
}

より適切な名前を使用した、より高度なバージョン:

Player.prototype.takeHit (damage) {
  if ((this.shields -= damage) < 0) { // Shields exhausted ?
    if ((this.hull += this.shields) < 0) { // Hull exhausted?
       this.hull = 0;
    } 
    this.shields = 0;
  }
}
于 2013-06-09T17:55:47.260 に答える