【问题标题】:Creating infinite objects in Python在 Python 中创建无限对象
【发布时间】:2017-09-29 06:10:52
【问题描述】:

我正在使用 python3 和 pygame 开发我的非常简单的游戏项目,这是我可能添加的第一个游戏项目,我正在尝试生成一个每 X 秒从屏幕上掉下来的块。该块是一个类对象(出于多种原因),我只是无法掌握创建新对象的概念以及以后如何调用它们的函数。我显然不能只调用block1,block2,block3...等名称的1000个对象,那么我该如何处理这个问题呢?

这是我正在运行的一个非常简单的游戏循环:

player = Player()
block = Block()

gameExit = False
while not gameExit:
    dt = clock.tick(fps)
    timePassed += dt

    gameDisplay.fill(black)
    player.update()
    block.update()

    blockspawner = (4 / velocity) * 1000
    velocity += 0.001

    if timePassed > blockspawner:
        #this is where i'd create my new Block() object
        timePassed = 0

    pygame.display.update()

对于这个问题,有没有我还没有听说过的非常简单的解决方案?

【问题讨论】:

  • block 是一个类实例Block 是一个类对象。 (类在 Python 中 对象,everything 是一个对象)。
  • 但是,我不确定您所说的“创建无限对象”是什么意思。您无法创建无限对象。你只有有限的内存,所以对象的数量必然是有限的。我认为您只需要使用 容器
  • @juanpa.arrivillaga 我会说itertools.repeat(0) 是一个无限对象。
  • 这个问题需要的帮助比我们所能提供的更多。我们喜欢帮助别人,但有时您需要先通过阅读有关语言的书籍、在线文档或询问您认识的人来帮助自己。一旦您更好地理解了这个主题,我们邀请您编辑这个问题,修正明显的错误,然后重新打开它。
  • 您已经确定了基本问题:您还不知道如何处理序列、类、对象、方法等。找到关于这些主题的有用教程。当你在编码中遇到更具体的问题时回来;我们会在这里。

标签: python python-3.x pygame python-3.5


【解决方案1】:

没有必要创建无限的对象。只需创建一个列表来存储您的对象。此外,您必须创建一些方法来删除不再使用的块。一种方法是检查该块何时离开屏幕并将其删除或对用户不可见。

【讨论】:

  • 无限我只是指“任何给定的数量”。稍后我将如何调用这些函数?假设我想为其中的每一个调用 self.update() 函数,或者我想为列表中的一个特定对象调用该函数。会是 list[0].update() 吗?
【解决方案2】:

您可以创建块对象列表。

block_list.append(Block())

【讨论】:

  • 如果我想引用它们,比如调用 self.update() 函数,我该怎么做?
  • 这就是我的想法,但它给了我 blockList[0].update() IndexError: list index out of range 的错误
  • 不管我把它放在代码的哪个位置,如果它在循环中它只会返回这个错误。
  • @AdamKarolczak 更新所有区块:for block in block_list: block.update()
  • 错误听起来像 block_list 是空的,请注意在用于将成员添加到列表的循环之外定义列表。
【解决方案3】:

每次调用Block(),它都会创建一个新对象。所以在你的主循环中放置一个像block = Block() 这样的对象创建语句,只要循环运行,你就会拥有无限的新对象。如果它永远运行,您将拥有“无限”对象。

您需要做更多的工作才能一次拥有多个对象。例如,您可以将它们保留在列表中。从第一个块开始:

blocks = [ Block() ]

现在运行游戏。每当需要出现新块时,将一个添加到列表末尾。块将累积,直到您开始删除它们。如果它们都以相同的速度移动是最简单的:当您检测到最旧的块(始终位于位置 0)已离开屏幕区域并且必须丢弃时,移动列表。

while not gameExit:
    # do game stuff, e.g. display and keeping track of screen positions

    if add_a_block:
        blocks.append(Block())

    if out_of_bounds(blocks[0]):
         blocks = blocks[1:]

如何决定何时添加或删除块取决于您。该示例假设了一个检测退出的函数out_of_bounds(),但您可以直接检查坐标或其他方式。

【讨论】:

  • 其实,一次拥有不止一个正是我在这里需要做的,所以这就是我想知道的。
  • 生成几个,并将它们放在一个列表中。然后随着游戏的进行在循环中创建更多。在循环的某个时刻,您还会检查是否该扔掉每个块。
猜你喜欢
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2012-03-16
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多