Python pygame,移动一个对象

时间:2015-02-15 04:13:01

标签: python pygame move

我一直在学习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

它有效,但由于顺序的顺序,它不是很流畅。即如果我按住左按钮,对象将向左移动。如果我然后按住右按钮同时按住左按钮它将继续向左。然而,如果我做相反的事情(向左保持向右切换),对象将暂时离开。关于如何让这种行为在双方都反映出来的任何想法?

3 个答案:

答案 0 :(得分:1)

你自己引入了不对称性,通过以特定的顺序检查左右,而不依赖于之前的压力。

为了对称行事,根据之前按下的按钮决定你想要做什么,这取决于之前按下的按钮 - 所以你需要跟踪后者作为程序状态的一部分。

因此初始化先前按下的左/右键组为空:

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最多只有两个按钮中的一个(当两个按钮被按下一段时间它会记住哪一个被按下第一个)所以你可以故意决定“现在是什么“如果在按住第一个按钮的同时按下第二个按钮 - 上面的代码反映了我认为您想要的逻辑,但是当然可以调整。

关键是要根据支票的顺序避免不对称,如果两者都被按下,或者两者都没有!

答案 1 :(得分:1)

首先,它对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

答案 2 :(得分:0)

谢谢Alex。这绝对让我走上了正确的道路。 在主程序循环之前我把:

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语句,因为它没有阻止对象移动。有时如果我把两把钥匙按在一起,我就得到了“左”和“右”的双重声音。打印,但通过'打印永远不会被打破,所以可以被提出来。哇哇,我今天学到了一些东西,并按预期工作。 :P