繁体   English   中英

我不断收到“TypeError: 'pygame.Surface' object is not subscriptable”,有人可以帮我吗?

[英]I keep getting the "TypeError: 'pygame.Surface' object is not subscriptable", can someone help me?

我在解决“TypeError: 'pygame.Surface' object is not subscriptable”问题时遇到了麻烦,有问题的行是敌人 function 下的 78

SCREEN.blit(enemy_pic[i], (x, y))

如果有人有多余的时间,有没有人知道如何让每个敌人都有能力向玩家发射子弹并让每个敌人都可以碰撞?

import pygame, sys, random, time
from button import Button

pygame.init()

#Mechanic variables
clock = pygame.time.Clock()
SCREEN_width = 1280
SCREEN_height = 720
SCREEN = pygame.display.set_mode((SCREEN_width, SCREEN_height))
FPS = 500
i = 0

#Coordinats
player_x = 500
player_y = 500

enemy_x = 0
enemy_y = 0

#Change in coordinats
player_x_change = 0
player_y_change = 0

enemy_x_change = 0
enemy_y_change = 0

#Pictures
BG_placeholder = pygame.image.load("assets/PlaceholderBG.png")
BGmenu = pygame.image.load("assets/Background.png")
player_pic = pygame.image.load("assets/Tunak_tunka_tun_player_standing_still.png")
enemy_pic = pygame.image.load("assets/PlaceholderBG.png")
levelMap = pygame.image.load("assets/Level.png")


#Transforming or scaling the pictures/images
BG_placeholder = pygame.transform.scale(BG_placeholder, (50, 50))
BGmenu = pygame.transform.scale(BGmenu, (SCREEN_width, SCREEN_height))
player_pic = pygame.transform.scale(player_pic, (50, 50))
enemy_pic = pygame.transform.scale(enemy_pic, (50, 50))
levelMap = pygame.transform.scale(levelMap, (SCREEN_width, SCREEN_height))

#Icon & Caption
icon = pygame.display.set_icon(BG_placeholder)
pygame.display.set_caption("Den Indiske Joede Kirke")

#Colors
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
yellow = (255, 255, 0)

#enemy
enemyImg = []
enemy_x = []
enemy_y = []
num_of_enemies = 6
for i in range(num_of_enemies):
      enemyImg.append(pygame.image.load("assets/PlaceholderBG.png"))
      enemy_x.append(random.randint(0, SCREEN_width))
      enemy_y.append(random.randint(0, SCREEN_height))
      enemyImg[i] = pygame.transform.scale(enemyImg[i], (50, 50))

#Functions
def player(x, y):
    SCREEN.blit(player_pic, (x, y))

def get_font(size):
    return pygame.font.Font("assets/font.ttf", size)

def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()

def enemy(x, y, i):
    SCREEN.blit(enemy_pic[i], (x, y))

def quitgame():
    pygame.quit()
    quit()

def message_display(text):
    largeText = pygame.font.Font('freesansbold.ttf', 115)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((SCREEN_width/2), (SCREEN_height/2))
    SCREEN.blit(TextSurf, TextRect)
    pygame.display.update()
    time.sleep(2)
    game_loop()

def game_menu():
        while True:
            SCREEN.blit(BGmenu, (0, 0))

            MENU_MOUSE_POS = pygame.mouse.get_pos()

            MENU_TEXT = get_font(90).render("Menu", True, "#47df0a")
            MENU_RECT = MENU_TEXT.get_rect(center=(640, 100))

            PLAY_BUTTON = Button(image=pygame.image.load("assets/Play Rect.png"), pos=(640, 300),
                                 text_input="PLAY", font=get_font(75), base_color="#9ce597", hovering_color="White")
            QUIT_BUTTON = Button(image=pygame.image.load("assets/Quit Rect.png"), pos=(640, 500),
                                 text_input="QUIT", font=get_font(75), base_color="#9ce597", hovering_color="White")

            SCREEN.blit(MENU_TEXT, MENU_RECT)

            for button in [PLAY_BUTTON, QUIT_BUTTON]:
                button.changeColor(MENU_MOUSE_POS)
                button.update(SCREEN)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if PLAY_BUTTON.checkForInput(MENU_MOUSE_POS):
                        game_loop()
                    if QUIT_BUTTON.checkForInput(MENU_MOUSE_POS):
                        pygame.quit()
                        sys.exit()

            pygame.display.update()

def game_loop():
    global player_x, player_y, enemy_x, enemy_y, player_x_change, player_y_change, enemy_x_change, enemy_y_change
    game = True
    while game:
        SCREEN.fill(white)
        SCREEN.blit(levelMap, (0, 0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    player_x_change = -5
                if event.key == pygame.K_RIGHT:
                    player_x_change = 5
                if event.key == pygame.K_UP:
                    player_y_change = -5
                if event.key == pygame.K_DOWN:
                    player_y_change = 5
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    player_x_change = 0
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    player_y_change = 0
        player_x += player_x_change
        player_y += player_y_change

        if player_x <= 0:
            player_x = 0
        elif player_x >= 1230:
            player_x = 1230
        if player_y <= 0:
            player_y = 0
        elif player_y >= 670:
            player_y = 670

        player(player_x, player_y)
        for i in range(num_of_enemies):
            enemy(enemy_x[i], enemy_y[i], i)

        pygame.display.update()
        clock.tick(FPS)

game_menu()
pygame.quit()
quit()


这意味着Surface class 没有声明__getitem__()方法并且不能使用像enemy_pic[1]这样的索引语法来调用。

因此,您可能应该只将Surface的一个实例传递给SCREEN.blit() ,例如SCREEN.blit(enemy_pic, (x, y))以将一个表面放在另一个表面上。

您需要的只是绘制相同的表面,例如。 enemy_pic位于敌人的 position。 这样你就可以存储 position 个不同的敌人。

enemies = []

for i in range(10):
    enemies.append([random.randint(0, SCREEN_width), random.randint(0, SCREEN_height)])

# then at your game loop

for enemy_pos in enemies:
    SCREEN.blit(enemy_pic, enemy_pos)

碰撞更难实现,也更复杂。 希望有一个名为pymunk的碰撞库,它使用起来相当简单。

问题是enemy_pic是一个 pygame 表面,通过以下方式初始化:

enemy_pic = pygame.image.load("assets/PlaceholderBG.png")

然后它被调整大小,但仍然是一个表面。 然后您的代码期望它是一系列图像。

您创建了一个图像列表enemyImg ,这是您想要引用的而不是enemy_pic

所以你可以改变enemy()

def enemy(x, y, i):
    SCREEN.blit(enemyImg[i], (x, y))

但是看看你如何称呼enemy()

for i in range(num_of_enemies):
    enemy(enemy_x[i], enemy_y[i], i)

enemy()更改为:

def enemy(i):
    SCREEN.blit(enemyImg[i], (enemy_x[i], enemy_y[i]))

从长远来看,使用此代码将变得越来越困难,因此我建议您学习并实现sprites

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM