在 pygame 中不断移动
constant movement in pygame
这是我的第一个 pygame 代码不多,很简单。当我想移动我的播放器时,它可以工作,但我希望移动平稳。就像当我向左按时,我希望它向左移动。目前,每次我都必须按下左按钮,以便播放器向左移动。您对如何做到这一点有什么建议吗?
import pygame, sys
pygame.init()
window_size = ( 400, 400 )
white = ( 255, 255, 255 )
class Player():
image = pygame.image.load( 'foo.png')
rect = image.get_rect()
player = Player()
screen = pygame.display.set_mode( window_size )
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
move = (-10, 0 )
player.rect = player.rect.move(move)
if event.key == pygame.K_RIGHT:
move = ( 10, 0 )
player.rect = player.rect.move(move)
if event.key == pygame.K_UP:
move = ( 0,-10 )
player.rect = player.rect.move(move)
if event.key == pygame.K_DOWN:
move = ( 0, 10 )
player.rect = player.rect.move(move)
screen.fill( white )
screen.blit( player.image, player.rect )
pygame.display.flip()
编辑 我对亚伦回答的态度:
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pressed = pygame.key.get_pressed()
if pressed[pygame.K_LEFT]:
move = ( 2, 0 )
player.rect = player.rect.move(move)
if pressed[pygame.K_RIGHT]:
move = ( 2, 0 )
player.rect = player.rect.move(move)
if pressed[pygame.K_UP]:
move = ( 0,-2 )
player.rect = player.rect.move(move)
if pressed[pygame.K_DOWN]:
move = ( 0, 2 )
player.rect = player.rect.move(move)
您可以同时跟踪 KEYUP
和 KEYDOWN
事件,然后为您跟踪的每个按键存储按下状态。
现在,不是在用户按下某个键时移动播放器,而是测试键的状态以查看它是否被按下,如果是则向播放器应用移动。
举个简单的例子:
pressed_keys = {
'left': false,
...define other keys...
}
while not done:
# Check for key events
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
pressed_keys['left'] = True
...check other keys...
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
pressed_keys['left'] = False
...check other keys...
# Move the player
if pressed_keys['left']:
...move player left...
正在查看 Sloth's answer 的类似问题。看来您有两种可能的方法,使用 set_repeat 或 get_pressed.
set_repeat
When the keyboard repeat is enabled, keys that are held down will generate multiple pygame.KEYDOWN events. The delay is the number of milliseconds before the first repeated pygame.KEYDOWN will be sent. After that another pygame.KEYDOWN will be sent every interval milliseconds. If no arguments are passed the key repeat is disabled.
Source
像这样的东西就可以完成工作:
# set_repeat(delay, interval)
pygame.key.set_repeat(1, 10)
# A delay of 0 disables the repeat.
# The lower the interval, the faster the movement would be.
get_pressed
Returns a sequence of boolean values representing the state of every key on the keyboard. Use the key constant values to index the array. A True value means the that button is pressed.
Getting the list of pushed buttons with this function is not the proper way to handle text entry from the user. You have no way to know the order of keys pressed, and rapidly pushed keys can be completely unnoticed between two calls to pygame.key.get_pressed(). There is also no way to translate these pushed keys into a fully translated character value. See the pygame.KEYDOWN events on the event queue for this functionality.
Source
像这样的东西应该很适合你的代码:
pressed = pygame.key.get_pressed()
if pygame.K_LEFT in pressed:
# move left
if pygame.K_RIGHT in pressed:
# move right
在@ZedsWhatSheSaid 的代码中实施的解决方案,还添加了 PEP-8 格式:
import pygame
import sys
pygame.init()
window_size = (400, 400)
white = (255, 255, 255)
class Player():
image = pygame.image.load('foo.png')
rect = image.get_rect()
player = Player()
screen = pygame.display.set_mode(window_size)
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pressed = pygame.key.get_pressed()
if pygame.K_LEFT in pressed:
move = (-10, 0)
player.rect = player.rect.move(move)
if pygame.K_RIGHT in pressed:
move = (10, 0)
player.rect = player.rect.move(move)
if pygame.K_UP in pressed:
move = (0, -10)
player.rect = player.rect.move(move)
if pygame.K_DOWN in pressed:
move = (0, 10)
这是我的第一个 pygame 代码不多,很简单。当我想移动我的播放器时,它可以工作,但我希望移动平稳。就像当我向左按时,我希望它向左移动。目前,每次我都必须按下左按钮,以便播放器向左移动。您对如何做到这一点有什么建议吗?
import pygame, sys
pygame.init()
window_size = ( 400, 400 )
white = ( 255, 255, 255 )
class Player():
image = pygame.image.load( 'foo.png')
rect = image.get_rect()
player = Player()
screen = pygame.display.set_mode( window_size )
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
move = (-10, 0 )
player.rect = player.rect.move(move)
if event.key == pygame.K_RIGHT:
move = ( 10, 0 )
player.rect = player.rect.move(move)
if event.key == pygame.K_UP:
move = ( 0,-10 )
player.rect = player.rect.move(move)
if event.key == pygame.K_DOWN:
move = ( 0, 10 )
player.rect = player.rect.move(move)
screen.fill( white )
screen.blit( player.image, player.rect )
pygame.display.flip()
编辑 我对亚伦回答的态度:
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pressed = pygame.key.get_pressed()
if pressed[pygame.K_LEFT]:
move = ( 2, 0 )
player.rect = player.rect.move(move)
if pressed[pygame.K_RIGHT]:
move = ( 2, 0 )
player.rect = player.rect.move(move)
if pressed[pygame.K_UP]:
move = ( 0,-2 )
player.rect = player.rect.move(move)
if pressed[pygame.K_DOWN]:
move = ( 0, 2 )
player.rect = player.rect.move(move)
您可以同时跟踪 KEYUP
和 KEYDOWN
事件,然后为您跟踪的每个按键存储按下状态。
现在,不是在用户按下某个键时移动播放器,而是测试键的状态以查看它是否被按下,如果是则向播放器应用移动。
举个简单的例子:
pressed_keys = {
'left': false,
...define other keys...
}
while not done:
# Check for key events
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
pressed_keys['left'] = True
...check other keys...
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
pressed_keys['left'] = False
...check other keys...
# Move the player
if pressed_keys['left']:
...move player left...
正在查看 Sloth's answer 的类似问题。看来您有两种可能的方法,使用 set_repeat 或 get_pressed.
set_repeat
When the keyboard repeat is enabled, keys that are held down will generate multiple pygame.KEYDOWN events. The delay is the number of milliseconds before the first repeated pygame.KEYDOWN will be sent. After that another pygame.KEYDOWN will be sent every interval milliseconds. If no arguments are passed the key repeat is disabled. Source
像这样的东西就可以完成工作:
# set_repeat(delay, interval)
pygame.key.set_repeat(1, 10)
# A delay of 0 disables the repeat.
# The lower the interval, the faster the movement would be.
get_pressed
Returns a sequence of boolean values representing the state of every key on the keyboard. Use the key constant values to index the array. A True value means the that button is pressed. Getting the list of pushed buttons with this function is not the proper way to handle text entry from the user. You have no way to know the order of keys pressed, and rapidly pushed keys can be completely unnoticed between two calls to pygame.key.get_pressed(). There is also no way to translate these pushed keys into a fully translated character value. See the pygame.KEYDOWN events on the event queue for this functionality. Source
像这样的东西应该很适合你的代码:
pressed = pygame.key.get_pressed()
if pygame.K_LEFT in pressed:
# move left
if pygame.K_RIGHT in pressed:
# move right
在@ZedsWhatSheSaid 的代码中实施的解决方案,还添加了 PEP-8 格式:
import pygame
import sys
pygame.init()
window_size = (400, 400)
white = (255, 255, 255)
class Player():
image = pygame.image.load('foo.png')
rect = image.get_rect()
player = Player()
screen = pygame.display.set_mode(window_size)
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pressed = pygame.key.get_pressed()
if pygame.K_LEFT in pressed:
move = (-10, 0)
player.rect = player.rect.move(move)
if pygame.K_RIGHT in pressed:
move = (10, 0)
player.rect = player.rect.move(move)
if pygame.K_UP in pressed:
move = (0, -10)
player.rect = player.rect.move(move)
if pygame.K_DOWN in pressed:
move = (0, 10)