如何创建多个相似的精灵?

时间:2013-12-10 01:32:07

标签: python python-3.x pygame

让我向您展示可能有助于使这个问题更有意义的代码。

import pygame, classes, random
pygame.init()

screen = pygame.display.set_mode((640, 480))

def game():
    pygame.display.set_caption("GOLOGO")

    laser = classes.Laser(screen)
    player = classes.Player(laser, screen)
    bad = classes.BadGuy(screen, 320, 0)
    bad1 = classes.BadGuy(screen, 260, 0)
    bad2 = classes.BadGuy(screen, 200, 0)
    bad3 = classes.BadGuy(screen, 140, 0)
    bad4 = classes.BadGuy(screen, 80, 0)
    bad5 = classes.BadGuy(screen, 20, 0)
    bad6 = classes.BadGuy(screen, 380, 0)
    bad7 = classes.BadGuy(screen, 440, 0)
    bad8 = classes.BadGuy(screen, 440, 60)
    bad9 = classes.BadGuy(screen, 320, 60)
    bad10 = classes.BadGuy(screen, 260, 60)
    bad11 = classes.BadGuy(screen, 200, 60)
    bad12 = classes.BadGuy(screen, 140, 60)
    bad13 = classes.BadGuy(screen, 80, 60)
    bad14 = classes.BadGuy(screen, 20, 60)
    bad15 = classes.BadGuy(screen, 380, 60)
    space = classes.Space(screen)
    scoreboard = classes.Scoreboard()

    allSprites = pygame.sprite.OrderedUpdates(space, laser, player)
    badSprites = pygame.sprite.Group(bad, bad1, bad2, bad3, bad4, \
        bad5, bad6, bad7, bad8, bad9, bad10, bad11, bad12, \
        bad13, bad14, bad15)
    scoreSprite = pygame.sprite.Group(scoreboard)

正如你所看到的,有许多BadGuy精灵。他们只是在不同的位置。我不介意继续这样做,但我希望有一个更简单的方法来做到这一点。我可能会在增加屏幕大小的同时添加更多。我正在使用 python 3和pygame

2 个答案:

答案 0 :(得分:1)

这是一个经典案例,列表可以提供帮助。

例如:

bad_guys = []
bad_guys.append(classes.BadGuy(screen, 320, 0))
bad_guys.append(classes.BadGuy(screen, 260, 0))
bad_guys.append(classes.BadGuy(screen, 200, 0))
# ... and so on ...

现在你可以通过索引来引用一个特定的坏人:

bad_guys[0] # looks up the first bad guy, the one at (320, 0)

但请注意,我们在这里有很多重复。我们总是使用BadGuy类来制作一个坏人,我们总是将screen作为参数传递。

我们可以拉出那些坐标值,列出它们,然后循环制作坏人:

coords = [
    (320, 0), (260, 0), (200, 0), (140, 0), (80, 0), (20, 0), (380, 0), (440, 0),
    (440, 0), (320, 0), (260, 0), (200, 0), (140, 0), (80, 0), (20, 0), (380, 0),
]

bad_guys = []
for x, y in coords:
    bad_guys.append(classes.BadGuy(screen, x, y))

我们必须构建的坐标列表,但现在可以通过for循环构建坏人列表。

但是Python提供了一个我们可以用来构建bad_guys列表的捷径。我们可以使用“列表理解”来构建没有明确for循环的坏人列表:

coords = [
    (320, 0), (260, 0), (200, 0), (140, 0), (80, 0), (20, 0), (380, 0), (440, 0),
    (440, 0), (320, 0), (260, 0), (200, 0), (140, 0), (80, 0), (20, 0), (380, 0),
]

bad_guys = [classes.BadGuy(screen, x, y) for x, y in coords]

处理创建坏人名单。

现在我们有了这个列表,我们需要和所有坏人一起调用pygame.sprite.Group()。我们可以手工完成:

badSprites = pygame.sprite.Group(bad_guys[0], bad_guys[1], ... and so on ...)

但有更好的方法。在Python中,我们可以使用*运算符来“粘贴”列表或元组中的值:

badSprites = pygame.sprite.Group(*bad_guys)

现在bad_guys列表中有多少坏人并不重要;无论有多少,它们都将作为pygame.sprite.Group()的参数传递。

编辑:更改代码以将值存储为坐标(xy)。我不确定“坏人数”是什么,但我很确定@alKid是正确的,他们是坐标。目前,所有y值均为0但可能会更改,因此请同时存储xy值。

答案 1 :(得分:1)

您可以将值存储在列表中:

coordinates = [(320, 0), (260, 0), (200, 0), ...]

在创建它时循环遍历它们。您可以将实例放在字典中:

badGuys = {}
for i, v in enumerate(coordinates):
    badGuys["bad%d"%i] = classes.BadGuy(screen, *v) 

希望这有帮助!

相关问题