Как изменить размер нескольких изображений в списке? - PullRequest
0 голосов
/ 23 апреля 2019

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

walkLeft = [pygame.image.load('Moving1.png'), pygame.image.load('Moving2.png'), pygame.image.load('Moving3.png'), pygame.image.load('Moving4.png'), pygame.image.load('Moving5.png'), pygame.image.load('Moving6.png'), pygame.image.load('Moving7.png'), pygame.image.load('Moving8.png'), pygame.image.load('Moving9.png')]
walkRight = []
for i in walkLeft:
    walkRight.append(pygame.transform.flip(i, True, False))

for x in walkLeft:
    pygame.transform.smoothscale(x,(372, 493))

Я ожидал, что размер изображения изменится, но вместо этого он остался прежним, и я не был уверен, что делать.

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Я не уверен насчет самой pygame, так как никогда не использовал ее, но думаю, что проблема в том, что pygame.transform.smoothscale() не преобразующий - он не меняет x вы кормите его, а скорее выводите измененную версию без изменения оригинала. Подобное поведение вы можете увидеть в pygame.transform.flip(i, True, False)) - на каждой итерации создается модифицированная копия i, к которой вы добавляете walkRight, но она не меняет i, с которого вы начали.

Вероятно, вы захотите сделать это путем итерации по индексу вместо по элементу и замене элементов на ходу:

for i in range(len(walkLeft)):
    walkLeft[i] = pygame.transform.smoothscale(x, (372, 493))

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

walkLeft = [pygame.image.load('Moving1.png'), ...]
walkRight = [pygame.transform.flip(x, True, False) for x in walkLeft]
walkLeft = [pygame.transform.smoothscale(x, (372, 493)) for x in walkLeft]
1 голос
/ 23 апреля 2019

pygame.transform.smoothscale() не может обработать списки.
Метод масштабирует изображение, которое передается параметром, и возвращает новое масштабированное изображение по возвращаемому значению.Возвращаемое значение должно быть переназначено списку.

Вы должны сделать это в цикле:

Либо:

for i in range(len(walkLeft)):
    walkLeft[i] = pygame.transform.smoothscale(walkLeft[i], (372, 493))

или в одной строке:

walkLeft = [pygame.transform.smoothscale(x, (372, 493)) for x in walkLeft]
0 голосов
/ 23 апреля 2019

pygame.transform.smoothscale возвращает новый объект, поэтому вам нужно вернуть его к значению:

for x in range(len(walkLeft)):
    walkLeft[x] = pygame.transform.smoothscale(x,(372, 493))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...