创建大量对象并删除它们

时间:2016-02-27 08:01:17

标签: python windows pygame

所以我对编程很陌生,但是现在使用python和pygame,我试图创建一个小游戏。这很简单,玩家将四处移动避开小型射弹。但是我在创建很多物体时遇到了麻烦,例如我需要为新的射弹随机生成一个位置和速度,我如何创建这样的物体,以及当它们真正去的时候。离开屏幕'他们应该消失。 所以我也需要删除它们。我的第一个想法是创建一个对象列表,我和一个在更新屏幕之前逐个移动它们的循环,但是我如何创建具有不同名称的新对象,而我不知道有多少个射弹将是在屏幕上,它应该是随机的。

class Projectiles:
    ProjectilesCount = 0

    def __init__(self, x, y, speed):
            self.pos = (x,y)
            self.speed = speed
            Projectiles.ProjectilesCount += 1

    def moveProj(self):
            x, y = self.pos
            x -= self.speed
            self.pos = (x,y)
            pygame.draw.line(DISPLAY, WHITE, self.pos, (x,y+self.SIZE), self.SIZE)

bullet = Projectiles(500,200,5)
bullet.SIZE = SIZE

while true:
    # some stuff

    bullet.moveProj()

    pygame.display.update()
    fpsClock.tick(FPS)

这是我现在使用的课程(它只是向左),它只适用于一个射弹。

2 个答案:

答案 0 :(得分:1)

你想要一个清单:

list_of_bullets = []

for i in range(100):
    list_of_bullets.append(Projectiles(...))

答案 1 :(得分:0)

使用词典。列表将起作用,但是当使用订单不重要的对象时,请使用词典。在迭代其中的大量数据时,字典也表现得更好。使用类似下面的代码...

bulletdict = {}
#This is a list because we can change the value within a function without returning it
#You could also use a global variable instead of a list
bulletcount = [0]

def SpawnBullet(bulletdict,bulletcount):
    bulletdict[bulletcount] = Projectiles
    bulletcount[0] += 1

密钥将是一个数字,值将是子弹本身。迭代字典来更新内容...

for item in bulletdict:
    bulletdict[item].moveproj(...)

如果你需要删除东西,请使用与此类似的代码。我通常在我的对象中有'checkDelete'函数,我可以调用它来检查是否应该删除它们。这用于删除对象,如果它们离开屏幕或与某些东西发生碰撞。

def deleteObjects(objectdict):
    deletelist = []

    for item in objectdict:
        if objectdict[item].checkdelete() == True:
            deletelist.append(item)

    for item in deletelist:
        del objectdict[item]

这样可以方便地使用和迭代对象。您始终可以告诉最后生成的对象,因为它将具有最高的数字作为键。如果您需要,此密钥编号还将告诉您生成的对象的总数。 我希望这能帮助你,祝你好运。