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

2024-09-28 22:42:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我希望这样做的方式是,如果我创建最多3个敌方类的实例,那么它会将第一个实例分配给图像列表中的第一个图像,并将第一个位置分配给位置列表中的第一个位置,这样第一个将具有位置(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

Tags: rect图像imageself列表ifdefplayer
2条回答

我会说使用元组值字典来表示“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)…},至于使用基于类的类,代码更容易阅读和理解

你的第一条长线:

    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]中获得负值,因此您需要找出如何最好地处理该问题

相关问题 更多 >