2016-03-22 10 views
0

私は自分のゲームで構造の構築プロセスを作りたいと思っています。この処理は、時間の割合(timer/neededTime*100)がパーセント(player.money/neededMoney*100)よりも小さい場合にのみ実行されます。すべてのフレーム、特定の金額は、player.moneyから減らす必要がありますので、全体のプロセスの最後はmoney.player = money.player - neededMoneyです。私は毎フレームお金から減らされるフロートを計算する方法を知らない。時間とお金のパーセンテージで浮動小数点を計算する

+1

お金を表すのにフロートを使用していますか?あなたがしないことを願っています。財務計算には小数点タイプを使用します。 –

+0

OTOHは、世界を信じて、財務計算に小数点または浮動小数点を使用すると、結果を信じるに過ぎません。 – Teepeemm

+0

私はお金のためにintを使用します。私はそれが1になるまでフロートを追加し、その後に1つのお金を減らす – Element4life16

答えて

0

neededTime単位のneededMoneyの部分を減算する必要がありますか?

neededTime単位(これは負でない非ゼロの整数値であると見なされます)、neededMoney/neededTimeを減算する必要があります。

フレームごとに、コードは次のようになります。 framesPerSecondが定数であり、neededTimeが秒単位であると仮定します。

var secondsPerFrame = 1/(float)framesPerSecond; 
var moneyPerSecond = neededMoney/(float)neededTime; 
var moneyPerFrame = moneyPerSecond * secondsPerFrame; 
//The above can be rewritten as: 
//var moneyPerFrame = neededMoney/(float)neededTime/(float)framesPerSecond); 

if (player.money >= moneyPerFrame) 
{ 
    player.money -= moneyPerFrame; 
} 

変更するフレームレートをサポートするためのアップデート

私は変化するフレームレートと不十分利用可能な資金に対処することができるはずクラスを書きました。各フレーム(または適宜)に、GetValueToSubtract()メソッドを呼び出します。

public class BuildingExpenseCalculator 
{ 
    private readonly IAccount _account; 
    private readonly float _moneyNeeded; 
    private readonly float _spendingRate; 

    private float _moneyNeededRemaining; 
    private DateTime _lastSubtract; 

    public BuildingExpenseCalculator(IAccount account, float moneyNeeded, TimeSpan timeNeeded) 
    { 
     _account = account; 
     _moneyNeeded = moneyNeeded; 

     _spendingRate = moneyNeeded/(float) timeNeeded.TotalSeconds; 
    } 

    public void StartCalculation() 
    { 
     _lastSubtract = DateTime.Now; 
     _moneyNeededRemaining = _moneyNeeded; 
    } 

    public float GetValueToSubtract() 
    { 
     var now = DateTime.Now; 
     var timePassedSinceLastSubtract = now - _lastSubtract; 
     var moneyToSubtractSinceLast = (float)(_spendingRate*timePassedSinceLastSubtract.TotalSeconds); 

     // Ensure we do not exceed the remaining money that is needed. 
     moneyToSubtractSinceLast = Math.Min(moneyToSubtractSinceLast, _moneyNeededRemaining); 

     // Ensure we do not spent more money than is available in the account. 
     moneyToSubtractSinceLast = Math.Min(moneyToSubtractSinceLast, _account.AvailableMoney); 

     // Update for next iteration. 
     _moneyNeededRemaining -= moneyToSubtractSinceLast; 
     _lastSubtract = now; 

     return moneyToSubtractSinceLast; 
    } 
} 

public interface IAccount 
{ 
    float AvailableMoney { get; set; }   
} 
+0

それは合計金額に一般的に合算されません – harold

+0

申し訳ありません。私の答えを訂正しました。 –

+0

でも問題はまだ残っています。必要な時間が2のべき乗でない場合、量「減算」はわずかにオフであり、それを一括して合計することは必ずしも機能しない。たとえば、[このような](http://ideone.com/exhDZ0)を補うことによって、この効果を戦うことができます(実際のゲームでは、必要な量を追跡するのが難しいかもしれません..) – harold

関連する問題