[英]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.