Python pygame, 移动对象

Python pygame, moving an object

我一直在按照教程学习 pygame。 我有这段代码可以在 pygame.

中移动对象
    key = pygame.key.get_pressed()
    dist = 1 # distance moved in 1 frame, try changing it to 5
    if key[pygame.K_DOWN]: # down key
        self.y += dist # move down
    elif key[pygame.K_UP]: # up key
        self.y -= dist # move up
    else:
        self.y = 0
    if key[pygame.K_RIGHT]: # right key
        self.x += dist # move right
    elif key[pygame.K_LEFT]: # left key
        self.x -= dist # move left
    else:
        self.x = 0

它可以工作,但由于顺序的原因,它不是很流畅。即,如果我按住左键,对象将向左移动。如果我然后按下右按钮,同时按住左按钮,它将继续向左移动。但是,如果我做相反的事情(按住右切换左)对象将暂时向左移动。关于如何让这种行为反映在两侧有什么想法吗?

您自己引入了不对称性,通过以独立于之前按下的内容的特定顺序检查右侧和左侧。

为了对称地表现,决定如果现在按下两个按钮你想做什么,这取决于之前按下了哪个 - 所以你需要将后者作为程序状态的一部分进行跟踪。

所以将之前按下的left/right组键初始化为空:

was_pressed = set()

然后在你的循环中你可以从

开始
if key[pygame.K_RIGHT] and key[pygame.K_LEFT]:
    if pygame.K_RIGHT in was_pressed:
        # the left one's the new one!
        self.x -= dist # move left
    elif pygame.K_LEFT in was_pressed:
        # the right one's the new one!
        self.x += dist # move right
    else:
        # both freshly pressed at once, what now?!
        pass  # assume e.g they "cancel each other out"
elif key[pygame.K_RIGHT]:
    was_pressed = {pygame.K_RIGHT}
    self.x += dist # move right
elif key[pygame.K_LEFT]:
    was_pressed = {pygame.K_LEFT}
    self.x -= dist # move left
else:
    was_pressed = set()

当然,上下也类似。核心思想是was_pressed最多有两个按钮中的一个(当两个按钮都被按下一段时间后它会记住哪个被按下第一个)所以你可以故意决定"what now" 如果在按住第一个的同时也按下第二个——上面的代码反映了我认为你想要的逻辑,从你的 Q 措辞方式来看,但当然可以调整。

关键是要避免不对称,这取决于检查的顺序,如果两者都按下或都不按下!

首先这对Pygame来说不是一个好方法。 else 部分是不必要的。您可以像这样捕获键盘事件;

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                self.y -= dist
            if event.key == pygame.K_LEFT:
                self.x -= dist
            .... #going on like this
        if event.type == pygame.KEYUP: #when stop pressing the button
            #catch keyboard events however you want

谢谢亚历克斯。这绝对让我走上了正确的道路。 在主程序循环之前我输入:

was_pressed=set()

我的主循环中的代码最终为:

if(pygame.key.get_pressed()[pygame.K_LEFT]) and (pygame.key.get_pressed()[pygame.K_RIGHT]):
        if pygame.K_RIGHT in was_pressed:   # the left one's the new one!
            x_speed = -3               # move left
            print("right")
        elif pygame.K_LEFT in was_pressed:  # the right one's the new one!
            x_speed = 3                    # move right
            print("left")
        else:                               # both freshly pressed at once, what now?!
            print("pass")
            pass
    elif(pygame.key.get_pressed()[pygame.K_RIGHT]):
        was_pressed = {pygame.K_RIGHT}
        x_speed=3
        print("right2")
    elif(pygame.key.get_pressed()[pygame.K_LEFT]):
        was_pressed = {pygame.K_LEFT}
        x_speed=-3
        print("left2")
    else:
        x_speed=0

我把打印语句放在那里,这样我就可以很容易地弄清楚什么在做什么。我更改了最后一个 else 语句,因为它没有阻止对象移动。有时,如果我同时按下两个键,我会听到“左”或 'right' 打印的双响,但 'pass' 打印从来没有被撞过,所以可以提交。哇哦,我今天学到了一些东西并且它按预期工作。 :P