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

时间:2019-06-13 20:53:25

标签: python pygame

我有一个“食物”数组,我有一个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

使用此代码,我的圈子很好地移动到了第一个食品,但仅移动到了第二个食品的一半,并且它一直移动得越来越少,直到完全不动为止。另外,当它几乎到达我不想要的食物时,圆圈开始减速。

1 个答案:

答案 0 :(得分:1)

您必须从圆圈沿食物方向计算Unit vector(单位向量的长度为1)。用speed缩放单位矢量,并将结果添加到圆的坐标。
在pygame中,您可以使用pygame.math.Vector2进行矢量计算,.normalize()可以计算单位矢量:

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