如何创建一个根据对象在列表中的顺序更改对象位置的类?



基本上,我正在编写一个"Enemy"类,它从图像列表和位置编号(o(中获取图像,并将其分配给其在屏幕上的位置。变量 o 最初设置为 -1。

我希望它的工作方式是,如果我创建最多 3 个 Enemy 类的实例,然后将第一个实例分配给图像列表中的第一个图像,并在位置列表中分配第一个位置,因此第一个实例将具有位置 (1000,0(。

目的是我可以创建在屏幕外边缘生成的敌人,但我想控制我生成的数量。

如果有更简单的方法来编码,请告诉我。

o = -1
class Enemy(sprite.Sprite):
def __init__(self, enemyImageList,o):
super().__init__()
self.image = transform.scale(image.load(enemyImageList[o]),(40,40))
self.rect = self.image.get_rect()
if o == 0:
self.rect[0] = 1000
self.rect[1] = 0
elif o == 1:
self.rect[0] = 1000
self.rect[1] = 100
elif o == 2:
self.rect[0] = 1000
self.rect[1] = 200
elif o == 3:
self.rect[0] = 1000
self.rect[1] = 300
elif o == 4:
self.rect[0] = 1000
self.rect[1] = 400            
elif o == 5:
self.rect[0] = 1000
self.rect[1] = 500            
elif o == 6:
self.rect[0] = 1000
self.rect[1] = 600            
elif o == 7:
self.rect[0] = 1000
self.rect[1] = 700
elif o == 8:
self.rect[0] = 900
self.rect[1] = 0
elif o == 9:
self.rect[0] = 800
self.rect[1] = 0
elif o == 10:
self.rect[0] = 700
self.rect[1] = 0
elif o == 11:
self.rect[0] = 600
self.rect[1] = 0
elif o == 12:
self.rect[0] = 500
self.rect[1] = 0            
elif o == 13:
self.rect[0] = 400
self.rect[1] = 0            
elif o == 14:
self.rect[0] = 300
self.rect[1] = 0            
elif o == 15:
self.rect[0] = 200
self.rect[1] = 0
elif o == 16:
self.rect[0] = 100
self.rect[1] = 0
elif o == 17:
self.rect[0] = 0
self.rect[1] = 0
# Set image to be a file on the system.
self.image.set_colorkey(BLACK)
# Set background to transparent.
def update(self):
if self.rect != player.rect:
if self.rect.x < player.rect.x:
self.rect.x += 1
if self.rect.x > player.rect.x:
self.rect.x -= 1
if self.rect.y < player.rect.y:
self.rect.y += 1
if self.rect.y > player.rect.y:
self.rect.y -= 1
def draw(screen, self):
screen.blit(self.image,self.rect)

enemySprite = sprite.Group()
enemy1 = Enemy(enemyImageList, o)
enemyList.append(enemy1)
enemySprite.add(enemy1)
o+=1
enemy2 = Enemy(enemyImageList, o)
enemyList.append(enemy2)
enemySprite.add(enemy2)
o+=1
enemy3 = Enemy(enemyImageList, o)
enemyList.append(enemy3)
enemySprite.add(enemy3)
o+=1
enemy4 = Enemy(enemyImageList, o)
enemyList.append(enemy4)
o+=1
enemy5 = Enemy(enemyImageList, o)
enemyList.append(enemy5)
o+=1
enemy6 = Enemy(enemyImageList, o)
enemyList.append(enemy6)
o+=1
enemy7 = Enemy(enemyImageList, o)
enemyList.append(enemy7)
o+=1
enemy8 = Enemy(enemyImageList, o)
enemyList.append(enemy8)
o+=1
enemy9 = Enemy(enemyImageList, o)
enemyList.append(enemy9)
o+=1
enemy10 = Enemy(enemyImageList, o)
enemyList.append(enemy10)
o+=1
enemy11= Enemy(enemyImageList, o)
enemyList.append(enemy11)
o+=1
enemy12= Enemy(enemyImageList, o)
enemyList.append(enemy12)
o+=1
enemy13= Enemy(enemyImageList, o)
enemyList.append(enemy13)
o+=1
enemy14= Enemy(enemyImageList, o)
enemyList.append(enemy14)
o+=1
enemy15= Enemy(enemyImageList, o)
enemyList.append(enemy15)
o+=1
enemy16= Enemy(enemyImageList, o)
enemyList.append(enemy16)
o+=1
enemy17= Enemy(enemyImageList, o)
enemyList.append(enemy17)
o+=1
enemy18= Enemy(enemyImageList, o)
enemyList.append(enemy18)
o+=1
enemy19= Enemy(enemyImageList, o)
enemyList.append(enemy19)
o+=1
enemy20= Enemy(enemyImageList, o)
enemyList.append(enemy20)
o+=1
enemy21= Enemy(enemyImageList, o)
enemyList.append(enemy21)
o+=1
enemy22= Enemy(enemyImageList, o)
enemyList.append(enemy22)
o+=1
enemy23= Enemy(enemyImageList, o)
enemyList.append(enemy23)
o+=1
enemy24= Enemy(enemyImageList, o)
enemyList.append(enemy24)
o+=1
enemy25= Enemy(enemyImageList, o)
enemyList.append(enemy25)
o+=1
enemy26= Enemy(enemyImageList, o)
enemyList.append(enemy26)
o+=1
enemy27= Enemy(enemyImageList, o)
enemyList.append(enemy27)
o+=1
enemy28= Enemy(enemyImageList, o)
enemyList.append(enemy28)
o+=1
enemy29 = Enemy(enemyImageList, o)
enemyList.append(enemy29)
o+=1
enemy30 = Enemy(enemyImageList, o)
enemyList.append(enemy30)
o+=1

你的第一组长行:

if o == 0:
self.rect[0] = 1000
self.rect[1] = 0
elif o == 1:
self.rect[0] = 1000
self.rect[1] = 100
elif o == 2:
self.rect[0] = 1000
self.rect[1] = 200
elif o == 3:
self.rect[0] = 1000
self.rect[1] = 300
elif o == 4:
self.rect[0] = 1000
self.rect[1] = 400            
elif o == 5:
self.rect[0] = 1000
self.rect[1] = 500            
elif o == 6:
self.rect[0] = 1000
self.rect[1] = 600            
elif o == 7:
self.rect[0] = 1000
self.rect[1] = 700
elif o == 8:
self.rect[0] = 900
self.rect[1] = 0
elif o == 9:
self.rect[0] = 800
self.rect[1] = 0
elif o == 10:
self.rect[0] = 700
self.rect[1] = 0
elif o == 11:
self.rect[0] = 600
self.rect[1] = 0
elif o == 12:
self.rect[0] = 500
self.rect[1] = 0            
elif o == 13:
self.rect[0] = 400
self.rect[1] = 0            
elif o == 14:
self.rect[0] = 300
self.rect[1] = 0            
elif o == 15:
self.rect[0] = 200
self.rect[1] = 0
elif o == 16:
self.rect[0] = 100
self.rect[1] = 0
elif o == 17:
self.rect[0] = 0
self.rect[1] = 0

可以简化为:

RECTS = [
[1000,   0],    # 0
[1000, 100],    # 1
[1000, 200],    # 2
[1000, 300],    # 3
[1000, 400],    # 4
[1000, 500],    # 5
[1000, 600],    # 6
[1000, 700],
[ 900,   0],
[ 800,   0],
[ 900,   0],
[ 600,   0],
[ 500,   0],
[ 400,   0],
[ 300,   0],
[ 200,   0],
[ 100,   0],    # 16
[   0,   0],    # 17
]
self.rect[0] = RECTS[o][0]
self.rect[1] = RECTS[o][1]

甚至更少的行数(注意:这仅模仿您在 if/elif 梯子中编写的内容(:

if o < 8:
self.rect[0] = 1000
self.rect[1] = 100 * i
else:
self.rect[0] = 1000 - 100 * (i - 7)
self.rect[1] = 0

还有这组台词:

enemySprite = sprite.Group()
enemy1 = Enemy(enemyImageList, o)
enemyList.append(enemy1)
enemySprite.add(enemy1)
o+=1
enemy2 = Enemy(enemyImageList, o)
enemyList.append(enemy2)
enemySprite.add(enemy2)
o+=1
enemy3 = Enemy(enemyImageList, o)
enemyList.append(enemy3)
enemySprite.add(enemy3)
o+=1
enemy4 = Enemy(enemyImageList, o)
enemyList.append(enemy4)
o+=1
enemy5 = Enemy(enemyImageList, o)
enemyList.append(enemy5)
o+=1
enemy6 = Enemy(enemyImageList, o)
enemyList.append(enemy6)
o+=1
enemy7 = Enemy(enemyImageList, o)
enemyList.append(enemy7)
o+=1
enemy8 = Enemy(enemyImageList, o)
enemyList.append(enemy8)
o+=1
enemy9 = Enemy(enemyImageList, o)
enemyList.append(enemy9)
o+=1
enemy10 = Enemy(enemyImageList, o)
enemyList.append(enemy10)
o+=1
enemy11= Enemy(enemyImageList, o)
enemyList.append(enemy11)
o+=1
enemy12= Enemy(enemyImageList, o)
enemyList.append(enemy12)
o+=1
enemy13= Enemy(enemyImageList, o)
enemyList.append(enemy13)
o+=1
enemy14= Enemy(enemyImageList, o)
enemyList.append(enemy14)
o+=1
enemy15= Enemy(enemyImageList, o)
enemyList.append(enemy15)
o+=1
enemy16= Enemy(enemyImageList, o)
enemyList.append(enemy16)
o+=1
enemy17= Enemy(enemyImageList, o)
enemyList.append(enemy17)
o+=1
enemy18= Enemy(enemyImageList, o)
enemyList.append(enemy18)
o+=1
enemy19= Enemy(enemyImageList, o)
enemyList.append(enemy19)
o+=1
enemy20= Enemy(enemyImageList, o)
enemyList.append(enemy20)
o+=1
enemy21= Enemy(enemyImageList, o)
enemyList.append(enemy21)
o+=1
enemy22= Enemy(enemyImageList, o)
enemyList.append(enemy22)
o+=1
enemy23= Enemy(enemyImageList, o)
enemyList.append(enemy23)
o+=1
enemy24= Enemy(enemyImageList, o)
enemyList.append(enemy24)
o+=1
enemy25= Enemy(enemyImageList, o)
enemyList.append(enemy25)
o+=1
enemy26= Enemy(enemyImageList, o)
enemyList.append(enemy26)
o+=1
enemy27= Enemy(enemyImageList, o)
enemyList.append(enemy27)
o+=1
enemy28= Enemy(enemyImageList, o)
enemyList.append(enemy28)
o+=1
enemy29 = Enemy(enemyImageList, o)
enemyList.append(enemy29)
o+=1
enemy30 = Enemy(enemyImageList, o)
enemyList.append(enemy30)
o+=1

可以减少到:

for o in range(30):
enemy = Enemy(enemyImageList, o)
enemyList.append(enemy)
enemySprite.add(enemy)

但是你很快就会看到,因为你正在创建30个敌人,但你的RECTS列表只有18个元素,你会得到一个IndexError。 如果你使用第二种if o < 8:...方法,你将开始在self.rect[0]中获得负值,所以你需要弄清楚如何最好地处理它。

我会说使用元组值字典作为"o"值。

locationDict = {0: (1000, 0), 1: (1000: 100), ....}
location = locationDict(o)
self.rect[0] = location[0]
self.rect[1] = location[1]

如果我是你,我会有一个通用的敌人类,敌人类来存储所有活跃的敌人。(另外,我不确定"o"变量代表什么,我假设它是位置。

class Enemy(sprite.Sprite):
def __init__(self, o=-1):
super().__init__()
self.image = transform.scale(image.load(enemyImageList[o]),(40,40))
self.rect = self.image.get_rect()
locationDict = {0: (1000, 0), 1: (1000: 100), ....}
location = sizeDict(o)
self.rect[0] = location[0]
self.rect[1] = location[1]
def updateO(o):
self.o = o
location = self.locationDict[0]
self.rect[0] = location[0]
self.rect[1] = location[1]
class Enemies():
def __init__(self):
super().__init__()
self.enemyList = []
def addEnemy(enemy):
self.enemyList.append(enemy)
def GetDefualtEnemies():
for i in range(30):
self.addEnemy(Enemy(i))

使用字典反对二维列表的好处是,您可以让键值代表某些类型的敌人。例如,locationDict = {"Ninjas": (100, 0(...}, 至于使用基于类的 Enemies 类,代码更容易阅读和理解。

最新更新