我有一个“食物”数组,我有一个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
使用此代码,我的圈子很好地移动到了第一个食品,但仅移动到了第二个食品的一半,并且它一直移动得越来越少,直到完全不动为止。另外,当它几乎到达我不想要的食物时,圆圈开始减速。
答案 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