基本上,我正在编写一个"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 类,代码更容易阅读和理解。