Как переместить изображение в Python, используя Pygame? - PullRequest
0 голосов
/ 02 февраля 2019

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

Я использую Python (3.7.0) на Windows 10. Ниже приведен код:

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

pygame.display.init()
keys = [False, False, False, False]
screen=pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
background=pygame.Surface(screen.get_size())
background.fill((255,255,255))
playerpos=[100,100]
player=pygame.image.load("Copper.png")

while 1:
    pygame.display.init()
    screen.fill(0)
    screen.blit(background,(0,0))
    screen.blit(player,playerpos)
    for event in pygame.event.get():
        pygame.display.init()
        pygame.display.flip()
        if event.type == pygame.KEYDOWN:
            if event.key==pygame.K_RETURN:
                    pygame.display.quit()
        pygame.display.flip()
        # 8 - loop through events
        for event in pygame.event.get():
            # 9 - check if event is X button 
            if event.type==pygame.QUIT:
                # 10 - quit the game
                pygame.quit() 
                exit(0)
            if event.type == pygame.KEYDOWN:
                if event.key==K_w:
                    keys[0]=True
                elif event.key==K_a:
                    keys[1]=True
                elif event.key==K_s:
                    keys[2]=True
                elif event.key==K_d:
                    keys[3]=True
            if event.type == pygame.KEYUP:
                if event.key==pygame.K_w:
                    keys[0]=False
                elif event.key==pygame.K_a:
                    keys[1]=False
                elif event.key==pygame.K_s:
                    keys[2]=False
                elif event.key==pygame.K_d:
                    keys[3]=False
            # 9 - Move player
            if keys[0]:
                playerpos[1]-=500
            elif keys[2]:
                playerpos[1]+=500
            if keys[1]:
                playerpos[0]-=500
            elif keys[3]:
                playerpos[0]+=500

Я ожидаю, что изображение "Copper.png" будет двигаться, когдаЯ нажимаю w, a, s, d, но изображение не двигается.Изображение обновляется каждый раз, когда я нажимаю w, a, s, d, но не двигается.

1 Ответ

0 голосов
/ 02 февраля 2019

Избавьтесь от множества четных петель обработки.Используйте один цикл для обработки всех событий.
Далее достаточно один раз инициировать отображение (pygame.display.init())

Создать переменную speed, которая определяет числопикселей, положение изображения меняется с каждым шагом

Сначала оцените событие pygame.QUIT и прекратите запуск основного цикла, когда событие произойдет:

done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

Затем обработайте другие событиякак pygame.KEYDOWN и pygame.KEYUP.

Для непрерывного движения манипулирование позицией игрока должно выполняться вне цикла событий.Если бы он был в цикле, положение игрока изменилось бы только в случае события.Примечание: используйте небольшую «скорость» (speed = 1), в противном случае игрок быстро переместился бы из окна.

for event in pygame.event.get():
    # event handling

if keys[0]:
    playerpos[1]-=speed
elif keys[2]:
    playerpos[1]+=speed
if keys[1]:
    playerpos[0]-=speed
elif keys[3]:
    playerpos[0]+=speed

Выполните отрисовку сцены в конце основного цикла:

speed = 1
done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.KEYDOWN:
            if event.key==pygame.K_RETURN:
                done = True
            for i in range(4):
                if event.key == (K_w, K_a, K_s, K_d)[i]:
                    keys[i]=True
        elif event.type == pygame.KEYUP:
            for i in range(4):
                if event.key == (K_w, K_a, K_s, K_d)[i]:
                    keys[i]=False
    if keys[0]:
        playerpos[1]-=speed
    elif keys[2]:
        playerpos[1]+=speed
    if keys[1]:
        playerpos[0]-=speed
    elif keys[3]:
        playerpos[0]+=speed

    screen.fill(0)
    screen.blit(background,(0,0))
    screen.blit(player,playerpos)    
    pygame.display.flip()

Обратите внимание, в качестве альтернативы вы можете использовать pygame.key.get_pressed(), чтобы получить все состояния всех кнопок клавиатуры одновременно.Таким образом, вам не нужно оценивать ключевые события отдельно:

speed = 1
done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN:
                done = True

    allKeys = pygame.key.get_pressed()
    playerpos[0] += -speed if allKeys[K_a] else speed if allKeys[K_d] else 0
    playerpos[1] += -speed if allKeys[K_w] else speed if allKeys[K_s] else 0

    screen.fill(0)
    screen.blit(background,(0,0))
    screen.blit(player,playerpos)    
    pygame.display.flip()
...