gpt4 book ai didi

c - 屏幕宽度和高度的 Sprite 旋转数学公式

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:25 25 4
gpt4 key购买 nike

我正在用 C 语言编写一个小行星类型的游戏,我有一个包含 36 个 sprite 的 sprite 表,这些 sprite 正在旋转。我想知道一个数学公式来计算如何使船朝着我从 Sprite 表中选择的 Sprite 的方向移动。请注意,我增加了 10 度(因此 36 度为 36 个 Sprite )。

例如,我的屏幕是 320 像素宽 x 256 像素高。如果我选择 sprite 图像 10(90 度(船面向右)),我如何计算(使用某种公式)X 和 Y 坐标以将船移入?我知道 90 度很容易,想象一下如果它是 30 度。 X有一定的值,Y有一定的值。由于屏幕宽度比高度大,所以X速度会比Y速度快。

希望这是有道理的。非常感谢。

最佳答案

有两种简单的方法:您可以为 36 个角度中的每一个角度构建一个 [x,y] 距离表,或者您可以“即时”进行数学计算。

立即计算距离的好处是,如果您决定需要超过 36 个角度(并且不介意 Sprite 偏离几度),您以后可以轻松提高精度。此外,由于您无论如何都会使用 float ,因此您可以更准确地进行所有计算。您的速度可能低至每秒 0.01 像素,如果您也将位置存储为 float ,您会看到您的 Sprite 每隔几分钟移动一点点。

不过,预先计算表格既简单又快速。运行此程序以创建数组 xmoveymove。然后,对于角度 a,您可以设置 xpos += ((speed*xmove[a])>>8)ypos += ((speed *ymove[a])>>8).

该表存储 sin 和 cos 乘以 256,作为整数。这些值需要乘以一些大的因子,因为它们总是落在浮点范围 -1..1 内;将它们存储为原始浮点值是可能的,但没有必要(在您的情况下,它只会重新引入可以用纯整数合理近似的浮点计算)。现在,由于这些值被“预乘”了 256,您需要再次用该数字 speed*move 计算——只需要右移 8 位即可。 (这里有一个小的舍入问题;如果它困扰您,请在右移前添加 128。)

您可以通过使用 1024 或更高的乘数来使用更高的精度,但同样,对于您的目的而言,更高的精度可能完全不可见。 (“1024”而不是“1000”,因为您仍然可以有效地使用该数字进行位移。)

我相信现在任何现代屏幕都有近乎正方形的像素,所以除非你想要它作为某种特殊效果,否则 y 方向的速度应该与 x 方向的速度相同。但是,添加起来很简单。不是除以 256,而是使用 ypos += ((speed*ymove[angle])/341); —— 这是 (4*256/3),所以垂直速度为水平速度的75%。

最后一个可能的改进:您还可以将 xpos,ypos 存储为预乘以 256!然后您将将新坐标右移,而是立即添加正确的值。只有在显示实际 Sprite 时,您才将坐标除以 256。这样您的船将不会仅移动“整个像素”,而是更加平滑。如果您的 speed 是可变的,您可以以相同的方式以更高的精度存储它(请记住正确缩小比例,因为它会使您的“虚拟”速度比您的“屏幕”高 256*256速度)。

下面创建的表格假设#0 是“直线向上”,#9(不是 10!)是“右”,#18 是下,#27 是“左”,其中正 y 指向下。

顺便说一下:你的船的大小并不重要......你可能不希望它“跳跃”的距离等于它自己的大小。

#include <stdio.h>
#include <math.h>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

int main (void)
{
int i, angle;

printf ("int xmove[36] = {\n");
for (i=0; i<36; i++)
{
angle = 10*i;
// x distance: sin
printf ("\t%d,", (int)(round(256*sin(angle * M_PI/180))));
printf ("\t\tangle: %d\n", angle);
}
printf ("};\n");
printf ("\n");
printf ("int ymove[36] = {\n");
for (i=0; i<36; i++)
{
angle = 10*i;
// y distance: cos
printf ("\t%d,", (int)(round(-256*cos(angle * M_PI/180))));
printf ("\t\tangle: %d\n", angle);
}
printf ("};\n");
return 0;
}

关于c - 屏幕宽度和高度的 Sprite 旋转数学公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20812575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com