如何使pygame sprite正确地遵循不同速度的航点列表?

时间:2018-04-02 21:49:28

标签: python pygame

我试图在pygame中创建一个sprite组,沿着路径上的一个路径从头到尾跟随一组路点。

精灵只能水平和垂直移动。

有不同的精灵类型,旨在以不同的速度跟随每个航点。

航点列表如下所示:

[(1, (8.0, 120.0)), (2, (264.0, 120.0)), (3, (264.0, 648.0)), (4, (504.0, 648.0)), (5, (504.0, 168.0)), (6, (856.0, 168.0)), (7, (856.0, 328.0)), (8, (664.0, 328.0)), (9, (664.0, 696.0)), (10, (808.0, 696.0)), (11, (808.0, 488.0)), (12, (1016.0, 488.0))]

每个元组中的第一个整数表示精灵应首先到达的坐标的顺序。

精灵从屏幕边缘开始,使用位于精灵类更新功能中的代码转到每个点:

    def update(self, player_health): #ignore player_health parameter - not used yet
        if self.current_coords[0] < self.sprite_waypoints[self.next_waypoint][1][0]:
            self.current_coords[0] += self.speed #if x is less than waypoint x, move foward by a rate of self.speed

        elif self.current_coords[1] < self.sprite_waypoints[self.next_waypoint][1][1]:
            self.current_coords[1] += self.speed #if y is less than waypoint y, move foward by a rate of self.speed

        elif self.current_coords[0] > self.sprite_waypoints[self.next_waypoint][1][0]:
            self.current_coords[0] -= self.speed #if x is greater than waypoint x, move backward by a rate of self.speed

        elif self.current_coords[1] > self.sprite_waypoints[self.next_waypoint][1][1]:
            self.current_coords[1] -= self.speed #if y is greater than waypoint y, move backward by a rate of self.speed

        elif self.current_coords[0] == self.sprite_waypoints[self.next_waypoint][1][0] or self.current_coords[1] != self.sprite_waypoints[self.next_waypoint][1][1]:
            self.next_waypoint += 1 #if the sprite coordinates are the same as the waupoint coordinates, move on to the next waypoint

        self.rect.center = self.current_coords #coordinates to blit sprite

此代码的问题在于它无法适应不是16的倍数的速度(因为地图的网格大小,每个坐标之间的距离是16的倍数)。

如果我想使用5的速度(例如每次更新移动5个像素),当它到达一个航点(表示路径的一个角落)时,它会卡住,因为它从未实际落在航点坐标上,只在它之前和之后。

如何修改此代码,使其能够适应多种速度,同时能够改变方向以移动到下一个航点?

1 个答案:

答案 0 :(得分:1)

检查您是否从下一个更改点小于speed个单位。如果是这样,那么您只移动那么多(调用diff)单位,以便您完全匹配所需的坐标。现在,您已经进行了第二次部分移动,剩余的speed-diff个单位处于新的方向,由您已有的逻辑选择。

这会让你感动吗?