您好我创建了这个功能,用于将游戏世界分成块。 每个块大小为32块。 此公式计算给定世界坐标的给定块编号的起始坐标。它运作良好,但我认为可以优化它,但我不知道。重要的是公式与负数一起使用。
static int wrld2chnk(int wrld)
{
if (wrld % 32 != 0)
{
if (wrld < 0)
wrld -= (32 + wrld % 32);
else
wrld -= wrld % 32;
}
return wrld;
}
//这些是可用于验证结果的示例值。每个rpw中的第一个值是方法输入,第二个是输出:
(0, 0);
(31, 0);
(32, 32);
(33, 32);
(-1, -32);
(-31, -32);
(-32, -32);
(-33, -64);
(-34, -64);
(-64, -64);
(-70, -96);
答案 0 :(得分:5)
首先,第一个if
显然可以。积极的情况也适用于零:
static int wrld2chnk(int wrld)
{
if (wrld < 0)
wrld -= (32 + wrld % 32);
else
wrld -= wrld % 32;
return wrld;
}
但它可以简单得多。你正在解决%
关心这个标志的事实。向下舍入到2的幂的倍数是更容易的,只需使用按位AND与2的幂的负值,你正在向下舍入:
static int wrld2chnk(int wrld)
{
return wrld & -32;
}
答案 1 :(得分:0)
现在家伙怎么样???
if(wrld>0)
wrld = (wrld/32)*32;
else
wrld = ((wrld/32)-1)*32
答案 2 :(得分:0)
这是我的建议:
int wrld2chnk (int wrld)
{
return sgn(wrld)*32*((32*(sgn(wrld)==-1)+abs(wrld))/32);
}
sgn(x)
的位置:
#define sgn(x) (((x)>=0)?1:-1)
虽然如果你担心三元运算符(我只是喜欢它),这里你有sgn()
的一些替代实现:
Is there a standard sign function (signum, sgn) in C/C++?