Exemple #1
0
    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)
Exemple #2
0
 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)
Exemple #3
0
 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)
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
	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)
Exemple #7
0
    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)
Exemple #8
0
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)
Exemple #9
0
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']
Exemple #10
0
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)
Exemple #11
0
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"]