Блок перемещается только один раз на KEYDOWN (Python3.6 - Pygame)

1

Меня зовут Джереми, и я изучаю 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()
Теги:
pygame

1 ответ

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)
  • 0
    Спасибо за помощь. Таким образом, x + = x_change и пять строк под ним должны быть полностью выделены, чтобы они соответствовали, а не разбились:? Я попытался сделать это, и когда я запустил его, окно было черным, и не появился ни белый фон, ни блок.
  • 0
    Нет, они должны быть в цикле while вместо цикла событий. Просто скопируйте и вставьте код в мой ответ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню