有什么方法可以让我从用户那里得到输入并移动播放器图像?每当我按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()发布于 2014-04-11 07:11:11
我会为我感兴趣的所有密钥创建一个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()发布于 2014-04-11 19:34:06
你必须写:
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():循环之外。
https://stackoverflow.com/questions/23003459
复制相似问题