Ключи событий pygame не отвечают, хотя простоя не показывает ошибку?

import pygame
from pygame import *
pygame.init

pygame.display.init
pygame.display.set_caption("Test")
bg = pygame.image.load("bg.jpg")
human = pygame.image.load("human1.bmp")
display_screen = pygame.display.set_mode((1000,500))
keyboard_input = 0
clock = pygame.time.Clock()
def screen_Quit():
running = False
while not running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = True

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                keyboard_input = (90)
                print("Left arrow key has been pressed.")

            if event.key == pygame.K_RIGHT:
                keyboard_input = (-90)
                print("Right arrow key has been pressed.")
            if event.key == pygame.K_UP:
                keyboard_input = (20)
                print("Up arrow key has been pressed.")
            if event.key == pygame.K_DOWN:
                keyboard_input = (-20)
                print("Down arrow key has been pressed.")

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                keyboard_input = (0)
                print("Left arrow key has been released.")

            if event.key == pygame.K_RIGHT:
                keyboard_input = (0)
                print("Right arrow key has been released.")
            if event.key == pygame.K_UP:
                keyboard_input = (0)
                print("Up arrow key has been released.")
            if event.key == pygame.K_DOWN:
                keyboard_input = (0)
                print("Down arrow key has been released.")


        # this code here has been left for later --> print(event)

display_screen.blit(bg, [0,0])
display_screen.blit(human, [50,87])
pygame.display.update()
clock.tick(60)
screen_Quit()
pygame.quit
quit()

Я не понимаю, в чем проблема, я опубликовал свой полный код, так как проблема может быть в другом. Проблема, с которой я столкнулся с программой, - это клавиши событий в python, которые не реагируют на ввод, который является клавиатурой. Я использую pygame для создания игры, но не могу понять, почему клавиши событий не работают. Я везде проверял и не могу понять. Код мне кажется прекрасным, python idle не дает никаких ошибок. Я даже получаю данные в режиме ожидания, но персонаж не движется, поэтому не должно быть никаких причин для того, чтобы он не двигался.

Вот изображение и ссылка на видео, которое более подробно рассматривает проблему (я создал видео сам):

изображение проблемы

Ссылка на видео: https://www.youtube.com/watch?v=QVFaiuF9KY8&feature=youtu.be

Видео, скорее всего, будет полезнее изображения.


person Inferno    schedule 03.12.2017    source источник
comment
Исправьте отступ в образце кода.   -  person skrx    schedule 04.12.2017
comment
Отступ? В какой строке исправить отступ @skrx   -  person Inferno    schedule 04.12.2017
comment
Все в функции def screen_Quit(): имеют неправильный отступ. Кроме того, ссылка на видео не работает.   -  person skrx    schedule 04.12.2017
comment
Спасибо, что работали над этим в течение 3 дней. Я все еще многому учусь в программировании, и мне нужно привыкнуть к командам pygame. Я понятия не имел, что на самом деле сделал pygame.display.update. Я действительно ценю это. @NateBronman   -  person Inferno    schedule 04.12.2017
comment
Кстати, изображение временное и позже будет заменено спрайтом и правильным фоном @NateBronman   -  person Inferno    schedule 04.12.2017
comment
ОК, я исправлю проблему с видео @skrx   -  person Inferno    schedule 04.12.2017


Ответы (2)


Краткий ответ

В вашем коде нет команд, которые заставляют изображение двигаться. Я исправил это и разместил полный рабочий код внизу. Если вам нужно более подробное объяснение, читайте дальше.

Объяснение

Если это ваш полный код, то проблема в том, что, во-первых, у вас даже нет никакого кода, который говорит персонажу двигаться. И, во-вторых, ваш pygame.display.update() находится за пределами цикла while, поэтому любые изменения, внесенные на экран, не отображаются.

Для каждого события вы только что сказали python напечатать сообщение:

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
         keyboard_input = (90)
         print("Left arrow key has been pressed.")

Что вы хотите сделать, так это добавить туда еще одну строку, чтобы фактически переместить персонажа. Это можно сделать, изменив его положение по осям x и y. Я рекомендую использовать для этого спрайты, но пока вы используете изображение, мы просто будем придерживаться этого.

Чтобы изменить положение изображения, вы должны запустить новый window.blit() с желаемым (x, y). Это означает, что вам придется постоянно повторять это, если вам нужно будет много перемещать его, поэтому лучше поместить его INSIDE в текущий цикл while. Так что перенесите эту часть вашего кода на отступ вперед:

    display_screen.blit(bg, [0,0])
    display_screen.blit(human, [50,87])
    pygame.display.update()
    clock.tick(60)
    screen_Quit()
    pygame.quit
    quit()

Так что теперь экран регулярно обновляется. Второе, что вам нужно сделать, это создать 2 новые переменные x и y и изменить

display_screen.blit(human, [50,87]) to display_screen.blit(human, [x,y])

Это в основном означает, что ваш персонаж теперь отображается на экране в выбранной вами позиции, а не в фиксированной позиции, которая не меняется. Итак, теперь вы можете добавить + к позиции x всякий раз, когда нажимается левая клавиша, или - с позиции x всякий раз, когда нажимается правая клавиша!

Вот полный рабочий код:

import pygame
from pygame import *
pygame.init

pygame.display.init
pygame.display.set_caption("Test")
bg = pygame.image.load("bg.jpg")
human = pygame.image.load("human1.bmp")
display_screen = pygame.display.set_mode((1000,500))
keyboard_input = 0
clock = pygame.time.Clock()
running = False
x=0
y=0
moving = "none"
white = (255,255,255)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                moving = "left"
                print("Left arrow key has been pressed.")
            elif event.key == pygame.K_RIGHT:
                moving = "right"
                print("Right arrow key has been pressed.")
            elif event.key == pygame.K_UP:
                moving = "up"
                print("Up arrow key has been pressed.")
            elif event.key == pygame.K_DOWN:
                moving = "down"
                print("Down arrow key has been pressed.")
        else:
            moving = "hello"

    if moving == "left":
        x -= 5
    if moving == "right":
        x += 5
    if moving == "up":
        y -= 5
    if moving == "down":
        y += 5

            # this code here has been left for later --> print(event)

    display_screen.blit(bg,[0,0])
    display_screen.blit(human, [x,y])
    clock.tick(60)
    pygame.display.update()
person Community    schedule 03.12.2017

Вы никогда не обновляете позицию своего игрока, а просто переносите его на [50,87]. Если вы хотите, чтобы он переместился, вам сначала нужно сохранить позицию, например player_pos = [50, 87] и определите переменные для скорости velocity_x = 0, затем установите скорость в цикле событий, если нажата клавиша:

if event.key == pygame.K_RIGHT:
    velocity_x = 5

и обновим позицию в цикле while:

player_pos[0] += velocity_x
player_pos[1] += velocity_y
person skrx    schedule 03.12.2017