我目前正致力于在游戏中创建基于2d矢量的动作,我需要一些帮助来计算我的数学。在每个刻度线上,我在操纵杆上基于x和y轴创建基本方向向量。轴的值非常正常,范围从-1到1.但问题是计算幅度。如果我在方向上的正常移动大小为1,那么当我创建这个新向量时,大小通常会大于1.对于游戏来说,这会产生一个问题,因为我想要在每个方向上行走以获得相同的速度。
我的解决方案之一就是将幅度剪切为1.这看起来很简单,但我觉得我正在采取一种捷径,以正确的方式解决这个问题。我接近这个错误并允许沿对角线更快地移动实际上是正确的动作吗?感谢
答案 0 :(得分:1)
如果你想要一个恒定的速度,那么你应该将矢量标准化
double dx = read_x();
double dy = read_y();
double L = sqrt(dx*dx + dy*dy);
dx /= L; dy =/ L;
如果你想要一个变速,问题确实是操纵杆允许更大的对角线速度。
将长度限制为1(即只保护if (L > 1)
后面的归一化除法)可能没问题,但只有实验才能证明。
另一种选择是通过使用扩展长度缩放长度来规范方向的长度,以便当操纵杆处于极限位置时输入将具有单一长度,但是沿着方向从0缩放到该值而不只是夹紧:
在代码中:
double dx = read_x();
double dy = read_y();
double L = sqrt(dx*dx + dy*dy);
if (L > 0) {
double angle = atan2(dy, dx);
double kx = fabs(cos(angle));
double ky = fabs(sin(angle));
double k = std::max(kx, ky);
kx /= k; ky /= k;
double ext = sqrt(kx*kx + ky*ky);
dx /= ext; dy /= ext;
}
您可以在行动here中看到这些公式。
真的只用你的游戏进行测试可以给出答案,但从内心的感觉来说,我只是说钳夹效果更好。