class GameController:
    def __init__(self, game):
        self.game = game
        self.camera = Camera()
        self.environment = Environment(self.game)
        self.player = Player(10)
        self.enemy_controller = EnemyController(self.player,
                                                self.environment.trees,
                                                self.camera)
        self.camera.object = self.player
        self.health_bar = HealthBar()
        self.background = pygame.image.load('sprites/background.png')

    def render(self, surface):
        surface.blit(self.background, (0, 0))
        self.environment.render(surface, self.camera.x)
        self.player.render(surface, self.camera.x)
        self.enemy_controller.render(surface, self.camera.x)
        self.health_bar.render(surface, 10, 10)

    def update(self, dt, event):
        self.environment.update(dt, self.player.timer.time)
        self.player.update(dt, event)
        self.enemy_controller.update(dt, event)
        self.camera.update(dt, event)
        self.health_bar.health = self.environment.tree_health
Exemple #2
0
 def __init__(self, player):
     self.player = player
     self.ammo_counter = DrawText(self.player,
                                  (self.player.game.screen_rect.midtop),
                                  self.player.all_sprites_container)
     self.health_bar = HealthBar(self, (self.player.stats.health, 25),
                                 (50, 50), c.BLUE,
                                 self.player.all_sprites_container)
Exemple #3
0
 def handle_health_bar(self, room):
     if self.health > 0:
         self.health_bar = HealthBar(
             self, (self.health, 10),
             (self.rect.centerx, self.rect.center[1] - 30), c.RED)
         self.health_bar.rect.centerx = self.rect.centerx
         self.health_bar.add_to_group(room.health_bar_container)
         self.game.all_sprites.add(self.health_bar)
         self.health_bar.update(self.health)
Exemple #4
0
 def __init__(self, x):
     self.x = x
     self.image = pygame.image.load('sprites/tree.png')
     self.sprite = self.image
     self.width, self.height = self.sprite.get_size()
     self.y = 696 - self.height
     self.destroy = 0
     self.health_bar = HealthBar()
     self.health = 10
     self.total_health = 10
 def __init__(self, game):
     self.game = game
     self.camera = Camera()
     self.environment = Environment(self.game)
     self.player = Player(10)
     self.enemy_controller = EnemyController(self.player,
                                             self.environment.trees,
                                             self.camera)
     self.camera.object = self.player
     self.health_bar = HealthBar()
     self.background = pygame.image.load('sprites/background.png')
Exemple #6
0
class PlayerGui():
    def __init__(self, player):
        self.player = player
        self.ammo_counter = DrawText(self.player,
                                     (self.player.game.screen_rect.midtop),
                                     self.player.all_sprites_container)
        self.health_bar = HealthBar(self, (self.player.stats.health, 25),
                                    (50, 50), c.BLUE,
                                    self.player.all_sprites_container)

    def update(self):
        self.health_bar.update(self.player.stats.health)
        self.ammo_counter.update(
            str(self.player.gun.clip) + "/" + str(self.player.gun.ammo_held))
Exemple #7
0
 def __init__(self, x, trees):
     self.trees = trees
     self.sprite = pygame.image.load("sprites/enemy.png")
     self.width, self.height = self.sprite.get_size()
     self.y = 696 - self.height
     self.x = x
     self.speed = 200
     self.search_for_tree()
     self.health_bar = HealthBar()
     self.health = 10
     self.total_health = 10
     self.rect_head = pygame.Rect(self.x + 32, self.y, 36, self.height)
     self.rect_body = pygame.Rect(self.x, self.y + 51, self.width,
                                  self.height)
     self.sad = False
     self.chainsaw = Chainsaw()
Exemple #8
0
class Tree:
    def __init__(self, x):
        self.x = x
        self.image = pygame.image.load('sprites/tree.png')
        self.sprite = self.image
        self.width, self.height = self.sprite.get_size()
        self.y = 696 - self.height
        self.destroy = 0
        self.health_bar = HealthBar()
        self.health = 10
        self.total_health = 10

    def render(self, surface, camera_x):
        surface.blit(self.sprite, (self.x - camera_x, self.y))
        self.health_bar.render(surface, self.x - camera_x + 25, self.y - 30,
                               self.width - 50)

    def update(self, dt):
        self.health_bar.health = self.health / self.total_health
