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

标签 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

使用这段代码,我的圈子很好地移动到第一个食物,但只移动到第二个食物的一半,并且它移动得越来越少,直到它根本不动。此外,当它几乎到达我不想要的食物时,圆圈开始减速。

最佳答案

你必须计算 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

关于python - 如何将圆圈移动到预定的 x,y 坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56588425/

相关文章:

python - Pygame 不允许我为 rect.move 使用 float ,但我需要它

python - 制作 Python 批处理文件

python - 给定整数参数Python时的字符串操作

python - 类字段的类型注释

python - 覆盖python中的内置类型__str__方法

python - 带有圆角的 Pygame 按钮,border_radius 参数不起作用

python - 为什么每次我播放 "play"音乐时 python 都会发出奇怪的声音?

python - 为什么我的二分搜索实现效率很低?

python - 在 Python 中比较两个 CSV

python - 如何在不停止整个代码的情况下让 Actor 跳跃?