Python Pygame 输入控制
我想知道有哪些方法可以获取用户的输入,并移动玩家的图像。我现在可以在每次按下W、A、S或D键时移动玩家的图像,但每次只移动1个像素。我该怎么做才能让它在按住某个键的时候持续移动呢?
import pygame
from pygame.locals import *
pygame.init()
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Gaben's Future Adventure")
player = pygame.image.load("images/player.png")
player_rect = player.get_rect()
white = (255, 255, 255)
black = (0, 0, 0)
class World(object):
def __init__(self):
pass
class Controls(object):
def __init__(self):
self.speed = 1
self.keys = [False, False, False, False]
def moveUp(self, player_rect):
player_rect.y -= self.speed
def moveLeft(self, player_rect):
player_rect.x -= self.speed
def moveRight(self, player_rect):
player_rect.x += self.speed
def moveDown(self, player_rect):
player_rect.y += self.speed
def update(self):
pass
def main():
running = True
while running:
screen.fill(white)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
print "Exiting game."
if event.type == pygame.KEYDOWN:
if event.key == K_w:
print "W down"
elif event.key == K_a:
print "A down"
elif event.key == K_s:
Controls().moveDown(player_rect)
print "S down"
elif event.key == K_d:
Controls().moveRight(player_rect)
print "D down"
if event.type == pygame.KEYUP:
if event.key == K_w:
print "W up"
elif event.key == K_a:
print "A up"
elif event.key == K_s:
print "S up"
elif event.key == K_d:
print "D up"
screen.blit(player, player_rect)
pygame.display.flip()
print player_rect.x
print player_rect.y
main()
2 个回答
1
你需要在下面写:
keys = pygame.key.get_pressed()
f keys[pygame.K_w]:
print('K_w pressed')
elif keys[pygame.K_s]:
print('K_s pressed')
elif keys[pygame.K_a]:
print('K_a pressed')
elif keys[pygame.K_d]:
print('K_d pressed')
这个代码要放在 for event in pygame.event.get():
循环的外面。
3
我会创建一个 dict
,里面包含我感兴趣的所有键。对于移动来说,值会简单地是一个 (x, y)
的元组:
move_map = {pygame.K_w: ( 0, -1),
pygame.K_s: ( 0, 1),
pygame.K_a: (-1, 0),
pygame.K_d: ( 1, 0)}
然后,在主循环中,我会计算一个移动向量:
# get all pressed keys
pressed = pygame.key.get_pressed()
# get all movement modifiers from our move_map where the key is pressed.
move = [move_map[key] for key in move_map if pressed[key]]
# add all movement modifiers together in cases multiple keys are pressed.
# map(sum, zip(*...)) is not very efficient, but easy to remember :-)
final = map(sum, zip(*move))
# usually you want to normalize the result first, and multiplicate it
# with the desired velocity of that object.
# if we have a movement vector, just move the player_rect
if final:
player_rect.move_ip(*final)
# also, you probably want to use a Clock object to limit your framerate
完整代码:
import pygame
from pygame.locals import *
pygame.init()
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Gaben's Future Adventure")
player = pygame.image.load("images/player.png")
player_rect = player.get_rect()
white = (255, 255, 255)
black = (0, 0, 0)
class World(object):
def __init__(self):
pass
move_map = {pygame.K_w: ( 0, -1),
pygame.K_s: ( 0, 1),
pygame.K_a: (-1, 0),
pygame.K_d: ( 1, 0)}
def main():
running = True
while running:
screen.fill(white)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
print "Exiting game."
pressed = pygame.key.get_pressed()
move = [move_map[key] for key in move_map if pressed[key]]
final = map(sum, zip(*move))
if final:
player_rect.move_ip(*final)
screen.blit(player, player_rect)
pygame.display.flip()
print player_rect.x
print player_rect.y
main()