块只能在KEYDOWN上移动一次(Python3.6-Pygame)

时间:2018-06-19 17:29:29

标签: python pygame

我叫Jeremy,我正在学习Python。我是初学者,几天前才刚开始。 我正在用Python开发一个简单的游戏,我希望在按住相应箭头键的同时,我的方块/播放器能够连续移动。到目前为止,按下箭头键时它仅移动一次。任何帮助是极大的赞赏。谢谢!

这是我编写的代码:

import pygame
import time
import random

pygame.init()

display_width = 800
display_height = 600

black = (0,0,0)
white = (255,255,255)

red = (200,0,0)
green = (0,200,0)

bright_red = (255,0,0)
bright_green = (0,255,0)


gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('Game')
clock = pygame.time.Clock()


blockImg = pygame.image.load('blockpic.png')

def block(x,y):
    gameDisplay.blit(blockImg, (x,y))

x = (display_width * 0.45)
y = (display_height * 0.8)

x_change = 0
y_change = 0
crashed = False

while not crashed:

             for event in pygame.event.get():
                 if event.type == pygame.QUIT:
                     crashed = True

                 if event.type == pygame.KEYDOWN:
                        if event.key == pygame.K_LEFT:
                            x_change = -10
                        if event.key == pygame.K_RIGHT:
                            x_change = 10
                        if event.key == pygame.K_UP:
                            y_change = -10
                        if event.key == pygame.K_DOWN:
                            y_change = 10

                 if event.type == pygame.KEYUP:
                        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                            x_change = 0 
                        if event.key == pygame.K_DOWN or event.key == pygame.K_UP:
                            y_change = 0




                 x += x_change       
                 y += y_change
                 gameDisplay.fill(white)
                 block(x,y)
                 pygame.display.update()
                 clock.tick(60)

pygame.quit()
quit()

1 个答案:

答案 0 :(得分:0)

您的代码未正确缩进。 x += x_change行和下面的五行在事件循环内,因此它们在事件队列中每个事件执行一次。只需确定这些行以修复程序即可。

while not crashed:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x_change = -10
            if event.key == pygame.K_RIGHT:
                x_change = 10
            if event.key == pygame.K_UP:
                y_change = -10
            if event.key == pygame.K_DOWN:
                y_change = 10

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                x_change = 0
            if event.key == pygame.K_DOWN or event.key == pygame.K_UP:
                y_change = 0

    # The following lines should be executed once per frame not
    # once per event in the event queue.
    x += x_change
    y += y_change
    gameDisplay.fill(white)
    block(x,y)
    pygame.display.update()
    clock.tick(60)