【问题标题】:How do I move my circle to a predetermined x,y coordinate? [duplicate]如何将我的圆圈移动到预定的 x,y 坐标? [复制]
【发布时间】:2019-10-28 12:22:55
【问题描述】:

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

使用此代码,我的圆圈很好地移动到第一个食物项目,但只移动到第二个项目的一半,并且它越来越少地移动,直到它完全不动。此外,当圆圈快要吃到我不想要的食物时,它开始减速。

【问题讨论】:

    标签: python pygame


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-05-02
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      相关资源
      最近更新 更多