我正在尝试使用 pygame 制作 atari 突破风格游戏,并且我希望可破坏的块是具有某些属性的对象,我可以随着游戏的进行而更改这些属性。
因此,我创建了一个“Block”类和一个后续函数,该函数多次循环遍历该类,将实例分配给列表。
我遇到的问题是,我没有为每个对象提供不同的“名称”,因此很难访问它们各自的属性。
这是一个例子:
class Block:
def __init__(self):
self.brick = pygame.sprite.Sprite()
pygame.sprite.Sprite.__init__(self.brick)
self.brick.image = pygame.Surface([width, height])
self.brick.image.fill(RED)
self.brick.rect = self.brick.image.get_rect()
def blockType (self, hardness):
self.hardness = hardness
def lay ():
layoutm = []
for x in range (0, 5):
layoutl = []
for y in range (0, 12):
layoutl.append (Block())
layoutm.append (layoutl)
return layoutm
layoutm=lay()
horIndex = -1
for x in range(20, 195, 35):
horIndex += 1
verIndex = -1
for y in range (20, 660, 55):
verIndex += 1
#set_trace ()
brick = (layoutm[horIndex][verIndex]).brick
brick.rect.topleft = (y,x)
block_list.add(brick)
list_of_sprites.add(brick)
你们中的一些人可能会指出,我可以简单地继承pygame.sprite.Sprite()
父类,这可能是一个解决方案(可能有太多属性或其他东西),但由于某种原因,这对我不起作用。
之后的一切layoutm=lay()
是各个块的位置代码,我包含它的唯一原因是为了显示我计划如何访问每个各自的 self.brick 的位置属性。可能不是最好的方法,但是构造函数之后的所有方法对于我打算添加到游戏中的功能都是必需的(这就是为什么我留在 blockType () 中以简化问题)。
我的问题基本上是我是否总是必须使用后面的代码set_trace()
(这是运行调试器的命令pudb)是否访问这些单独的实例。
仅供参考:我浏览所有这些内容的原因是因为我计划列出一些清单,例如
level_1 = [
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1]]
level_2 = [
[0,1,1,2,2,3,3,2,2,1,1,0],
[1,1,2,2,3,3,3,3,2,2,1,1],
[1,2,2,3,3,4,4,3,3,2,2,1],
[1,1,2,2,3,3,3,3,2,2,1,1],
[0,1,1,2,2,3,3,2,2,1,1,0]]
代表关卡布局来说明哪种类型的块是(当然,代码将被修改以使其工作。
另外,我的术语有时可能是错误的(我用法语上这门课),例如令人困惑的实例与对象(我称它们相同,但它们可能不是),所以如果有不清楚的地方,请随时问我。