Проблема с переворачиванием изображений в Pygame (python)

Я пытаюсь создать игру, в которой вы можете перемещать персонажа с помощью клавиш со стрелками. При движении влево или вправо я хочу, чтобы персонаж (изображение) переворачивался и указывал влево / вправо соответственно. Исходное изображение / персонаж указывает влево. Но я не могу заставить персонажа перевернуться, пожалуйста, помогите мне, спасибо.

import pygame
pygame.init()#initiate pygame
black = (0,0,0)
white = (255,255,255)
red = (255,0,0)
display_width = 1200
display_height = 800
display = pygame.display.set_mode((display_width,display_height))
characterimg = pygame.image.load(r'/Users/ye57324/Desktop/Make/coding/python/characterimg.png')
def soldier(x,y):
    display.blit(characterimg, (x,y))
x = (display_width * 0.45)
y = (display_height * 0.1)
pygame.display.set_caption('Game')
clock = pygame.time.Clock()#game clock
flip_right = False
x_change = 0
y_change = 0
start = True


while start:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            start = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x_change += -5
                if flip_right == True:
                    pygame.transform.flip(characterimg, True, False)
                    flip_right = False
            elif event.key == pygame.K_RIGHT:
                x_change += 5
                if flip_right == False:
                    pygame.transform.flip(characterimg, True, False)
                    flip_right = True
            elif event.key == pygame.K_UP:
                y_change += -5
            elif event.key == pygame.K_DOWN:
                y_change += 5
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                x_change += 5
            elif event.key == pygame.K_RIGHT:
                x_change += -5
            elif event.key == pygame.K_UP:
                y_change += 5
            elif event.key == pygame.K_DOWN:
                y_change += -5

    x += x_change
    y += y_change
    display.fill(white)
    soldier(x,y)
    pygame.display.update()
    clock.tick(60)#fps

person Jim    schedule 07.10.2018    source источник
comment
Вы никогда не меняете значение flip_right. Я предполагаю, что вы хотели отрегулировать его значение после того, как перевернете изображение, чтобы отразить направление, в котором в данный момент смотрит ваш персонаж.   -  person Nearoo    schedule 07.10.2018
comment
Ах да, но после того, как я его добавил, он все еще не работает   -  person Jim    schedule 07.10.2018
comment
Я просто просмотрел документацию flip, как и вы. В нем говорится, что «Перевернуть поверхность» неразрушающим образом, и возвращается новая поверхность с теми же размерами. Это означает, что поверхность, по которой вы проходите, не изменяется, то есть вы должны написать characterimg = pygame.transform.flip(characterimg...). Научитесь читать документацию! :)   -  person Nearoo    schedule 07.10.2018
comment
Прочтите сами: pygame.org/docs/ref/transform .html # pygame.transform.flip   -  person Nearoo    schedule 07.10.2018
comment
Это означает, что метод flip не изменяет никаких данных, содержащихся в проходящей вами поверхности, то есть characterimg. Он только считывает данные, а затем записывает перевернутое изображение на новую поверхность, которую затем возвращает. (PS: я хотел сказать, что поверхность, по которой вы проезжаете, не изменилась). Вот почему вам нужно перезаписать вашу characterimg переменную. Чтобы он содержал новую, перевернутую версию вашей поверхности.   -  person Nearoo    schedule 07.10.2018
comment
Нет, я переназначаю characterimg. Ваш characterimg - это поверхность, которую вы копируете в своем soldier методе, верно? Таким образом, любая поверхность, на которую в настоящее время указывает characterimg, отображается на экране. Поэтому нам нужно сделать так, чтобы characterimg указывал на новую перевернутую версию, возвращаемую pygame.transform.flip (...).   -  person Nearoo    schedule 07.10.2018
comment
@Nearoo Большое спасибо! Я решил это!   -  person Jim    schedule 07.10.2018
comment
@Nearoo, вы должны опубликовать это в качестве ответа.   -  person skrx    schedule 07.10.2018
comment
Я бы также удалил переменную flip_right и заранее создал левое и правое изображения. Затем вы можете просто назначить текущее изображение переменной characterimg, когда пользователь нажимает влево или вправо, например. characterimg = characterimg_left и characterimg = characterimg_right.   -  person skrx    schedule 07.10.2018
comment
@skrx хороший момент. Я добавил это к ответу.   -  person Nearoo    schedule 08.10.2018


Ответы (1)


Страница документации Pygame о pygame.transform.flip состояниях

Переворачивание поверхности является неразрушающим действием и возвращает новую поверхность с теми же размерами.

Это означает, что поверхность, которую вы передаете этому методу, остается неизменной. Вы должны сохранить значение return, чтобы увидеть какой-либо эффект.

На практике это означает, что вам следует заменить

pygame.transform.flip(characterimg, True, False)

с участием

characterimg = pygame.transform.flip(characterimg, True, False)

Таким образом, characterimg указывает на новую перевернутую версию изображения.

Примечание. С точки зрения производительности это не очень хороший метод работы. Каждый раз, когда вы вызываете pygame.transform.flip, pygame должен выделять новую память для новой поверхности, перебирать каждый пиксель исходной поверхности и копировать его на новую поверхность, изменяя свое положение в процессе. Вам лучше перевернуть изображение один раз в начале вашей программы, чтобы у вас были переменные characterimg_left и characterimg_right, а затем просто назначить их вашей переменной characterimg.

person Nearoo    schedule 08.10.2018