Я хочу, чтобы мой плеер двигался, пока нажата кнопка - PullRequest
3 голосов
/ 29 апреля 2020

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

import pygame
import sys
from pygame.locals import *

clock = pygame.time.Clock()

pygame.init()

pygame.display.set_caption("Neverout")
player = pygame.image.load("player.png")

green = (181, 231, 29)

WINDOW_SIZE = (800, 800)

screen = pygame.display.set_mode(WINDOW_SIZE, 0, 32)

player_pos = [385, 50]

up = False #So here I have my movement variables
down = False
right = False
left = False

while True:

    screen.blit(player, player_pos)

    #Here i check if my movement variable are true after I press them

    if left is True:
        player_pos[0] -= 5
    if right is True:
        player_pos[0] += 5
    if up is True:
        player_pos[1] -= 5
    if down is True:
        player_pos[1] += 5

    for event in pygame.event.get():
        #here i check if the button is pressed
        if event.type == KEYDOWN:
            if pygame.K_LEFT:
                left = True
            if pygame.K_RIGHT:
                right = True
            if pygame.K_UP:
                up = True
            if pygame.K_DOWN:
                down = True
        #Here I check if a button is not pressed
        if event.type == KEYUP:
            if pygame.K_LEFT:
                left = False
            if pygame.K_RIGHT:
                right = False
            if pygame.K_UP:
                up = False
            if pygame.K_DOWN:
                down = False
        #Checks for quiting the app
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    #No dates only updates
    pygame.display.update()
    screen.fill(green)
    clock.tick(60)

1 Ответ

2 голосов
/ 29 апреля 2020

Ваш код почти правильный, он просто проверяет события неправильно. Вам нужно проверить, что event.key равно коду ключа вашей проверки.

Существующий код просто говорит что-то вроде:

if pygame.K_LEFT:

Но pygame.K_LEFT это просто число, как говоря if 27: что всегда верно.

Просто добавьте туда event.key, чтобы исправить это:

if event.key == pygame.K_LEFT:

Также не забудьте использовать elif (иначе, если) , так как это более эффективно. Если ключевое событие, скажем, ВЛЕВО, оно не может тоже быть ПРАВЫМ, поэтому нет необходимости проверять другие коды. Вы можете пропустить их проверку с помощью if .. elif.

. Применение этих исправлений к вашему основному l oop заставляет игрока двигаться нормально:

for event in pygame.event.get():
    #here i check if the button is pressed
    if event.type == KEYDOWN:
        if event.key == pygame.K_LEFT:
            left = True
        elif event.key == pygame.K_RIGHT:
            right = True
        elif event.key == pygame.K_UP:
            up = True
        elif event.key == pygame.K_DOWN:
            down = True
    #Here I check if a button is not pressed
    elif event.type == KEYUP:
        if event.key == pygame.K_LEFT:
            left = False
        elif event.key == pygame.K_RIGHT:
            right = False
        elif event.key == pygame.K_UP:
            up = False
        elif event.key == pygame.K_DOWN:
            down = False
    #Checks for quiting the app
    elif event.type == QUIT:
        pygame.quit()
        sys.exit()
...