如何模拟物体的更逼真的运动?

时间:2018-08-06 16:39:50

标签: python pygame

我正在写一个游戏环境,其中一个人(工人)应在区域内随机移动,直到与绿色障碍物(定义为pygame.draw.rect(screen, GREEN, [510,150,75,52])和{{1} }。

直到现在我仍可以模拟工人的随机运动,但是它以某种不规则且不平滑的方式运动,在相同区域周围跳跃并缓慢移至右下角。

如何更新功能pygame.draw.rect(screen, GREEN, [450,250,68,40]),以支持工作人员在屏幕区域内更真实地平稳移动?我试图将刻度线的大小增加到70或更多(create_randomPATH),如其中一个线程所示,但这似乎无法解决问题。

clock.tick(70)

2 个答案:

答案 0 :(得分:1)

您可以在代码中使用额外的direction变量,该变量说明播放器当前的移动方向。四个值之一:上,右,下或左。偶尔更新该方向变量。同时一次只能沿该方向移动一个坐标。

def create_randomPATH(self, x, y, dir):
    if random.uniform(0,1)>0.8:
        # there is a 20% chance every time that direction is changed
        dir = random.randInt(1,4)

    if dir == 1:
        return x, y+1, dir # up
    if dir == 2:
        return x+1, y, dir # right
    if dir == 3:
        return x, y-1, dir # down
    if dir == 4:
        return x-1, y, dir # left

在您的代码中,您还需要一个全局方向变量,最初它也应该具有值1、2、3或4:

w_x,w_y,w_dir = worker.create_randomPATH(w_x,w_y,w_dir)

通过在每次迭代中只移动一个步骤,我们可以确保移动速度始终恒定。在您的代码中,它从1步到5步不等。同样,如果您沿给定的方向笔直移动几步,那似乎比经常突然改变方向更自然。尝试尝试改变方向的频率(目前有20%的机会),并查看它是否使运动更加平滑。

编辑:

由于移动的随机性,最终移动的对象将到达游戏的边界并可能离开屏幕。每次移动后调整位置:

w_x,w_y,w_dir = worker.create_randomPATH(w_x,w_y,w_dir)

if (w_x + worker.rect.width > SCREENWIDTH): w_x = SCREENWIDTH - worker.rect.width
if (w_x < 0): w_x = 0
if (w_y + worker.rect.height > SCREENHEIGHT): w_y = SCREENHEIGHT - worker.rect.height
if (w_y < 0): w_y = 0

然后,该对象将不会退出屏幕,最终将再次随机向其他方向移动。由于每个方向的可能性均等,因此它将在屏幕上正常移动。

答案 1 :(得分:1)

采用screen.blit(worker.image, (w_x,w_y))并将其放入自己的方法中。然后,您可以创建一个循环,从oldXoldYcreate_randomPATH找到的新位置,甚至可以使它们在{{1 }}或x的方向。

下面是一个粗糙的示例,但您可能必须对其进行修改以匹配您的代码。

y