如何将圆移动到预定的x,y坐标?

2024-09-28 22:19:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个“食物”数组,我有一个for循环,得到食物的x和y。食物只是随机放在窗户上的一个红点。有了x和y,我如何以一定的速度把圆移动到这些坐标上?你知道吗

pygame.draw.circle(win, (0, 255, 0), (round(x), round(y)), radius)
index = 0
for index in food_list:
    food_x, food_y = index[0], index[1]
    distance_x, distance_y = food_x - x, food_y - y
    stepx, stepy = distance_x * speed, distance_y * speed
    x = x + stepx
    y = y + stepy

有了这个代码,我的圆很好地移动到第一个食物项,但只移动到第二个食物项的一半,它一直移动得越来越少,直到它完全不移动为止。而且,当它接近我不想要的食物时,圆圈开始变慢。你知道吗


Tags: forindexfood数组pygame速度distance食物
1条回答
网友
1楼 · 发布于 2024-09-28 22:19:19

你必须从食物方向的圆计算出Unit vector(单位向量的长度是1)。按speed缩放单位向量,并将结果添加到圆的坐标中。
在pygame中,可以使用^{}计算向量,^{}计算单位向量:

p_food = pygame.math.Vector2(index[0], index[1])
p_circle = pygame.math.Vector2(x, y)
unit_dir = (p_food - p_circle).normalize()

x += unit_dir.x * speed
y += unit_dir.y * speed

当然,这可以简化:

x, y = (pygame.math.Vector2(index) - (x, y)).normalize() * speed + (x, y)

如果你想从食物上一步一步走到下一步,那么你不能像这样做一个循环,但你可以一个接一个地把食物列在清单上。使用索引(food_i)来标识要移动到的food_list的下一个对象。当食物到达时,增加指数:

在程序的主循环之前初始化下一个食物的索引:

food_i = 0

通过应用程序循环中的.distance_to()计算从圆心到食物的距离:

p_food = pygame.math.Vector2(food_list[food_i])
dist = p_food.distance_to((x, y))

将圆圈向食物移动一步。通过计算剩余距离和一步距离的最小值(min(dist, speed)),确保圆圈不会跨过食物:

if dist > 0:
    x, y = (p_food - (x, y)).normalize() * min(dist, speed) + (x, y)

切换到下一个食物,如果到达食物:

if dist < speed and food_i < len(food_list)-1:
    food_i += 1

相关问题 更多 >