Exemple #9
0
class Enemies(pg.sprite.DirtySprite):
    """Basic enemy class."""
    def __init__(self, game, player, pos, size, *groups):
        super().__init__(*groups)
        self.game = game
        self.image = pg.Surface(size).convert()
        self.image.fill(c.SILVER)
        self.rect = self.image.get_rect()
        self.rect.topleft = pos
        self.player = player
        self.health_bar = None

    def update(self, room, dt):
        self.check_if_alive(room, dt)

    def check_if_alive(self, room, dt):
        if self.health > 0:
            for health_bar in room.health_bar_container:
                health_bar.move_health_bar(dt)
            self.handle_bullet_hit(room)
        else:
            self.kill()
            room.health_bar_container.update(self.health)

    def handle_bullet_hit(self, room):
        bullet_hit = pg.sprite.spritecollide(self, room.bullet_container, True)
        for bullet in bullet_hit:
            self.health -= bullet.gun.output_damage
            bullet.kill()
            self.handle_health_bar(room)

    def handle_health_bar(self, room):
        if self.health > 0:
            self.health_bar = HealthBar(
                self, (self.health, 10),
                (self.rect.centerx, self.rect.center[1] - 30), c.RED)
            self.health_bar.rect.centerx = self.rect.centerx
            self.health_bar.add_to_group(room.health_bar_container)
            self.game.all_sprites.add(self.health_bar)
            self.health_bar.update(self.health)
