Example #1
0
class Game:
    def __init__(self):
        # initialize game window, etc.
        pg.init()
        pg.mixer.init()
        self.screen = pg.display.set_mode((WIDTH, HEIGHT))
        pg.display.set_caption(TITLE)
        self.clock = pg.time.Clock()
        self.load_data()
        self.running = True

    def load_data(self):
        game_dir = path.dirname(__file__)
        img_folder = path.join(game_dir, 'img')
        terrain_img_folder = path.join(img_folder, 'terrain')
        self.title_font = path.join(img_folder, 'ZOMBIE.TTF')
        self.hud_font = path.join(img_folder, 'Impacted2.0.ttf')
        # self.img_list = []
        # for filename in listdir(terrain_img_folder):
        #     x = pg.image.load(path.join(terrain_img_folder, filename)).convert()
        #     x = pg.transform.scale(x, (TILESIZE, TILESIZE))
        #     self.img_list.append(x)
        self.water_img = pg.image.load(
            path.join(terrain_img_folder, 'water.png')).convert()
        self.water_img = pg.transform.scale(self.water_img,
                                            (TILESIZE, TILESIZE))
        self.forest_img = pg.image.load(
            path.join(terrain_img_folder, 'forest.png')).convert()
        self.forest_img = pg.transform.scale(self.forest_img,
                                             (TILESIZE, TILESIZE))
        self.mountain_img = pg.image.load(
            path.join(terrain_img_folder, 'mountain.png')).convert()
        self.mountain_img = pg.transform.scale(self.mountain_img,
                                               (TILESIZE, TILESIZE))
        self.grass_img = pg.image.load(
            path.join(terrain_img_folder, 'grass.png')).convert()
        self.grass_img = pg.transform.scale(self.grass_img,
                                            (TILESIZE, TILESIZE))
        # load the main base image
        self.main_base_img = pg.image.load(
            path.join(img_folder, 'MainBase.png')).convert_alpha()
        self.main_base_img = pg.transform.scale(self.main_base_img,
                                                (TILESIZE, TILESIZE))
        self.baracks_img = pg.image.load(path.join(
            img_folder, 'Baracks.png')).convert_alpha()
        self.baracks_img = pg.transform.scale(self.baracks_img,
                                              (TILESIZE, TILESIZE))
        self.unit_img = pg.image.load(path.join(
            img_folder, 'unit_img.png')).convert_alpha()
        self.unit_img = pg.transform.scale(self.unit_img, (TILESIZE, TILESIZE))
        self.warrior_img = pg.image.load(path.join(
            img_folder, 'Warrior.png')).convert_alpha()
        self.warrior_img = pg.transform.scale(self.warrior_img,
                                              (TILESIZE, TILESIZE))
        # create a transparent surface
        self.dim_screen = pg.Surface((TILESIZE, TILESIZE)).convert_alpha()
        self.dim_screen.fill((0, 0, 0, 80))

    def new(self):
        # start a new game
        self.all_sprites = pg.sprite.Group()
        self.tilesize = TILESIZE
        # the offset moves the camera over the board
        self.offset = BOARD_CENTER
        self.tilemap = Tilemap(self)
        self.camera = Camera(self)
        for building in self.tilemap.players[
                self.tilemap.current_player]["buildings"]:
            self.camera.apply_camera(self, building.pos)
        # self.last_time = 0
        self.mx0, self.my0, self.mx1, self.my1 = 0, 0, 0, 0
        self.mouse_pos = []
        self.enable_ui = True
        self.show_path = False
        self.tooltips = True
        self.camera_counter = 0

        # self.offset[0] = self.tilemap.unit.pos[1] * 64 - 8*64-32
        # self.offset[1] = self.tilemap.unit.pos[0] * 64 - 6*64-32
        # self.camera = Camera(self, self.tilemap.unit.pos)
        # self.offset[0] = self.camera.camera_x
        # self.offset[1] = self.camera.camera_y
        self.clicked = False
        self.right_click = False
        self.run()

    def run(self):
        # Game loop
        self.playing = True
        while self.playing:
            self.clock.tick(FPS)
            self.events()
            self.update()
            self.draw()

    def update(self):
        # Game loop - update
        # now = pg.time.get_ticks()
        # if now - self.last_time > 20:
        #     mx0, my0 = pg.mouse.get_pos()
        #     self.last_time = now
        # mx1, my1 = pg.mouse.get_pos()
        self.all_sprites.update()
        # self.camera.apply_camera(self, self.tilemap.unit.pos)
        self.tilemap.update_map(self)
        self.get_key_input()

    def get_key_input(self):
        key = pg.mouse.get_pressed()
        button = pg.key.get_pressed()
        if button[pg.K_LEFT]:
            self.offset[0] += 10
        if button[pg.K_RIGHT]:
            self.offset[0] -= 10
        if button[pg.K_UP]:
            self.offset[1] += 10
        if button[pg.K_DOWN]:
            self.offset[1] -= 10

        # enable to drag the map with the mouse
        self.mouse_pos.append(pg.mouse.get_pos())
        if len(self.mouse_pos) > 2:
            self.mx0, self.my0 = self.mouse_pos.pop(0)
            self.mx1, self.my1 = self.mouse_pos.pop(0)
        self.mouse_pos = self.mouse_pos[:3]
        if key[0]:
            self.offset[0] += self.mx1 - self.mx0
            self.offset[1] += self.my1 - self.my0

    def events(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                if self.playing:
                    self.playing = False
                self.running = False
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_ESCAPE:
                    if self.playing:
                        self.playing = False
                    self.running = False
                if event.key == pg.K_RETURN:
                    self.tilemap.next_turn()
                if event.key == pg.K_u:
                    self.enable_ui = not self.enable_ui
                if event.key == pg.K_h:
                    self.show_path = not self.show_path
                if event.key == pg.K_t:
                    self.tooltips = not self.tooltips
                if event.key == pg.K_SPACE:
                    self.show_next_unit()

            if event.type == pg.MOUSEBUTTONDOWN:
                if event.button == 1:
                    self.clicked = True

                if event.button == 3:
                    self.right_click = True

                # if event.button == 4:
                #     self.tilesize += 4
                #     if self.tilesize >= 104:
                #         self.tilesize = 104

                # if event.button == 5:
                #     self.tilesize -= 4
                #     if self.tilesize <= 36:
                #         self.tilesize = 36

    def draw(self):
        # Game loop - draw
        self.screen.fill(WHITE)
        # draw the map
        self.tilemap.draw_tilemap(self, self.screen)
        if self.enable_ui:
            self.draw_hud()
        # after drawing everything, flip the display
        pg.display.update()

    def draw_hud(self):
        pg.draw.rect(self.screen, WHITE, (0, 0, WIDTH * 4 / 8, 40))
        self.draw_building_menu()
        draw_text(self.screen, self.tilemap.current_player, self.hud_font, 25,
                  BLACK, 10, 10)
        draw_text(
            self.screen, "Money: " + str(self.tilemap.players[
                self.tilemap.current_player]['resources']['money']),
            self.hud_font, 25, BLACK, WIDTH * 1 / 8, 10)
        draw_text(
            self.screen, "Crystals: " + str(self.tilemap.players[
                self.tilemap.current_player]['resources']['crystals']),
            self.hud_font, 25, BLACK, WIDTH * 2 / 8, 10)
        pg.draw.circle(self.screen, BLACK,
                       (WIDTH * 13 // 14, HEIGHT * 12 // 13), 50, 5)
        pg.draw.circle(self.screen, LIGHTBLUE,
                       (WIDTH * 13 // 14, HEIGHT * 12 // 13), 45)
        draw_text(self.screen, "END TURN", self.hud_font, 20, BLACK,
                  WIDTH * 13 // 14 - 40, HEIGHT * 12 // 13 - 15)
        draw_button(self.screen, "QUIT", self.hud_font, 20, BLACK, YELLOW,
                    DARKYELLOW, WIDTH * 9 // 10, 10, 70, 50, quit)

    def draw_building_menu(self):
        # draw building menu
        w = WIDTH * 2 // 5
        h = HEIGHT * 1 // 6
        building_menu = pg.Surface((w, h))
        building_menu.fill(WHITE)
        for player in self.tilemap.players.keys():
            for building in self.tilemap.players[player]["buildings"]:
                if building.selected and building.type == 'main_base':
                    building_menu.blit(self.baracks_img,
                                       (w // 20, h // 15, w, h))
        pg.draw.rect(building_menu, BLUE, (0, 0, w, h), 5)
        self.screen.blit(building_menu,
                         (0, HEIGHT * 5 / 6, WIDTH * 2 / 5, HEIGHT))

    def show_start_menu(self):
        # game splash/start screen
        pass

    def show_go_screen(self):
        pass

    def show_next_unit(self):
        '''center the camera on the next unit of the current player'''
        player_units = self.tilemap.players[
            self.tilemap.current_player]['units']
        player_buildings = self.tilemap.players[
            self.tilemap.current_player]['buildings']
        if len(player_units) > 0:
            index = self.camera_counter % len(player_units)
            self.camera_counter += 1
            self.camera.apply_camera(self, player_units[index].pos)
            index = self.camera_counter % len(player_buildings)
        elif len(player_buildings) > 0:
            index = self.camera_counter % len(player_buildings)
            self.camera_counter += 1
            self.camera.apply_camera(self, player_buildings[index].pos)
        else:
            self.camera.apply_camera(self, (WIDTH // 2, HEIGHT // 2))