объект Pygame не может быть подписан - PullRequest
0 голосов
/ 14 января 2019
Traceback (most recent call last):
  File "C:\Users\Austin\PycharmProjects\Project\pygame\pygame1.py", line 
84, in <module>
    redrawGameWindow()
  File "C:\Users\Austin\PycharmProjects\Project\pygame\pygame1.py", line 
34, in redrawGameWindow
    win.blit(walkLeft[walkCount//3], (x, y))
TypeError: 'pygame.Surface' object is not subscriptable

Ошибка возникает при перемещении изображения, которое я использую в качестве аватара, влево и вправо. Не могу понять, что изменить. Я просматриваю это видео на YouTube, чтобы заглянуть в pygame: https://www.youtube.com/watch?v=UdsNBIzsmlI

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

import pygame

pygame.init()

win = pygame.display.set_mode((500, 500))

pygame.display.set_caption("First Game")

walkLeft = pygame.image.load('adnan_leftWalk.png')
walkRight = pygame.image.load('adnan_rightWalk.png')
bg = pygame.image.load('Game1.jpg')
char = pygame.image.load('adnanJump.png')

clock = pygame.time.Clock()


x = 50
y = 425
width = 64
height = 64
vel = 5
left = False
right = False
walkCount = 0
isJump = False
jumpCount = 10

def redrawGameWindow():
    global walkCount
    win.blit(bg, (0,0))
    if walkCount + 1 >= 27:
        walkCount = 0
    if left:
        win.blit(walkLeft[walkCount//3], (x, y))
        walkCount += 1
    elif right:
        win.blit(walkRight[walkCount//3], (x, y))
        walkCount += 1
    else:
        win.blit(char, (x,y))

    pygame.display.update()


run = True
while run:
    clock.tick(27)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT] and x > vel:
        x -= vel
        left = True
        right = False
    elif keys[pygame.K_RIGHT] and x < 460:
        x += vel
        right = True
        left = False
    else:
        right = False
        left = False
        walkCount = 0
    if not (isJump):
        if keys[pygame.K_SPACE]:
            isJump = True
            right = False
            left = False
            walkCount = 0
    else:
        if jumpCount >= -10:
            neg = 1
            if jumpCount < 0:
                neg = -1
            y -= (jumpCount ** 2) * 0.5 * neg
            jumpCount -= 1

        else:
            isJump = False
            jumpCount = 10

    redrawGameWindow()


pygame.quit()

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

1 Ответ

0 голосов
/ 14 января 2019

Этот код читается как walkLeft должен быть список изображений для анимации ходьбы. Однако в коде вопроса walkLeft представляет собой одно изображение:

walkLeft = pygame.image.load('adnan_leftWalk.png')

Так что, кажется, немного запутался.

Сообщение об ошибке, которое генерирует код - object is not subscriptable, означает, что код пытался использовать нотацию массива (технически он пытался использовать свойство __getitem__()), но рассматриваемый объект не является массивом / списком.

Строка с ошибкой:

 win.blit(walkLeft[walkCount//3], (x, y))  # ERROR HERE

Заставляет меня думать, что walkLeft должен быть списком изображений, так как он использует обозначение массива / списка в переменной, а walkCount ограничен максимумом 27., Но целочисленное деление на 3, тоже не имеет смысла (может там было 3 изображения анимации?). Простое удаление массива-нотации может пролить свет на проблему:

 win.blit(walkLeft, (x, y))  # Fixes the bug, somewhat

... и позволить коду функционировать, рисуя одно и то же растровое изображение, но в разных местах. Но совершенно очевидно, что чего-то не хватает. Может ли код сочетать два (или более) примера?

...