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