Python Pygame 输入控制

2 投票
2 回答
595 浏览
提问于 2025-04-18 02:18

我想知道有哪些方法可以获取用户的输入,并移动玩家的图像。我现在可以在每次按下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()

撰写回答