在Pygame中优化键盘输入

时间:2016-08-08 16:22:22

标签: python-2.7 pygame

我正在使用pygame库创建一个非常简单的游戏,其中玩家使用箭头键在屏幕周围移动方块。不幸的是,控制的反应被证明是一个问题。

控制工作正常,直到您切换方向,例如左到右。当玩家切换方向时,玩家正在控制罐子的方块停止。

控件的代码在我的游戏中如下所示:

def move(self, event):
    speed = 6
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            self.rect.x -= speed
        if event.key == pygame.K_RIGHT:
            self.rect.x += speed
        if event.key == pygame.K_DOWN:
            self.rect.y += speed
        if event.key == pygame.K_UP:
            self.rect.y -= speed

这个方法位于一个名为Block的类中(我从pygame文档中窃取了Block),它只是为玩家提供一个sprite并提供移动。

函数move()实际上是在main.py文件中调用的,如下所示:

while going:
    clock.tick(60)

    # event handling
    for event in pygame.event.get():
        if event.type == QUIT:
            going = False

    # controller input
    player.move(event)

其中,玩家是Block类的一个实例,而event只是我游戏的事件队列中的一个项目。

我尝试使用pygame.key.get_pressed函数(它确实更好用)但我宁愿使用pygame.KEYDOWN本地人,因为它将按键作为事件队列中的事件而不是从列表返回的布尔值返回。

如果你比一般乔更有调查性,你可以在这里查看“完整”游戏:https://github.com/catmes/Project_React

你需要pygame 1.9.2和python 2.7。请记住,游戏本身更像是一种学习练习,所以当你看到错误的代码时会感到惊讶(当然会在稍后修复)。)。

感谢您停下来并提出这个问题,我很感激您的时间。

1 个答案:

答案 0 :(得分:0)

我已经尝试过一种顺畅的方式来移动一个效果非常好的玩家。它基本上跟踪列表中的按键,并根据按下的最后一个键移动播放器。当您按某个键时,它会在列表的第一个位置添加 speed 变量,当您释放该键时,它会删除该变量。在 update 方法中,您可以将列表的第一个速度变量添加到相应的x和y值。

import pygame
pygame.init()

screen = pygame.display.set_mode((720, 480))

class Player(pygame.sprite.Sprite):

    def __init__(self):
        super(Player, self).__init__()
        self.rect = pygame.Rect((0, 0), (32, 32))
        self.image = pygame.Surface((32, 32))
        self.image.fill((255, 255, 255))
        self.velocity = [0, 0]  # It's current velocity.
        self.speed = 4  # The speed the player will move.
        self.dx = []  # Keeps track of the horizontal movement.
        self.dy = []  # Keeps track of the vertical movement.

    def update(self):
        try:
            self.rect.x += self.dx[0]  # Index error if the list is empty.
        except IndexError:
            self.rect.x += 0
        try:
            self.rect.y += self.dy[0]  # Index error if the list is empty.
        except IndexError:
            self.rect.y += 0

player = Player()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            raise SystemExit
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                player.dx.insert(0, -player.speed)
            elif event.key == pygame.K_d:
                player.dx.insert(0, player.speed)
            elif event.key == pygame.K_w:
                player.dy.insert(0, -player.speed)
            elif event.key == pygame.K_s:
                player.dy.insert(0, player.speed)
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_a:
                player.dx.remove(-player.speed)
            elif event.key == pygame.K_d:
                player.dx.remove(player.speed)
            elif event.key == pygame.K_w:
                player.dy.remove(-player.speed)
            elif event.key == pygame.K_s:
                player.dy.remove(player.speed)

    player.update()
    screen.fill((0, 0, 0))
    screen.blit(player.image, player.rect)
    pygame.display.update()

    # print player.dx, player.dy  # Uncomment to see what's happening in action!