我有一个“食物”数组,我有一个 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
使用这段代码,我的圈子很好地移动到第一个食物,但只移动到第二个食物的一半,并且它移动得越来越少,直到它根本不动。此外,当它几乎到达我不想要的食物时,圆圈开始减速。
你必须计算 Unit vector从食物方向的圆圈开始(单位向量的长度为 1)。按速度
缩放单位向量,并将结果添加到圆的坐标。
在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