如何在 pygame 中使用相同的 class 创建独立工作的重复精灵?
How to create duplicate sprite that works independently using same class in pygame?
在游戏开始之前,通过从 class 生物调用它来启动 5 个对象(僵尸)。然后,存储在名为 zombie.
的列表中
zombie = [None]*5
def newmob():
for i in range(5):
zombie[i] = Mob()
all_sprites.add(zombie[i])
mobs.add(zombie[i])
newmob() 在进入游戏循环之前被调用。
newmob()
while running:
for i in range(len(zombie)):
hits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_mask)
if hits:
player.shoot = False
player.startShoot = True
zombie[i].damage()
if zombie[i].health() <= 0:
zombie[i].dying()
atks = pygame.sprite.spritecollide(barricade, mobs, False, pygame.sprite.collide_mask)
if atks:
zombie[i].attacking()
barricade.damage()
print(barricade.health())
if barricade.health() <= 0:
barricade.destroyed()
zombie[i].walking()
生物class如下:
class Mob(pygame.sprite.Sprite):
zom3_walk = [pygame.image.load(path.join(img_folder, '3go_%s.png' % frame)) for frame in range(1, 17)]
zom3_die = [pygame.image.load(path.join(img_folder, '3die_%s.png' % frame)) for frame in range(1, 17)]
zom3_atk = [pygame.image.load(path.join(img_folder, '3hit_%s.png' % frame)) for frame in range(1, 17)]
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = zom3_walk[0]
self.x = random.randrange(1000, 1200)
self.y = 400
self.rect = self.image.get_rect()
self.rect.center = (self.x, self.y)
self.vx = random.uniform(0.02, 1)
self.hpbar = 2
self.walkCount = 0
self.Dead = False
self.Attack = False
self.Walk = True
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 100
def die_animation(self):
now = pygame.time.get_ticks()
if self.frame < 16:
self.image = self.zom3_die[self.frame]
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
else:
self.kill()
def attack_animation(self):
if self.attacking:
now = pygame.time.get_ticks()
if self.frame < 16:
self.image = self.zom3_atk[self.frame]
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
else:
self.frame = 0
if now - self.last_update > 600:
self.frame = 0
def dying(self):
self.Dead = True
def attacking(self):
self.Attack = True
self.Walk = False
def walking(self):
self.Attack = False
self.Walk = True
def health(self):
return self.hpbar
def damage(self):
self.hpbar -=1
def update(self):
now = pygame.time.get_ticks()
pygame.draw.rect(screen, RED, (self.rect.x+20,self.rect.y-100, self.hpbar*100, 45))
pygame.draw.rect(screen, WHITE, (self.rect.x+20,self.rect.y-100, 200, 45),2)
if self.Attack:
self.vx = 0
self.attack_animation()
if self.Dead:
self.die_animation()
if self.Walk:
if now - self.last_update > 800:
if self.rect.x > 0:
self.vx = random.uniform(0.02, 0.03)
self.rect.x -= self.vx
if self.walkCount + 1 >= 20:
self.walkCount = 0
if self.vx > 0:
self.image = self.zom3_walk[self.walkCount // 3]
self.walkCount += 1
基本上,我正在尝试创建一波僵尸,但产生的僵尸都以某种方式相互关联,就像一个人死亡时所有其他人都一起死亡等等......
而不是遍历序列:
for i in range(len(zombie)):
hits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_mask)
if hits:
player.shoot = False
player.startShoot = True
zombie[i].damage()
if zombie[i].health() <= 0:
zombie[i].dying()
...
遍历 spritecollide
returns:
的精灵列表
for zomb in pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_mask):
player.shoot = False
player.startShoot = True
zomb.damage()
if zomb.health() <= 0:
zomb.dying()
...
因为它已经 returns 来自 mobs
的所有精灵与 player
发生碰撞。
在你的代码中,你实际上并没有 spritecollide
returns.
您可能应该只删除 zombie
列表或至少停止通过索引访问其元素。
在游戏开始之前,通过从 class 生物调用它来启动 5 个对象(僵尸)。然后,存储在名为 zombie.
的列表中zombie = [None]*5
def newmob():
for i in range(5):
zombie[i] = Mob()
all_sprites.add(zombie[i])
mobs.add(zombie[i])
newmob() 在进入游戏循环之前被调用。
newmob()
while running:
for i in range(len(zombie)):
hits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_mask)
if hits:
player.shoot = False
player.startShoot = True
zombie[i].damage()
if zombie[i].health() <= 0:
zombie[i].dying()
atks = pygame.sprite.spritecollide(barricade, mobs, False, pygame.sprite.collide_mask)
if atks:
zombie[i].attacking()
barricade.damage()
print(barricade.health())
if barricade.health() <= 0:
barricade.destroyed()
zombie[i].walking()
生物class如下:
class Mob(pygame.sprite.Sprite):
zom3_walk = [pygame.image.load(path.join(img_folder, '3go_%s.png' % frame)) for frame in range(1, 17)]
zom3_die = [pygame.image.load(path.join(img_folder, '3die_%s.png' % frame)) for frame in range(1, 17)]
zom3_atk = [pygame.image.load(path.join(img_folder, '3hit_%s.png' % frame)) for frame in range(1, 17)]
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = zom3_walk[0]
self.x = random.randrange(1000, 1200)
self.y = 400
self.rect = self.image.get_rect()
self.rect.center = (self.x, self.y)
self.vx = random.uniform(0.02, 1)
self.hpbar = 2
self.walkCount = 0
self.Dead = False
self.Attack = False
self.Walk = True
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 100
def die_animation(self):
now = pygame.time.get_ticks()
if self.frame < 16:
self.image = self.zom3_die[self.frame]
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
else:
self.kill()
def attack_animation(self):
if self.attacking:
now = pygame.time.get_ticks()
if self.frame < 16:
self.image = self.zom3_atk[self.frame]
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
else:
self.frame = 0
if now - self.last_update > 600:
self.frame = 0
def dying(self):
self.Dead = True
def attacking(self):
self.Attack = True
self.Walk = False
def walking(self):
self.Attack = False
self.Walk = True
def health(self):
return self.hpbar
def damage(self):
self.hpbar -=1
def update(self):
now = pygame.time.get_ticks()
pygame.draw.rect(screen, RED, (self.rect.x+20,self.rect.y-100, self.hpbar*100, 45))
pygame.draw.rect(screen, WHITE, (self.rect.x+20,self.rect.y-100, 200, 45),2)
if self.Attack:
self.vx = 0
self.attack_animation()
if self.Dead:
self.die_animation()
if self.Walk:
if now - self.last_update > 800:
if self.rect.x > 0:
self.vx = random.uniform(0.02, 0.03)
self.rect.x -= self.vx
if self.walkCount + 1 >= 20:
self.walkCount = 0
if self.vx > 0:
self.image = self.zom3_walk[self.walkCount // 3]
self.walkCount += 1
基本上,我正在尝试创建一波僵尸,但产生的僵尸都以某种方式相互关联,就像一个人死亡时所有其他人都一起死亡等等......
而不是遍历序列:
for i in range(len(zombie)):
hits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_mask)
if hits:
player.shoot = False
player.startShoot = True
zombie[i].damage()
if zombie[i].health() <= 0:
zombie[i].dying()
...
遍历 spritecollide
returns:
for zomb in pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_mask):
player.shoot = False
player.startShoot = True
zomb.damage()
if zomb.health() <= 0:
zomb.dying()
...
因为它已经 returns 来自 mobs
的所有精灵与 player
发生碰撞。
在你的代码中,你实际上并没有 spritecollide
returns.
您可能应该只删除 zombie
列表或至少停止通过索引访问其元素。