Exemple #10
0
def main():
        """Main game function"""   # docstring because I keep forgetting the word

        pygame.init()      # Starts pygame

        size = (SCREENWIDTH, SCREENHEIGHT)
        screen = pygame.display.set_mode(size)  # Creates window
        pygame.display.set_caption("Through The Ages")

        # important variable
        xcoord = 0
        ycoord = 0
        speed = 8
        debug = False
        render_tile_list = pygame.sprite.Group()
        render_tree_list = pygame.sprite.Group()

        # Sprite and terrain generation

        tile_sheet = SpriteSheet("tile.png")
        tile_image = tile_sheet.get_image(0, 0, 64, 64)
        tree_sheet = SpriteSheet("plant.png")
        tree_image = tree_sheet.get_image(0, 0, 65, 155), tree_sheet.get_image(128, 289, 97, 125)
        trunk_image = tree_sheet.get_image(9, 435, 65, 155), tree_sheet.get_image(102, 469, 97, 125)
        map_size = 100
        tile_size = 64

        # Generates terrain and tree
        font = pygame.font.Font("freesansbold.ttf", 72)  # Generating Terrain
        text = font.render("Generating Terrain", 1, WHITE)
        text_width, text_height = font.size("Generating Terrain")
        screen.blit(text, ((SCREENWIDTH - text_width)/2, (SCREENHEIGHT - text_height)/2))
        pygame.display.flip()
        terrain_gen = GenTerrain(tile_size, map_size, map_size, tile_image)
        tree_gen = GenTrees(tile_size, map_size, tree_image, trunk_image, 0.1)

        tile_list = pygame.sprite.Group()  # Add sprites to sprite groups
        for i in terrain_gen.tile_list:
            tile_list.add(i)
        tree_list = pygame.sprite.Group()
        for i in tree_gen.tree_list:
            tree_list.add(i)

        # Adds player sprite
        player = Player()
        player_sprites = pygame.sprite.Group()
        player_sprites.add(player)

        weapon = Weapon(10, "Axe", weapon_axe_sheet)
        weapon_sprites = pygame.sprite.Group()
        weapon_sprites.add(weapon)

        enemy_list = pygame.sprite.Group()
        for i in range(5):
            i = Enemy(speed, enemy_sheet)
            i.rect.x = random.randint(player.rect.x, player.rect.x + tile_size*4)
            i.rect.y = random.randint(player.rect.y, player.rect.y + tile_size*4)
            enemy_list.add(i)
        print("Enemies", enemy_list)

        rand_x_pos = random.randint(tile_size, ((map_size-1)*tile_size)-SCREENWIDTH/2)
        rand_y_pos = random.randint(tile_size, ((map_size-1)*tile_size)-SCREENHEIGHT/2)
        for i in tile_list:
            i.movex(-rand_x_pos)
            i.movey(-rand_y_pos)
        for i in tree_list:
            i.movex(-rand_x_pos)
            i.movey(-rand_y_pos)

        # Creating GUI
        health_bar_back = HealthBarBack(player)
        health_bar = HealthBar(player)
        gui = GUI()
        gui_sprites = pygame.sprite.Group()
        gui_sprites.add(health_bar_back)
        gui_sprites.add(health_bar)
        gui_sprites.add(gui)


        carry_on = True  # Allowing the user to close the window...
        clock = pygame.time.Clock()

        move_sprites = (tile_list, tree_list, enemy_list)
        vulnerability = True
        vul_count = 0
        weapon_dead = False
        weapon_hit_list = []

        while carry_on:  # Main game loop
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        carry_on = False
                    if event.type == pygame.MOUSEBUTTONDOWN:
                        buttons_pressed = pygame.mouse.get_pressed()
                        if buttons_pressed[0] and not player.dead:
                            weapon.state = "attack"

                screen.fill(BLACK)  # Drawing on Screen

                # Movement code
                keys = pygame.key.get_pressed()

                vx = 0
                vy = 0
                if keys[pygame.K_w]:
                    vy = speed
                if keys[pygame.K_a]:
                    vx = speed
                if keys[pygame.K_s]:
                    vy = -speed
                if keys[pygame.K_d]:
                    vx = -speed
                """ bug with diagonal speed code causes tiles and trees to glitch and move weirdly, possibly due to rendering code?
                if vx != 0 and vy != 0:
                    vx /= 1.414
                    vy /= 1.414
                    """

                ycoord, xcoord = movexy(move_sprites, vx, vy, xcoord, ycoord)

                if keys[pygame.K_F3] and debug is False:
                    debug = True
                    pygame.time.wait(100)
                elif keys[pygame.K_F3] and debug is True:
                    debug = False
                    pygame.time.wait(100)

                pos = xcoord, ycoord

                # other keyboard and mouse input

                # rendering code for terrain
                for i in tile_list:
                    if abs(i.rect.x - player.rect.x) < (SCREENWIDTH / 2 + tile_size):
                        if abs(i.rect.y - player.rect.y) < (SCREENHEIGHT / 2 + tile_size):
                            render_tile_list.add(i)
                for i in tree_list:
                    if abs(i.rect.x - player.rect.x) < (SCREENWIDTH / 2 + tile_size * 2):
                        if abs(i.rect.y - player.rect.y) < (SCREENHEIGHT / 2 + tile_size * 2):
                            render_tree_list.add(i)

                # collision code

                """Tree Collisions"""
                tree_hit_list = pygame.sprite.spritecollide(player, render_tree_list, False, pygame.sprite.collide_mask)
                if not player.dead:
                    for _ in tree_hit_list:
                        ycoord, xcoord = movexy(move_sprites, -vx, -vy, xcoord, ycoord)

                """Enemy Collisions"""
                enemy_hit_list = pygame.sprite.spritecollide(player, enemy_list, False, pygame.sprite.collide_mask)
                for _ in enemy_hit_list:
                    if vulnerability:
                        player.health -= 10
                        vulnerability = False

                if not vulnerability:
                    vul_count += 1
                    if vul_count > 10:
                        vul_count = 0
                        vulnerability = True

                """Weapon Collisions"""
                if not player.dead:
                    weapon_hit_list = pygame.sprite.spritecollide(weapon, enemy_list, False, pygame.sprite.collide_mask)
                for enemy in weapon_hit_list:
                    if not player.dead:
                        if not enemy.vulnerability and weapon.state == "attack":
                            enemy.damaged(weapon.damage)
                            print("damaged")

                for enemy in enemy_list:
                    if enemy.dead:
                        enemy.kill()
                        enemy = "Dead"
                        print(enemy)

                # Update sprite lists
                tile_list.update()
                tree_list.update()
                player_sprites.update()
                enemy_list.update(player)
                weapon_sprites.update(player)
                gui_sprites.update(player)

                render_tile_list.draw(screen)  # Draw sprites (order matters)
                enemy_list.draw(screen)
                player_sprites.draw(screen)
                weapon_sprites.draw(screen)
                render_tree_list.draw(screen)
                gui_sprites.draw(screen)

                fps = clock.get_fps()

                # debug menu
                if debug:
                    debug_menu(fps, screen, pos, SCREENWIDTH)

                # Inventory
                add_text(10, ("Health:" + " " + str(round(player.health))), WHITE, (70, 149), screen)

                # endgame
                if player.dead:
                    text_width, text_height = text_size(72, "Game Over")
                    add_text(72, "Game Over", WHITE,
                             ((SCREENWIDTH - text_width)/2, (SCREENHEIGHT - text_height - 200)/2),
                             screen)
                    vulnerability = False
                    if not weapon_dead:
                        weapon_dead = True
                        weapon.kill()
                        weapon = None

                pygame.display.flip()  # Refresh Screen

                clock.tick(30)  # Number of frames per second e.g. 60
                render_tile_list.empty()
                render_tree_list.empty()

        pygame.quit()
