From f4faa5873b514ee34be9c846011d3a466e28c618 Mon Sep 17 00:00:00 2001 From: marblexu <314299052@qq.com> Date: Sun, 17 Nov 2019 15:33:19 +0800 Subject: [PATCH] add plant panel for choosing plants --- resources/graphics/Cards/card_sunflower.png | Bin 25126 -> 13992 bytes source/component/menubar.py | 168 +++++++++++++++++--- source/constants.py | 5 + source/state/level.py | 77 +++++---- 4 files changed, 201 insertions(+), 49 deletions(-) diff --git a/resources/graphics/Cards/card_sunflower.png b/resources/graphics/Cards/card_sunflower.png index 4aea97b147edeca54baa1e6b42c937f6e34ffc64..200a3d8e08d74ef048a48602bff7cc4db2a909dc 100644 GIT binary patch literal 13992 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 N6lK-GWzwb(|344gCm#R+ diff --git a/source/component/menubar.py b/source/component/menubar.py index 3a573ee..d445817 100644 --- a/source/component/menubar.py +++ b/source/component/menubar.py @@ -4,6 +4,12 @@ import pygame as pg from .. import tool from .. import constants as c +PANEL_Y_START = 87 +PANEL_X_START = 22 +PANEL_Y_INTERNAL = 74 +PANEL_X_INTERNAL = 53 +CARD_LIST_NUM = 8 + card_name_list = [c.CARD_SUNFLOWER, c.CARD_PEASHOOTER, c.CARD_SNOWPEASHOOTER, c.CARD_WALLNUT, c.CARD_CHERRYBOMB, c.CARD_THREEPEASHOOTER, c.CARD_REPEATERPEA, c.CARD_CHOMPER, c.CARD_PUFFMUSHROOM, c.CARD_POTATOMINE, c.CARD_SQUASH] @@ -12,11 +18,26 @@ plant_name_list = [c.SUNFLOWER, c.PEASHOOTER, c.SNOWPEASHOOTER, c.WALLNUT, c.PUFFMUSHROOM, c.POTATOMINE, c.SQUASH] plant_sun_list = [50, 100, 175, 50, 150, 325, 200, 150, 0, 25, 50] plant_frozen_time_list = [0, 5000, 5000, 10000, 5000, 5000, 5000, 5000, 8000, 8000, 8000] -card_list = [0, 1, 3, 4, 7, 8, 9, 10] +all_card_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + +def getSunValueImage(sun_value): + font = pg.font.SysFont(None, 22) + width = 32 + msg_image = font.render(str(sun_value), True, c.NAVYBLUE, c.LIGHTYELLOW) + msg_rect = msg_image.get_rect() + msg_w = msg_rect.width + + image = pg.Surface([width, 17]) + x = width - msg_w + + image.fill(c.LIGHTYELLOW) + image.blit(msg_image, (x, 0), (0, 0, msg_rect.w, msg_rect.h)) + image.set_colorkey(c.BLACK) + return image class Card(): - def __init__(self, x, y, name_index): - self.loadFrame(card_name_list[name_index]) + def __init__(self, x, y, name_index, scale=0.78): + self.loadFrame(card_name_list[name_index], scale) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y @@ -25,13 +46,14 @@ class Card(): self.sun_cost = plant_sun_list[name_index] self.frozen_time = plant_frozen_time_list[name_index] self.frozen_timer = -self.frozen_time + self.select = True - def loadFrame(self, name): + def loadFrame(self, name, scale): frame = tool.GFX[name] rect = frame.get_rect() width, height = rect.w, rect.h - self.image = tool.get_image(frame, 0, 0, width, height, c.BLACK, 0.78) + self.image = tool.get_image(frame, 0, 0, width, height, c.BLACK, scale) def checkMouseClick(self, mouse_pos): x, y = mouse_pos @@ -45,6 +67,16 @@ class Card(): return True return False + def canSelect(self): + return self.select + + def setSelect(self, can_select): + self.select = can_select + if can_select: + self.image.set_alpha(255) + else: + self.image.set_alpha(128) + def setFrozenTime(self, current_time): self.frozen_timer = current_time @@ -68,7 +100,6 @@ class MenuBar(): self.sun_value = sun_value self.card_offset_x = 32 self.setupCards(card_list) - self.font = pg.font.SysFont(None, 20) def loadFrame(self, name): frame = tool.GFX[name] @@ -135,21 +166,9 @@ class MenuBar(): break def drawSunValue(self): - width = 32 - msg_image = self.font.render(str(self.sun_value), True, c.NAVYBLUE, c.LIGHTYELLOW) - msg_rect = msg_image.get_rect() - msg_w = msg_rect.width - - image = pg.Surface([width, 17]) - x = width - msg_w - - image.fill(c.LIGHTYELLOW) - image.blit(msg_image, (x, 0), (0, 0, msg_rect.w, msg_rect.h)) - image.set_colorkey(c.BLACK) - - self.value_image = image + self.value_image = getSunValueImage(self.sun_value) self.value_rect = self.value_image.get_rect() - self.value_rect.x = 18 + self.value_rect.x = 21 self.value_rect.y = self.rect.bottom - 21 self.image.blit(self.value_image, self.value_rect) @@ -158,4 +177,111 @@ class MenuBar(): self.drawSunValue() surface.blit(self.image, self.rect) for card in self.card_list: - card.draw(surface) \ No newline at end of file + card.draw(surface) + +class Panel(): + def __init__(self, card_list, sun_value): + self.loadImages(sun_value) + self.selected_cards = [] + self.selected_num = 0 + self.setupCards(card_list) + + def loadFrame(self, name): + frame = tool.GFX[name] + rect = frame.get_rect() + frame_rect = (rect.x, rect.y, rect.w, rect.h) + + return tool.get_image(tool.GFX[name], *frame_rect, c.WHITE, 1) + + def loadImages(self, sun_value): + self.menu_image = self.loadFrame(c.MENUBAR_BACKGROUND) + self.menu_rect = self.menu_image.get_rect() + self.menu_rect.x = 0 + self.menu_rect.y = 0 + + self.panel_image = self.loadFrame(c.PANEL_BACKGROUND) + self.panel_rect = self.panel_image.get_rect() + self.panel_rect.x = 0 + self.panel_rect.y = PANEL_Y_START + + + self.value_image = getSunValueImage(sun_value) + self.value_rect = self.value_image.get_rect() + self.value_rect.x = 21 + self.value_rect.y = self.menu_rect.bottom - 21 + + self.button_image = self.loadFrame(c.START_BUTTON) + self.button_rect = self.button_image.get_rect() + self.button_rect.x = 155 + self.button_rect.y = 547 + + def setupCards(self, card_list): + self.card_list = [] + x = PANEL_X_START - PANEL_X_INTERNAL + y = PANEL_Y_START + 43 - PANEL_Y_INTERNAL + for i, index in enumerate(card_list): + if i % 8 == 0: + x = PANEL_X_START - PANEL_X_INTERNAL + y += PANEL_Y_INTERNAL + x += PANEL_X_INTERNAL + self.card_list.append(Card(x, y, index, 0.75)) + + def checkCardClick(self, mouse_pos): + delete_card = None + for card in self.selected_cards: + if delete_card: # when delete a card, move right cards to left + card.rect.x -= 55 + elif card.checkMouseClick(mouse_pos): + self.deleteCard(card.name_index) + delete_card = card + + if delete_card: + self.selected_cards.remove(delete_card) + self.selected_num -= 1 + + if self.selected_num == CARD_LIST_NUM: + return + + for card in self.card_list: + if card.checkMouseClick(mouse_pos): + if card.canSelect(): + self.addCard(card) + break + + def addCard(self, card): + card.setSelect(False) + y = 8 + x = 78 + self.selected_num * 55 + self.selected_cards.append(Card(x, y, card.name_index)) + self.selected_num += 1 + + def deleteCard(self, index): + self.card_list[index].setSelect(True) + + def checkStartButtonClick(self, mouse_pos): + if self.selected_num < CARD_LIST_NUM: + return False + + x, y = mouse_pos + if (x >= self.button_rect.x and x <= self.button_rect.right and + y >= self.button_rect.y and y <= self.button_rect.bottom): + return True + return False + + def getSelectedCards(self): + card_index_list = [] + for card in self.selected_cards: + card_index_list.append(card.name_index) + return card_index_list + + def draw(self, surface): + self.menu_image.blit(self.value_image, self.value_rect) + surface.blit(self.menu_image, self.menu_rect) + surface.blit(self.panel_image, self.panel_rect) + for card in self.card_list: + card.draw(surface) + for card in self.selected_cards: + card.draw(surface) + + if self.selected_num == CARD_LIST_NUM: + surface.blit(self.button_image, self.button_rect) \ No newline at end of file diff --git a/source/constants.py b/source/constants.py index 850dab7..b55b9a6 100644 --- a/source/constants.py +++ b/source/constants.py @@ -57,6 +57,8 @@ MAP_OFFSET_Y = 100 #MENUBAR MENUBAR_BACKGROUND = 'ChooserBackground' +PANEL_BACKGROUND = 'PanelBackground' +START_BUTTON = 'StartButton' #PLANT INFO PLANT_IMAGE_RECT = 'plant_image_rect' @@ -140,3 +142,6 @@ DIGEST = 'digest' WALK = 'walk' DIE = 'die' +#LEVEL STATE +CHOOSE = 'choose' +PLAY = 'play' diff --git a/source/state/level.py b/source/state/level.py index 855484c..0e67dc7 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -19,21 +19,10 @@ class Level(tool.State): self.map = map.Map(c.GRID_X_LEN, self.map_y_len) self.loadMap() - - self.menubar = menubar.MenuBar(menubar.card_list, self.map_data[c.INIT_SUN_NAME]) - self.drag_plant = False - self.hint_image = None - self.hint_plant = False - - self.produce_sun = True - self.sun_timer = current_time - - self.removeMouseImage() + self.state = c.CHOOSE + self.initChoose() self.setupBackground() - self.setupGroups() - self.setupZombies() - self.setupCars() - + def loadMap(self): map_file = 'level_' + str(self.game_info[c.LEVEL_NUM]) + '.json' file_path = os.path.join('source', 'data', 'map', map_file) @@ -80,7 +69,37 @@ class Level(tool.State): def update(self, surface, current_time, mouse_pos, mouse_click): self.current_time = self.game_info[c.CURRENT_TIME] = current_time - + if self.state == c.CHOOSE: + self.choose(mouse_pos, mouse_click) + elif self.state == c.PLAY: + self.play(mouse_pos, mouse_click) + + self.draw(surface) + + def initChoose(self): + self.panel = menubar.Panel(menubar.all_card_list, self.map_data[c.INIT_SUN_NAME]) + + def choose(self, mouse_pos, mouse_click): + if mouse_pos and mouse_click[0]: + self.panel.checkCardClick(mouse_pos) + if self.panel.checkStartButtonClick(mouse_pos): + self.state = c.PLAY + self.initPlay(self.panel.getSelectedCards()) + + def initPlay(self, card_list): + self.menubar = menubar.MenuBar(card_list, self.map_data[c.INIT_SUN_NAME]) + self.drag_plant = False + self.hint_image = None + self.hint_plant = False + self.produce_sun = True + self.sun_timer = self.current_time + + self.removeMouseImage() + self.setupGroups() + self.setupZombies() + self.setupCars() + + def play(self, mouse_pos, mouse_click): if self.zombie_start_time == 0: self.zombie_start_time = self.current_time elif len(self.zombie_list) > 0: @@ -132,8 +151,7 @@ class Level(tool.State): self.checkPlants() self.checkCarCollisions() self.checkGameState() - self.draw(surface) - + def createZombie(self, name, map_y): x, y = self.map.getMapGridPos(0, map_y) if name == c.NORMAL_ZOMBIE: @@ -370,15 +388,18 @@ class Level(tool.State): def draw(self, surface): self.level.blit(self.background, self.viewport, self.viewport) surface.blit(self.level, (0,0), self.viewport) - self.menubar.draw(surface) - for i in range(self.map_y_len): - self.plant_groups[i].draw(surface) - self.zombie_groups[i].draw(surface) - self.bullet_groups[i].draw(surface) - for car in self.cars: - car.draw(surface) - self.head_group.draw(surface) - self.sun_group.draw(surface) + if self.state == c.CHOOSE: + self.panel.draw(surface) + elif self.state == c.PLAY: + self.menubar.draw(surface) + for i in range(self.map_y_len): + self.plant_groups[i].draw(surface) + self.zombie_groups[i].draw(surface) + self.bullet_groups[i].draw(surface) + for car in self.cars: + car.draw(surface) + self.head_group.draw(surface) + self.sun_group.draw(surface) - if self.drag_plant: - self.drawMouseShow(surface) \ No newline at end of file + if self.drag_plant: + self.drawMouseShow(surface) \ No newline at end of file