python - 在函数外使用对象
问题描述
如何使用在第一个函数中创建的播放器对象,以便可以在第二个函数中调用 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() 应该根据当时列表中的元素移动播放器矩形
解决方案
首先:在你的函数结束时,你有:
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()
推荐阅读
- docker - ASP.NET Core + Docker 无法在指定端口上访问
- list - 在列表中对选定数字进行分组的算法
- java - 枚举实现特征 - 内存问题?
- python - Python 3.8.3 hashlib 中是否有用于该算法的哈希算法;Base64(SHA1(NONCE + TIMESTAMP + SHA1(密码)))?
- javascript - Vue.js 和 django MIME 类型问题
- dataweave - Mule4 studio错误无法删除现有文件夹
- python - 在 Pandas 中按组标记序列
- python-3.x - 获取:AttributeError:“list”对象在尝试运行 NLP 分类模型时没有属性“lower”
- css - 有没有办法标准化表情符号的大小和宽度?
- java - 如何使spring data jpa生成的方法在空参数上抛出异常