簡體   English   中英

有沒有辦法在python中生成不同的對象實例?

[英]Is there a way to generate different instances of objects in python?

我在python中制作游戲(使用街機庫)。 我做了一個“武器”課程,我可以在其中制作不同的武器實例(具有不同的精靈,傷害統計數據等)。 我想要它,所以當某個變量為True時,槍會創建一個類(bullet)的新實例,但我不想將每個實例分配給一個新變量等。有沒有辦法做到這一點? 請不要太復雜,因為我在Python中沒有太過分。

class Weapon(object):
    def __init__(self, sprite, size):
        self.weapon = arcade.Sprite(sprite,size)
        self.attacking = True

    def draw(self):
        self.weapon.draw()
        if self.attacking:
            # Creates an instance of Bullet Class with initialized variables
            # Every single time this variable is turned into True

您可以使用setter

class Weapon(object):
    ...

    @property
    def attacking(self):
        return self._attacking

    @attacking.setter
    def attacking(self, value):
        if value and not self._attacking:
            # logic for when attacking become true
        self._attacking = value

然后當你在代碼的其他部分做somewep.attacking = True時,setter就會運行。 關於保存Bullet實例。 如果實例化Bullet具有它需要的所有副作用,那么你不需要保存它,只需要Bullet(parameters, ...)可以了。

如果Bullet是由框架繪制的,那么它有一個對它的引用,只要框架引用它就不應該由GC收集它

我不會這樣做,我會創建一個包含draw()邏輯的Sprite類,其中Player和Weapon類將繼承玩家將包含武器並在Game類中實例化,該類將包含所有你的邏輯

class Sprite:
    def draw(self):
        # Draw logic, maybe have an image sprite member variable

class Bullet(Sprite):
    def __init__(self, posX, posY, angle, velocity, game):
        self.posX = posX
        self.posY = posY
        self.angle = angle
        self.velocity = velocity
        self.game = game
        self.game.bullets.append(self)

    def fly(self):
         # Add some trigonometry here using the angle and velocity and implement some collision algorithm

class Weapon(Sprite):
    posX = 0
    posY = 0 #Probably gonna need to keep track of the position, you should init them in constructor
    angle = PI
    bullets = []

    def shoot(self):
        if len(self.bullets) <= 10: # maybe you don't want too many bullets
            self.bullets.append(Bullet(self.posX, self.posY, self.angle, 100))

class Player(Sprite):
    posX = 0
    posY = 0
    def __init__(self, game):
        self.game = game
        self.weapon = Weapon()

    def shoot(self):
        self.weapon.shoot()

class Game:
    players = []
    bullets = []

    def __init__(self, player_count=1):
        for i in range(player_count):
            self.players.append(Player(self))

    def draw(self):
        for player in self.players:
            player.draw()
        for bullet in self.bullets:
            bullet.fly()


def main():
    game = Game(1)
    game.start() # need to implement start logic, rerendering every few MS, etc.

if __name__ == "__main__":
    main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM