0

我正在尝试创建一个“播放器”——黑色方块——当你按住 WASD 时它会移动。我试着在这里,在谷歌和 youtube 上查看如何使这项工作,但我尝试过的每个解决方案都有同样的问题:我不必在按住键的同时移动它,而是必须不断地点击键才能使它以小块移动。我不知道我做错了什么。这是代码(使用 python 3.3 - pygame 1.9):

import pygame
from pygame.locals import *
from pygame.time import *
import sys
pygame.init()

velX = 0
velY = 0


running = True
clock = pygame.time.Clock()

def draw():
    global velX
    global velY

    playerx = 20
    playery = 20

    screen = pygame.display.set_mode((700,300))
    pygame.display.set_caption('something')

    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((255,255,255))
    screen.blit(background, (0,0))

    playerx = playerx + velX
    playery = playery + velY
    player_filename = 'player.png'
    player = pygame.image.load(player_filename)
    screen.blit(player, (playerx,playery))

    pygame.display.flip()

def main():
    global velX
    global velY
    global running

    while running:

        keys_down = pygame.key.get_pressed()
        pygame.key.set_repeat(1, 50)
        time = 50/1000

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    running=False

        if keys_down[K_d]:
            velX += 50*time
        if keys_down[K_w]:
            velY -= 50*time
        if keys_down[K_s]:
            velY += 50*time
        if keys_down[K_a]:
            velX -= 50*time

        clock.tick(50)
        draw()

if __name__ == '__main__':
    main()

我已经尝试了 set repeat 命令,但它似乎并没有做任何事情。我还尝试直接从我在 stackoverflow 上找到的一些解决方案中复制,但它们都不起作用。我想代码中还有其他问题。

4

2 回答 2

2

您的代码有两个问题。先回答你的问题。玩家从不移动超过一步的原因是您在每次调用 draw() 时都会重置玩家位置

playerx = 20
playery = 20

相反,您应该将该代码放在draw()函数上方并添加

global playerx
global playery

在顶部draw()。现在,玩家位置不会每帧都重置。

第二个问题是您在每次调用draw()时都会创建一个新屏幕

screen = pygame.display.set_mode((700,300))
pygame.display.set_caption('something')

相反,您应该将它们移动到上面的行,draw()并且每次绘制都使用相同的屏幕。

此外,就像 elyase 指出的那样,您可能想要的是将速度设置为固定值,而不是增加它们。像这样

velX = 0
velY = 0
if keys_down[K_d]:
    velX = 10
if keys_down[K_w]:
    velY = -10
if keys_down[K_s]:
    velY = 10
if keys_down[K_a]:
    velX = -10

通过这种方式,玩家将以恒定的速度沿您操纵的方向移动。

希望能澄清一些事情。:)

于 2013-05-18T16:17:48.640 回答
0

您正在重置 draw() 中的位置。此外,您应该将更改方向的代码放在event.type == pygame.KEYDOWN条件内。像这样的东西:

if event.type == KEYDOWN:
    if event.key == K_d:
        velX += 50*time
     elif event.key == K_w:
        velY -= 50*time
        ...          

 if event.type == KEYUP:
        # set velocity to 0
于 2013-05-18T16:10:23.557 回答