我一直得到"TypeError: 'pygame.Surface' object is not subscriptable",有人可以帮助我吗?



我在如何修复";TypeError:"pygame.Surface"对象不可下标"问题,在敌人的功能下,问题是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类没有声明__getitem__()方法,并且不能使用类似enemy_pic[1]的索引语法进行调用。

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

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

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]))

从长远来看,使用这些代码将变得越来越困难,所以我建议学习并实现精灵。

相关内容

最新更新