【问题标题】:XNA - gameTime modulo returns 0XNA - gameTime 模返回 0
【发布时间】:2014-01-27 17:26:02
【问题描述】:

i = (gameTime.TotalGameTime.Milliseconds / n) % 11

这里的模返回以下数字:{1,2,3,4,5,6,7,8,9,10,0,1,0} 但是最后的零和那个让我很困扰,因为它不应该是这样的,不是吗?我想要的结果是返回 {1,2,3,4,5,6,7,8,9,10,11,0},但它没有。有没有人对此作出解释?我完全不知道是什么原因造成的,我已经尝试过这段代码的不同版本,也将 11 更改为其他内容,但也没有成功。

【问题讨论】:

    标签: c# xna modulo


    【解决方案1】:

    不,因为11 % 11 为零。见文档:http://msdn.microsoft.com/en-us/library/0w4e0fzs.aspx

    【讨论】:

      【解决方案2】:

      您的模值应该是 12,而不是 11。模返回除法的余数(更准确地说,m % n 的等式是 m - floor(m/n)n),所以 11 / 11 确实会返回 0。

      但是,如果有 12,11 / 12 将是 11,12 / 12 是 0,而 13 / 12 有 1 作为余数。它“环绕”您的value - 1

      所以你应该改用这个:

      i = (gameTime.TotalGameTime.Milliseconds / n) % 12
      

      以 12 为例:

      var b = 10 % 12; //10
      var c = 11 % 12; //11
      var d = 12 % 12; //0
      var e = 13 % 12; //1
      

      【讨论】:

        【解决方案3】:

        不,% operator 返回左操作数除以右操作数时的余数。换句话说,x % x 总是返回 0,因为 x 完全可以被 x 整除。或者更一般地说,对于整数,nmx(n * x + m) % x == m

        如果您想要范围从 0 到 11 的值,请使用模 12:

        i = (gameTime.TotalGameTime.Milliseconds / n) % 12
        

        【讨论】:

        • 谢谢你们三个 :) 我又犯了一个错误——因为它实际上应该是“TotalGameTime.TotalMilliseconds”。在我的代码中,毫秒总是上升到 1000,然后重置,再次从 0 开始。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        • 2019-05-12
        • 2023-01-28
        • 1970-01-01
        相关资源
        最近更新 更多