Exemple #11
0
class Enemy:
    def __init__(self, x, trees):
        self.trees = trees
        self.sprite = pygame.image.load("sprites/enemy.png")
        self.width, self.height = self.sprite.get_size()
        self.y = 696 - self.height
        self.x = x
        self.speed = 200
        self.search_for_tree()
        self.health_bar = HealthBar()
        self.health = 10
        self.total_health = 10
        self.rect_head = pygame.Rect(self.x + 32, self.y, 36, self.height)
        self.rect_body = pygame.Rect(self.x, self.y + 51, self.width,
                                     self.height)
        self.sad = False
        self.chainsaw = Chainsaw()

    def search_for_tree(self):
        self.nearest_tree = None
        if self.trees:
            for tree in self.trees:
                if self.nearest_tree == None:
                    self.nearest_tree = tree
                else:
                    if abs(tree.x - self.x) < abs(self.nearest_tree.x -
                                                  self.x):
                        self.nearest_tree = tree
        else:
            return None

    def make_sad(self):
        self.health = 0
        self.sad = True
        self.sprite = pygame.image.load('sprites/enemy_sad.png')
        self.health_bar.health = 0

    def render(self, surface, camera_x):
        surface.blit(self.sprite, (self.x - camera_x, self.y))
        self.health_bar.render(surface, self.x - camera_x, self.y - 30,
                               self.width)
        self.chainsaw.render(surface, self.x - camera_x + 92, self.y + 130)

    def update(self, dt, event):
        if self.sad:
            self.x += 350 * dt
            return

        if self.nearest_tree != None:
            if self.nearest_tree.x < self.x:
                self.x -= self.speed * dt
            elif self.nearest_tree.x > self.x:
                self.x += self.speed * dt
            if abs(self.x - self.nearest_tree.x) < self.speed * dt:
                self.x = self.nearest_tree.x
                self.nearest_tree.health -= 2 * dt
                if self.nearest_tree.health < 0:
                    self.nearest_tree = None
        else:
            self.search_for_tree()
        self.health_bar.health = self.health / self.total_health

        self.rect_head = pygame.Rect(self.x + 32, self.y, 36, self.height)
        self.rect_body = pygame.Rect(self.x, self.y + 51, self.width,
                                     self.height)