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
我一直在按照教程学习 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