def __init__(self, data, startAtLeft, yPos): pygame.sprite.Sprite.__init__(self) self.add(data.bombers) self.add(data.bulletproofEntities) self.add(data.superbombableEntities) self.imageL = data.loadImage('assets/enemies/bomber.png') self.imageR = pygame.transform.flip(self.imageL, 1, 0) self.droppedBomb = False self.timeTillBombPrimed = random.uniform(Bomber.minTimeToDropBomb, Bomber.maxTimeToDropBomb) self.lastBombDropTime = time.time() self.rect = self.imageR.get_rect() self.targetingRect = pygame.Rect((0, 0), (6, 10)) # BOMB SIZE self.smoke = SmokeSpawner(data, self.rect.topleft, 10) if startAtLeft: self.direction = 'right' self.image = self.imageR self.rect.topright = (0, yPos) else: self.direction = 'left' self.image = self.imageL self.rect.topleft = (data.WINDOWWIDTH, yPos) self.coords = list( self.rect.topleft) # for more accurate positioning using floats sound.play('swoosh', 0.3)
def isBombed(self, data): self.state = 'bombed' SmokeSpawner(data, (self.rect.midbottom), randint(5, 9), 3) # smoke for the wreckage if randint(0, 3) == 0: # sometimes add another smoke spawner randomly SmokeSpawner(data, (self.rect.x + randint(5, self.rect.width - 6), self.rect.bottom), randint(3, 5), 2) data.shakeScreen(30)
def isBombed(self, data): pygame.time.wait(50) self.state = 'bombed' SmokeSpawner(data, (self.rect.midbottom), randint(5, 9), 3) # smoke for the wreckage if randint(0, 3) == 0: # sometimes add another smoke spawner randomly SmokeSpawner(data, (self.rect.x + randint(5, self.rect.width - 6), self.rect.bottom), randint(3, 5), 2) self.remove(data.standingBuildings)
def __init__(self, data, topleft, velocity=(0, fallSpeed)): pygame.sprite.Sprite.__init__(self) self.add(data.bombs) self.baseImage = Bomb.baseImage self.rotation = 0.0 self.rect = self.baseImage.get_rect(topleft=topleft) self.yCoord = topleft[1] # float for accuracy self.fallSpeed = Bomb.fallSpeed self.smoke = SmokeSpawner(data, self.rect.midtop, 2)
def __init__(self, data, startAtLeft, yPos): pygame.sprite.Sprite.__init__(self) self.add(data.bombers) self.add(data.bulletproofEntities) self.add(data.superbombableEntities) self.imageL = data.loadImage("assets/enemies/bomber.png") self.imageR = pygame.transform.flip(self.imageL, 1, 0) self.droppedBomb = False self.timeTillBombPrimed = random.uniform(Bomber.minTimeToDropBomb, Bomber.maxTimeToDropBomb) self.lastBombDropTime = time.time() self.rect = self.imageR.get_rect() self.targetingRect = pygame.Rect((0, 0), (6, 10)) # BOMB SIZE self.smoke = SmokeSpawner(data, self.rect.topleft, 10) if startAtLeft: self.direction = "right" self.image = self.imageR self.rect.topright = (0, yPos) else: self.direction = "left" self.image = self.imageL self.rect.topleft = (data.WINDOWWIDTH, yPos) self.coords = list(self.rect.topleft) # for more accurate positioning using floats sound.play("swoosh", 0.3)
def __init__(self, data, topleft, velocity=(0, fallSpeed)): pygame.sprite.Sprite.__init__(self) self.add(data.bombs) self.baseImage = Bomb.baseImage self.baseImageSize = self.baseImage.get_size() bomb_size = int(get_val(os.environ, "BOMB", 1.0)) self.baseImage = pygame.transform.scale( self.baseImage, (self.baseImageSize[0] * bomb_size, self.baseImageSize[1] * bomb_size) ) self.rotation = 0.0 self.rect = self.baseImage.get_rect(topleft=topleft) self.yCoord = topleft[1] # float for accuracy self.fallSpeed = Bomb.fallSpeed self.smoke = SmokeSpawner(data, self.rect.midtop, 2)
class Bomb(pygame.sprite.Sprite): """A projectile that explodes on collision with other objects and destroys them and itself in the process""" fallSpeed = 15 def __init__(self, data, topleft, velocity=(0, fallSpeed)): pygame.sprite.Sprite.__init__(self) self.add(data.bombs) self.baseImage = Bomb.baseImage self.rotation = 0.0 self.rect = self.baseImage.get_rect(topleft=topleft) self.yCoord = topleft[1] # float for accuracy self.fallSpeed = Bomb.fallSpeed self.smoke = SmokeSpawner(data, self.rect.midtop, 2) def update(self, data): self.checkForCollisions(data) if self.rotation < 90.5: self.image = pygame.transform.rotate(self.baseImage, self.rotation) self.rotation += 20 * data.dt self.rect = self.image.get_rect(center=self.rect.center) else: self.image = pygame.transform.rotate(self.baseImage, self.rotation) self.rotation += random.uniform(-0.6, 0.5) self.yCoord += self.fallSpeed * data.dt self.rect.y = self.yCoord if self.fallSpeed > 0: self.smoke.sourceCoords = [ self.rect.centerx - 2, self.rect.top - 2 ] elif self.fallSpeed < 0: self.smoke.sourceCoords = [ self.rect.centerx - 2, self.rect.bottom - 2 ] data.gameSurf.blit(self.image, self.rect) def checkForCollisions(self, data): shake = True collided = pygame.sprite.spritecollideany(self, data.destroyableEntities) if collided: collided.isBombed(data) # tell the entity it has been bombed if collided in data.buildings: data.shakeScreen(20) shake = False if self in data.superBombs and isinstance(collided, Bullet): # super bombs go back upwards if shot if self.fallSpeed > 0: # is falling self.fallSpeed = -self.fallSpeed self.baseImage = pygame.transform.rotate( self.baseImage, 180) sound.play('plup', 0.8) data.score += data.scoreValues['shoot superBomb'] return elif isinstance(collided, Bullet): data.score += data.scoreValues['shoot bomb'] if collided or self.rect.bottom > data.WINDOWHEIGHT: # collided or touch bottom of screen self.explode(data, shake) elif self.rect.bottom < -20: # out of sight at the top (disappear silently) self.kill() self.smoke.kill() if self in data.superBombs: collided = pygame.sprite.spritecollideany( self, data.superbombableEntities) if collided: collided.isBombed(data) self.explode(data, False) def explode(self, data, shake=True): """Explode the bomb, if shake=True shake the screen a little""" self.kill() self.smoke.kill() Explosion(data, self.rect.center, 40) if shake: data.shakeScreen(10)
class Bomber(pygame.sprite.Sprite): """An enemy plane that drops bombs on your buildings""" minTimeToDropBomb = 0.6 maxTimeToDropBomb = 4 speed = 15 superBombFrequency = 5 # lower = higher chance of superbombs def __init__(self, data, startAtLeft, yPos): pygame.sprite.Sprite.__init__(self) self.add(data.bombers) self.add(data.bulletproofEntities) self.add(data.superbombableEntities) self.imageL = data.loadImage('assets/enemies/bomber.png') self.imageR = pygame.transform.flip(self.imageL, 1, 0) self.droppedBomb = False self.timeTillBombPrimed = random.uniform(Bomber.minTimeToDropBomb, Bomber.maxTimeToDropBomb) self.lastBombDropTime = time.time() self.rect = self.imageR.get_rect() self.targetingRect = pygame.Rect((0, 0), (6, 10)) # BOMB SIZE self.smoke = SmokeSpawner(data, self.rect.topleft, 10) if startAtLeft: self.direction = 'right' self.image = self.imageR self.rect.topright = (0, yPos) else: self.direction = 'left' self.image = self.imageL self.rect.topleft = (data.WINDOWWIDTH, yPos) self.coords = list( self.rect.topleft) # for more accurate positioning using floats sound.play('swoosh', 0.3) def update(self, data): if self.direction == 'right': dirMultiplier = 1 self.smoke.sourceCoords = self.rect.midleft else: dirMultiplier = -1 self.smoke.sourceCoords = self.rect.midright if self.rect.left > data.WINDOWWIDTH + 1: self.direction = 'left' self.image = self.imageL elif self.rect.right < -1: self.direction = 'right' self.image = self.imageR self.coords[0] += Bomber.speed * data.dt * dirMultiplier self.coords[1] += random.uniform(-0.2, 0.2) self.rect.topleft = self.coords self.smoke.update(data) if time.time() - self.lastBombDropTime > self.timeTillBombPrimed: self.bomb(data) data.gameSurf.blit(self.image, self.rect) def bomb(self, data): """drops a bomb if there is a target beneath""" if not self.checkForTarget(data): return if random.randint(0, 5) == 0: SuperBomb(data, self.rect.midbottom) else: Bomb(data, self.rect.midbottom) self.timeTillBombPrimed = random.uniform(Bomber.minTimeToDropBomb, Bomber.maxTimeToDropBomb) self.lastBombDropTime = time.time() def checkForTarget(self, data): """Checks if there is a building below the plane""" self.targetingRect.bottom = data.WINDOWHEIGHT self.targetingRect.centerx = self.rect.centerx for building in data.bomberTargetedEntities: if self.targetingRect.colliderect(building.rect): return True def isBombed(self, data): """Called when a superbomb hits the bomber""" self.kill() self.smoke.kill() Explosion(data, self.rect.center, 60) data.shakeScreen(20) sound.play('shoot down') pygame.time.wait(50) data.score += data.scoreValues['destroy bomber']
class Bomb(pygame.sprite.Sprite): """A projectile that explodes on collision with other objects and destroys them and itself in the process""" fallSpeed = 15 def __init__(self, data, topleft, velocity=(0, fallSpeed)): pygame.sprite.Sprite.__init__(self) self.add(data.bombs) self.baseImage = Bomb.baseImage self.baseImageSize = self.baseImage.get_size() bomb_size = int(get_val(os.environ, "BOMB", 1.0)) self.baseImage = pygame.transform.scale( self.baseImage, (self.baseImageSize[0] * bomb_size, self.baseImageSize[1] * bomb_size) ) self.rotation = 0.0 self.rect = self.baseImage.get_rect(topleft=topleft) self.yCoord = topleft[1] # float for accuracy self.fallSpeed = Bomb.fallSpeed self.smoke = SmokeSpawner(data, self.rect.midtop, 2) def update(self, data): self.checkForCollisions(data) if self.rotation < 90.5: self.image = pygame.transform.rotate(self.baseImage, self.rotation) self.rotation += 20 * data.dt self.rect = self.image.get_rect(center=self.rect.center) else: self.image = pygame.transform.rotate(self.baseImage, self.rotation) self.rotation += random.uniform(-0.6, 0.5) self.yCoord += self.fallSpeed * data.dt self.rect.y = self.yCoord if self.fallSpeed > 0: self.smoke.sourceCoords = [self.rect.centerx - 2, self.rect.top - 2] elif self.fallSpeed < 0: self.smoke.sourceCoords = [self.rect.centerx - 2, self.rect.bottom - 2] data.gameSurf.blit(self.image, self.rect) def checkForCollisions(self, data): shake = True collided = pygame.sprite.spritecollideany(self, data.destroyableEntities) if collided: collided.isBombed(data) # tell the entity it has been bombed if collided in data.buildings: data.shakeScreen(20) shake = False if self in data.superBombs and isinstance(collided, Bullet): # super bombs go back upwards if shot if self.fallSpeed > 0: # is falling self.fallSpeed = -self.fallSpeed self.baseImage = pygame.transform.rotate(self.baseImage, 180) sound.play("plup", 0.8) data.score += data.scoreValues["shoot superBomb"] return elif isinstance(collided, Bullet): data.score += data.scoreValues["shoot bomb"] if collided or self.rect.bottom > data.WINDOWHEIGHT: # collided or touch bottom of screen self.explode(data, shake) elif self.rect.bottom < -20: # out of sight at the top (disappear silently) self.kill() self.smoke.kill() if self in data.superBombs: collided = pygame.sprite.spritecollideany(self, data.superbombableEntities) if collided: collided.isBombed(data) self.explode(data, False) def explode(self, data, shake=True): """Explode the bomb, if shake=True shake the screen a little""" self.kill() self.smoke.kill() Explosion(data, self.rect.center, 40) if shake: data.shakeScreen(10)
class Bomber(pygame.sprite.Sprite): """An enemy plane that drops bombs on your buildings""" minTimeToDropBomb = 0.6 maxTimeToDropBomb = 4 speed = 15 superBombFrequency = 5 # lower = higher chance of superbombs def __init__(self, data, startAtLeft, yPos): pygame.sprite.Sprite.__init__(self) self.add(data.bombers) self.add(data.bulletproofEntities) self.add(data.superbombableEntities) self.imageL = data.loadImage("assets/enemies/bomber.png") self.imageR = pygame.transform.flip(self.imageL, 1, 0) self.droppedBomb = False self.timeTillBombPrimed = random.uniform(Bomber.minTimeToDropBomb, Bomber.maxTimeToDropBomb) self.lastBombDropTime = time.time() self.rect = self.imageR.get_rect() self.targetingRect = pygame.Rect((0, 0), (6, 10)) # BOMB SIZE self.smoke = SmokeSpawner(data, self.rect.topleft, 10) if startAtLeft: self.direction = "right" self.image = self.imageR self.rect.topright = (0, yPos) else: self.direction = "left" self.image = self.imageL self.rect.topleft = (data.WINDOWWIDTH, yPos) self.coords = list(self.rect.topleft) # for more accurate positioning using floats sound.play("swoosh", 0.3) def update(self, data): if self.direction == "right": dirMultiplier = 1 self.smoke.sourceCoords = self.rect.midleft else: dirMultiplier = -1 self.smoke.sourceCoords = self.rect.midright if self.rect.left > data.WINDOWWIDTH + 1: self.direction = "left" self.image = self.imageL elif self.rect.right < -1: self.direction = "right" self.image = self.imageR self.coords[0] += Bomber.speed * data.dt * dirMultiplier self.coords[1] += random.uniform(-0.2, 0.2) self.rect.topleft = self.coords self.smoke.update(data) if time.time() - self.lastBombDropTime > self.timeTillBombPrimed: self.bomb(data) data.gameSurf.blit(self.image, self.rect) def bomb(self, data): """drops a bomb if there is a target beneath""" if not self.checkForTarget(data): return if random.randint(0, 5) == 0: SuperBomb(data, self.rect.midbottom) else: Bomb(data, self.rect.midbottom) self.timeTillBombPrimed = random.uniform(Bomber.minTimeToDropBomb, Bomber.maxTimeToDropBomb) self.lastBombDropTime = time.time() def checkForTarget(self, data): """Checks if there is a building below the plane""" self.targetingRect.bottom = data.WINDOWHEIGHT self.targetingRect.centerx = self.rect.centerx for building in data.bomberTargetedEntities: if self.targetingRect.colliderect(building.rect): return True def isBombed(self, data): """Called when a superbomb hits the bomber""" self.kill() self.smoke.kill() Explosion(data, self.rect.center, 60) data.shakeScreen(20) sound.play("shoot down") pygame.time.wait(50) data.score += data.scoreValues["destroy bomber"]