Заставить моего персонажа плавно двигаться в Pygame - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь создать pygame для моего com-финала, но мой учитель не очень хорошо объяснил, как работает pygame.Моя проблема в том, что мне нужно, чтобы мой персонаж, созданный мной собственный спрайт, двигался плавно, когда удерживается любая из 4 клавиш со стрелками.До сих пор все, что я мог сделать, это заставить его двигаться при каждом отдельном нажатии клавиши, и я понятия не имею, как это исправить.

Я не уверен, является ли мой код наиболее эффективным, но, в сущности, в зависимости от того, какую клавишу вы нажимаете, меняются не только координаты X и Y, но и изображение png, направленное в правильном направлении.Это все ничья с использованием блиц.

import pygame

pygame.init()

def redraw_game_window(texture):
    screen = pygame.display.set_mode(size)
    background_image = pygame.image.load("lava.jpg").convert()
    background_image = pygame.transform.scale(background_image, (size))
    screen.blit(background_image, [0, 0])
    texture= pygame.transform.scale(texture, (65,64))
    texture=texture.convert_alpha()
    screen.blit(texture,(EarlX,EarlY))

size=1200,600
EarlWidth=65
EarlLength=64
texture = pygame.image.load("UpFacingEarl.png")
EarlX=500
EarlY=150
speed=50

inPlay= True
while inPlay:
    redraw_game_window(texture)
    pygame.time.delay(20)

    keys = pygame.key.get_pressed()
    if keys[pygame.K_ESCAPE]:
        inPlay = False
    if keys[pygame.K_LEFT]:
        texture = pygame.image.load("LeftFacingEarl.png")
        EarlX-=speed
    if keys[pygame.K_RIGHT]:
       texture = pygame.image.load("RightFacingEarl.png")
       EarlX+=speed
    if keys[pygame.K_UP]:
        texture = pygame.image.load("UpFacingEarl.png")
        EarlY-=speed
    if keys[pygame.K_DOWN]:
       texture = pygame.image.load("DownFacingEarl.png")
       EarlY+=speed

    pygame.display.flip()

Буду очень признателен за любую помощь в улучшении моего кода, я знаю, что я не включаю png, но там я мало что могу сделать.

1 Ответ

3 голосов
/ 25 мая 2019

Во-первых, вам не нужно дублировать код.Теперь, когда мы это выяснили,

screen = pygame.display.set_mode(size)

должен вызываться только в начале программы.Не каждый раз!По этой причине ваша программа не работает.Вот другие менее важные вещи, которые нужно исправить:

это также следует вызывать только в начале:

background_image = pygame.image.load("lava.jpg").convert()
background_image = pygame.transform.scale(background_image, (size))

В общем, функция redraw_game_window должна выглядеть следующим образом:

def redraw_game_window(texture, EarlX, EarlY, screen): #you should pass all the variables you are using to the function. Python doesn't work well with global variables. if you really want to use global variables like you did here, use the global keyword
    screen.fill((0,0,0)) #clear the screen

    screen.blit(background_image, [0, 0]) #draw new background

    texture = pygame.transform.scale(texture, (65,64))
    texture = texture.convert_alpha()
    screen.blit(texture,(EarlX,EarlY)) #draw earl

Этот цикл событий в порядке:

for event in pygame.event.get():
    if event.type == pygame.QUIT: #you need this or else pressing the red "x" on the window won't close it
        quit()

keys = pygame.key.get_pressed()

if keys[pygame.K_ESCAPE]: #press esc to exit program
    quit()

if keys[pygame.K_UP]:
    EarlY -= 1

if keys[pygame.K_DOWN]:
    EarlY -= -1

if keys[pygame.K_LEFT]:
    EarlX += -1

if keys[pygame.K_RIGHT]:
    EarlX += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...