首页 > 解决方案 > 在函数外使用对象

问题描述

如何使用在第一个函数中创建的播放器对象,以便可以在第二个函数中调用 player.movePlayer()?它总是告诉我“名称“玩家”未定义”

def drawLevel(level):
    global gameDrawn
    x = y = 0

    

    walls = []

    ends = []

    players = []
    if gameDrawn == False:
        screen.fill(WOODY)
        drawGrid()
        drawRect()
        for row in levels[level]:
            for col in row:
                if col == "W":
                    wall = Wall((x, y))
                    walls.append(wall)
                if col == "E":
                    end = End((x, y))
                    ends.append(end)
                if col == "P":
                    player = Player((x,y))
                    players.append(player)
                x += 80
            y += 80
            x = 0
        for wall in walls:
            pygame.draw.rect(screen, BLACK, wall.rect)
        for end in ends:
            pygame.draw.rect(screen, RED, end.rect)
        for player in players:
            pygame.draw.rect(screen, BLUE, player.rect)
    gameDrawn = True
    #elif gameDrawn == True:
        #for event in pygame.event.get():
            #if event.type == pygame.USEREVENT: 
                #drawTimer(counter)
                #counter -= 1  
    return players
    return walls
    return ends
def main_loop_state_running():
    global level
    players = drawLevel(level)

    for event in pygame.event.get():
        for i in range(len(move_list)):
            player.movePlayer()

如果你需要看,这是我的播放器类:

class Player(object):
    def __init__(self, pos):
        
        self.rect = pygame.Rect(pos[0], pos[1], pxl(1), pxl(1))

    #def move(dx, dy):
        # Bewegung für x und y. Kollision wird überprüft
        #if dx != 0:
            #wallCollisionDetection((dx, 0))
        #if dy != 0:
            #wallCollisionDetection(0, dy)

    def move(self, dx, dy):
        walls = drawLevel(level)
        # Den Spieler bewegen
        self.rect.x += dx
        self.rect.y += dy

        for wall in walls:
            if self.rect.colliderect(wall.rect):
                if dx > 0:  
                    self.rect.right = wall.rect.left
                if dx < 0:  
                    self.rect.left = wall.rect.right
                if dy > 0:  
                    self.rect.bottom = wall.rect.top
                if dy < 0:  
                    self.rect.top = wall.rect.bottom

    def movePlayer(self):
        for i in range(len(move_list)):
            if move_list[i] == 1:
               self.move(pxl(0), pxl(-1))
            elif move_list[i] == 2:
                self.move(pxl(0), pxl(1))
            elif move_list[i] == 3:
                self.move(pxl(1), pxl(0))
            elif move_list[i] == 4:
                self.move(pxl(-1), pxl(0))

函数 movePlayer() 应该根据当时列表中的元素移动播放器矩形

标签: pythonpygame

解决方案


首先:在你的函数结束时,你有:

    return players
    return walls
    return ends

这是行不通的,因为在第一个之后return,功能就完成了。您可以通过以下方式返回所有三个列表:

    return players, walls, ends

当您调用此函数时,您将分配所有三个变量,如下所示:

    players, walls, ends = drawLevel(level)

如果您只需要使用一个变量,标准约定是分配您不需要的变量_

    players, _, _ = drawLevel(level)

要将单个Player对象从players列表中取出,您需要对其进行迭代。代替:

player.movePlayer()

做:

for player in players:
    player.MovePlayer()

推荐阅读