【问题标题】:Calculate float with percentages of time and money用时间和金钱的百分比计算浮动
【发布时间】:2016-03-24 18:33:22
【问题描述】:

我想在我的游戏中制作结构的构建过程。仅当时间百分比 (timer/neededTime*100) 小于金钱百分比 (player.money/neededMoney*100) 时,该过程才会继续。每一帧,具体金额,应该从player.money减少,这样整个过程的结束money.player = money.player - neededMoney。我不知道如何计算每帧从钱中减少的浮动。

【问题讨论】:

  • 你用float来代表钱吗?我希望你不要。使用小数类型进行财务计算。
  • OTOH,在假装世界中,使用小数或浮点数进行财务计算只会产生假装后果。
  • 我用 int 来赚钱。我会添加浮动直到它为 1,然后减少 1 钱

标签: c# math


【解决方案1】:

您需要在每个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; }        
}

【讨论】:

  • 这一般不会算总金额
  • 对不起。更正了我的答案。
  • 好的,但我们还是有麻烦。如果 requiredTime 不是 2 的幂,则“减”的数量会稍微偏离,将其相加很多次并不一定会奏效。您可以通过补偿来消除这种影响,例如like this(但在实际游戏中,跟踪必要的数量可能会比较棘手..)
  • Mhh 对我不起作用。也许计算是正确的,但由于帧率可能不同,它减去或多或少地减去它应该。有没有办法将帧率包括在内?也许我可以为此发布整个代码
  • 优秀。 :) 你能批准我的回答吗?
猜你喜欢
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2023-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多