class Galho: def __init__(self, lado, x, y): image_paths = ('sprite/galhos/galhodireitanew.png', 'sprite/galhos/galhoesquerdanew.png', 'sprite/galhos/semgalho.png') self.texture = GameImage(image_paths[lado]) self.lado = lado self.texture.set_position(x, y) def set_position(self, x, y): self.texture.set_position(x, y) def get_lado(self): return self.lado def draw(self): self.texture.draw() def draw_rotated(self, angle): self.texture.draw_rotated(angle) def get_x(self): return self.texture.x def get_y(self): return self.texture.y
class SpecialHud: def __init__(self): self.bar = GameImage(SPECIAL_HUD) self.bar.set_position(4, 76) self.value = Sprite(*SPECIAL_POINTS) self.value.set_position(-6, 65) self.value.set_curr_frame(0) def draw(self): self.bar.draw() self.value.draw() def addSpecial(self): point = self.value.curr_frame + 1 self.value.set_curr_frame(self.__checkLife(point)) def loseSpecial(self): self.value.set_curr_frame(0) def current_special(self): return self.value.curr_frame def __checkLife(self, point): if point < 0: return 0 elif point > 4: return 4 else: return point
class ButtonClick(Button): def __init__(self, button_image, window, x, y): super().__init__(window, x, y, "") self.button = GameImage(button_image) self.button.set_position(x - self.button.width / 2, y - self.button.height / 2) def draw(self): self.button.draw() self.update() def is_button_pressed(self): if self.is_button_press: self.is_button_press = False BUTTON_SOUND.play() return True return False def update(self): self.debug_time -= self.window.delta_time() if self.mouse.is_over_object(self.button): if not self.mouse.is_button_pressed(self.mouse.BUTTON_LEFT): self.is_button_press = False elif self.debug_time <= 0: self.debug_time = 1 self.is_button_press = True
class Snowflake: flakeImage = ('sprite/scenario/flakeL.png', 'sprite/scenario/flakeR.png') endOfScreen = False # Checks if snowflake is at end of screen global startSpeed changeY = startSpeed # Snowflake speed def __init__(self, y, pos): self.pos = pos # left or right self.y = y # y coordinate if pos == "left": self.type = 0 else: self.type = 1 # Retrieves snowflake image self.texture = GameImage(self.flakeImage[self.type]) self.set_position() # Changes position def set_position(self): if self.pos == "left": self.texture.set_position(flakeDist, self.y) else: self.texture.set_position(-flakeDist, self.y) # Displays snowflake def paint(self): self.set_position() self.texture.draw() # Moves snowflake def move(self, snowmanPos): newY = self.y + self.changeY lowerBound = newY + branchHeight # y coordinate for bottom of flake bottomOfSnowman = snowmanY + snowmanH # y value for bottom of snowman # New flake would be in snowmans space if lowerBound > snowmanY and newY < bottomOfSnowman \ and snowmanPos == self.pos: # Gain points and health by catching snowflakes scorer.snowflake_calc() # This allows us to delete snowflake later self.endOfScreen = True elif (lowerBound > sHeight): # Snowflake reaches end of screen self.endOfScreen = True else: # Snowflake moves down self.y += self.changeY self.paint()
def show_lives(self): life = GameImage("images/life.png") life.set_position(78, 170) life.draw() text = "LIFE:{}".format(self.lives) # text_space = len(text) * 14 self.window.draw_text(text=text, x=60, y=245, size=24, color=(200, 200, 200), font_name="Monospace", bold=True)
class LifeHud: def __init__(self, bar_x=4, bar_y=0, life_hud=LIFE_HUD, life_points=LIFE_POINTS): self.bar = GameImage(life_hud) self.bar.set_position(bar_x, bar_y) self.value = Sprite(*life_points) self.value.set_position(bar_x - 10, bar_y - 10) self.value.set_curr_frame(4) def draw(self): self.bar.draw() self.value.draw() def add_life(self): point = self.value.curr_frame + 1 self.value.set_curr_frame(self.__checkLife(point)) def full_life(self): self.value.set_curr_frame(4) def lose_life(self): point = self.value.curr_frame - 1 if point >= 0: self.value.set_curr_frame(self.__checkLife(point)) return point def is_empty_life(self): return self.value.curr_frame == 0 def empty_life(self): self.value.set_curr_frame(0) def __checkLife(self, point): if point < 0: return 0 elif point > 4: return 4 else: return point def move(self, x, y): self.bar.set_position(x, y) self.value.set_position(x - 10, y - 10)
class TimeHud: def __init__(self, window): self.window = window self.bar = GameImage(TIME_HUD) self.bar.set_position(self.window.width / 2 - self.bar.width / 2, 6) self.time = TIME def draw(self): self.bar.draw() self.time = self.time - self.window.delta_time() seconds = self.time if int(seconds) == 0: self.window.main_scene.change_scene('City') text = CenterText(self.window, self.window.width / 2, 46, text=int(seconds)) text.draw()
class Botao: def __init__(self, popup, janela, nome_image, mult_y, add_y, mult_x, add_x): self.janela = janela self.popup = popup self.objeto = GameImage(nome_image) self.largura = self.objeto.width self.altura = self.objeto.height self.x = self.janela.width / 2 - popup.largura / 2 + mult_x * self.largura + add_x self.y = self.janela.height / 2 - popup.altura / 2 + mult_y * self.altura + add_y self.objeto.set_position(self.x, self.y) def draw(self): self.objeto.draw() def is_clicked(self, mouse): mouse_p = mouse.get_position() if (self.x <= mouse_p[0] <= self.x + self.largura and self.y + self.altura >= mouse_p[1] >= self.y and mouse.is_button_pressed(1)): return True
class MenuHud: def __init__(self, window): self.window = window self.button = GameImage(PAUSE_HUD) self.button.set_position(self.window.width - self.button.width - 10, self.window.height - 130) self.points = 0 self.menu_screen = GameImage(PAUSE_SCREEN) self.menu_screen.set_position( self.window.width / 2 - self.menu_screen.width / 2, 85) self.menu_button = Button(self.window, self.window.width / 2, 320, "MENU") self.return_button = Button(self.window, self.window.width / 2, 500, "VOLTAR") self.show_menu = False def draw(self): self.button.draw() if self.show_menu: self.menu_screen.draw() self.menu_button.draw() self.return_button.draw() def update(self): if self.window.get_mouse().is_button_pressed( 1) and self.window.get_mouse().is_over_object(self.button): BUTTON_SOUND.play() self.window.main_scene.running = False self.show_menu = True elif self.window.get_keyboard().key_pressed( "ESCAPE") or self.return_button.is_button_pressed(): self.window.main_scene.running = True self.show_menu = False elif self.menu_button.is_button_pressed(): self.window.main_scene.running = True self.show_menu = False self.window.main_scene.change_scene()
class PointHud: def __init__(self, window): self.window = window self.bar = GameImage(POINTS_HUD) self.bar.set_position(self.window.width - self.bar.width, 0) self.points = 0 def draw(self): self.bar.draw() text = CenterText(self.window, self.window.width - self.bar.width / 2 - 8, 40, text=self.points) text.draw() def addPoint(self, amount): self.points += amount def get_point(self): return self.points def remove_point(self, amount: int): self.points -= amount
class Button: def __init__(self, window, x, y, text): self.window = window self.mouse = window.get_mouse() self.button = GameImage(NORMAL_BUTTON) self.button.set_position(x - self.button.width / 2, y - self.button.height / 2) self.is_normal = True self.is_button_press = False self.debug_time = 0 self.x = x - self.button.width / 2 self.y = y - self.button.height / 2 self.text_str = text def draw(self): self.button.draw() color = NEAR_BLACK if self.mouse.is_over_object(self.button): color = ORANGE text = CenterText(self.window, self.x + self.button.width / 2, self.y + self.button.height / 2, color=color, size=80, text=self.text_str) text.draw() self.update() def is_button_pressed(self): if self.is_button_press: self.is_button_press = False BUTTON_SOUND.play() return True return False def update(self): self.debug_time -= self.window.delta_time() if self.mouse.is_over_object(self.button): if not self.mouse.is_button_pressed(self.mouse.BUTTON_LEFT): self.button = GameImage(HOVER_BUTTON) self.button.set_position(self.x, self.y) self.is_normal = False self.is_button_press = False elif self.debug_time <= 0: self.debug_time = 1 self.is_button_press = True self.is_normal = False elif not self.is_normal: self.button = GameImage(NORMAL_BUTTON) self.button.set_position(self.x, self.y) self.is_normal = True self.is_button_press = False
class Popup: def __init__(self, janela): self.janela = janela self.objeto = GameImage(Popup_Images.inventario['fundo']) # popup(1) -> inventário # popup(2) -> prontuario def set_popup(self, tipo, soldado): self.tipo = tipo if (self.tipo == 1): self.texto = None self.objeto = GameImage(Popup_Images.inventario['fundo']) self.largura = self.objeto.width self.altura = self.objeto.height self.objeto.set_position( (self.janela.width / 2 - self.largura / 2), self.janela.height / 2 - self.altura / 2) self.bt_repor = Botao(self, self.janela, Popup_Images.inventario['bt_repor'], 2, 0, 0, 10) self.bt_dormir = Botao(self, self.janela, Popup_Images.inventario['bt_dormir'], 3, 1, 0, 10) self.bt_comer = Botao(self, self.janela, Popup_Images.inventario['bt_comer'], 4, 2, 0, 10) self.bt_ok = None self.bt_cancelar = None if (self.tipo == 2): self.texto = str(soldado.prontuario) self.objeto = GameImage(Popup_Images.prontuario['fundo']) self.largura = self.objeto.width self.altura = self.objeto.height self.objeto.set_position( (self.janela.width / 2 - self.largura / 2), self.janela.height / 2 - self.altura / 2) self.bt_ok = Botao(self, self.janela, Popup_Images.prontuario['bt_ok'], 13, 0, 0.5, 0) self.bt_cancelar = Botao(self, self.janela, Popup_Images.prontuario['bt_cancelar'], 14, 1, 0.5, 0) self.bt_repor = None self.bt_dormir = None self.bt_comer = None if (self.tipo == 0): self.texto = "" self.objeto = GameImage(Popup_Images.start['fundo']) self.largura = self.objeto.width self.altura = self.objeto.height self.objeto.set_position( (self.janela.width / 2 - self.largura / 2), self.janela.height / 2 - self.altura / 2) self.bt_ok = Botao(self, self.janela, Popup_Images.prontuario['bt_ok'], 10, 0, 0.7, 0) self.bt_cancelar = Botao(self, self.janela, Popup_Images.prontuario['bt_cancelar'], 13, 0, 0.7, 0) self.bt_repor = None self.bt_dormir = None self.bt_comer = None def draw(self): self.objeto.draw() self.janela.draw_text(self.texto, self.janela.width / 2 - self.largura / 2 + self.texto.__sizeof__() * 2, self.janela.height / 2 - self.altura / 4 + 40, size=20, color=(0, 0, 0), bold=True) if (self.tipo == 1): self.bt_repor.draw() self.bt_dormir.draw() self.bt_comer.draw() elif (self.tipo == 2 or self.tipo == 0): self.bt_cancelar.draw() self.bt_ok.draw() def bt_clicked(self): mouse = self.janela.get_mouse() if (self.tipo == 1): if self.bt_comer.is_clicked(mouse): return 3 if self.bt_dormir.is_clicked(mouse): return 2 if self.bt_repor.is_clicked(mouse): return 1 elif (self.tipo == 2 or self.tipo == 0): if self.bt_cancelar.is_clicked(mouse): return 0 if self.bt_ok.is_clicked(mouse): return 4 return 0
class SelectPlaneScene(SceneInterface): def __init__(self, hud: HudManager): self.hud = hud self.window = hud.get_window() self.mouse = hud.get_window().get_mouse() self.fundo = GameImage(BACKGROUND_HOME) self.time = 0 self.select = False points_background = pygame.transform.scale( GameImage(SOUND_BACKGROUND).image, (1100, 800)) self.point_background = GameImage(SOUND_BACKGROUND) self.point_background.image = points_background self.point_background.set_position( self.window.width / 2 - points_background.get_width() / 2, 0) self.text = CenterText(hud.get_window(), WIDTH_DIV, 300, text="Escolha qual será sua próxima nave") self.jet_g_bool = False self.jet_green = Sprite(*JET_GREEN_FLY) self.jet_green.set_position( WIDTH_DIV - WIDTH_DIV / 2 - self.jet_green.width + 200, 350) self.jet_y_bool = False self.jet_yellow = Sprite(*JET_YELLOW_FLY) self.jet_yellow.set_position(WIDTH_DIV + WIDTH_DIV / 2 - 200, 350) def handle_event(self, speed: int, scene: bool): if self.mouse.is_over_object(self.jet_green): self.jet_g_bool = True self.jet_y_bool = False if self.mouse.is_button_pressed(mouse.BUTTON_LEFT): self.hud.set_ship_look(JET_GREEN_FLY) self.select = True elif self.mouse.is_over_object(self.jet_yellow): self.jet_y_bool = True self.jet_g_bool = False if self.mouse.is_button_pressed(mouse.BUTTON_LEFT): self.hud.set_ship_look(JET_YELLOW_FLY) self.select = True else: self.time = 2 self.jet_g_bool = False self.jet_y_bool = False def __draw_jet(self, jet: Sprite, enabled: bool): if enabled: if self.time >= 0.0: self.time -= self.window.delta_time() if 1.7 <= self.time <= 2.0: jet.draw() elif 1.1 <= self.time <= 1.4: jet.draw() elif 0.5 <= self.time <= 0.8: jet.draw() elif self.time <= 0.0: jet.draw() else: jet.draw() def draw(self, state: bool): self.fundo.draw() self.point_background.draw() self.__draw_jet(self.jet_yellow, self.jet_y_bool) self.__draw_jet(self.jet_green, self.jet_g_bool) self.text.draw() def update(self, state: bool): if self.select: self.window.main_scene.change_scene('Desert')
def draw_sprite(self, sprite: GameImage, position: Vec): sx, sy = self.get_screen_position(*position) sprite.set_position(sx, sy) sprite.draw()
class ShopHud: def __init__(self, window): self.window = window self.mouse = window.get_mouse() self.button = GameImage(SHOP_HUD) self.button.set_position(10, self.window.height - 130) self.shop_screen = GameImage(SHOP_SCREEN) self.shop_screen.set_position( self.window.width / 2 - self.shop_screen.width / 2, 85) self.blue_fire_shop = GameImage(BLUE_FIRE_SHOP) self.blue_fire_shop.set_position( self.window.width / 2 - self.shop_screen.width / 2, 140) self.blue_fire_shop_b = GameImage(BLUE_FIRE_SHOP_B) self.blue_fire_shop_b.set_position( self.window.width / 2 - self.shop_screen.width / 2, 140) self.blue_text = CenterText(self.window, self.window.width / 2 + 20, 294, color=SKY_BLUE, size=46, text="10 C") self.pink_fire_shop = GameImage(PINK_FIRE_SHOP) self.pink_fire_shop.set_position( self.window.width / 2 - self.shop_screen.width / 2, 140) self.pink_fire_shop_b = GameImage(PINK_FIRE_SHOP_B) self.pink_fire_shop_b.set_position( self.window.width / 2 - self.shop_screen.width / 2, 140) self.pink_text = CenterText(self.window, self.window.width / 2 + 20, 370, color=PURPLE, size=46, text="10 C") self.torpedo_shop = GameImage(TORPEDO_SHOP) self.torpedo_shop.set_position( self.window.width / 2 - self.shop_screen.width / 2, 140) self.torpedo_shop_b = GameImage(TORPEDO_SHOP_B) self.torpedo_shop_b.set_position( self.window.width / 2 - self.shop_screen.width / 2, 140) self.torpedo_text = CenterText(self.window, self.window.width / 2 + 20, 446, color=FOREST_GREEN, size=46, text="10 C") self.torpedo_black_shop = GameImage(TORPEDO_BLACK_SHOP) self.torpedo_black_shop.set_position( self.window.width / 2 - self.shop_screen.width / 2, 140) self.torpedo_black_shop_b = GameImage(TORPEDO_BLACK_SHOP_B) self.torpedo_black_shop_b.set_position( self.window.width / 2 - self.shop_screen.width / 2, 140) self.torpedo_black_text = CenterText(self.window, self.window.width / 2 + 20, 522, color=BLACK, size=46, text="10 C") self.choose_skin = [True, False, False, False] self.time_delay = 0 self.points = 0 self.show_shop = False def draw_shop(self): if self.choose_skin[0]: self.blue_fire_shop_b.draw() self.pink_fire_shop.draw() self.torpedo_shop.draw() self.torpedo_black_shop.draw() elif self.choose_skin[1]: self.blue_fire_shop.draw() self.pink_fire_shop_b.draw() self.torpedo_shop.draw() self.torpedo_black_shop.draw() elif self.choose_skin[2]: self.blue_fire_shop.draw() self.pink_fire_shop.draw() self.torpedo_shop_b.draw() self.torpedo_black_shop.draw() elif self.choose_skin[3]: self.blue_fire_shop.draw() self.pink_fire_shop.draw() self.torpedo_shop.draw() self.torpedo_black_shop_b.draw() self.blue_text.draw() self.pink_text.draw() self.torpedo_text.draw() self.torpedo_black_text.draw() def draw(self): self.button.draw() if self.show_shop: self.shop_screen.draw() self.draw_shop() def update(self): if self.__is_clicking(self.button): BUTTON_SOUND.play() self.window.main_scene.running = not self.window.main_scene.running self.show_shop = not self.show_shop elif self.window.get_keyboard().key_pressed("ESCAPE"): self.window.main_scene.running = True self.show_shop = False elif self.__is_clicking_shop(0): if self.window.main_scene.get_hud().set_special_look(0): self.choose_skin = [True, False, False, False] elif self.__is_clicking_shop(1): if self.window.main_scene.get_hud().set_special_look(1): self.choose_skin = [False, True, False, False] elif self.__is_clicking_shop(2): if self.window.main_scene.get_hud().set_special_look(2): self.choose_skin = [False, False, True, False] elif self.__is_clicking_shop(3): if self.window.main_scene.get_hud().set_special_look(3): self.choose_skin = [False, False, False, True] def __is_clicking(self, button: GameImage): self.time_delay -= self.window.delta_time() if self.mouse.is_over_object(button) and self.mouse.is_button_pressed( self.mouse.BUTTON_LEFT): if self.time_delay <= 0: self.time_delay = 0.5 return True return False def __is_clicking_shop(self, pos: int): if self.choose_skin[pos]: return False if pos == 0: if self.mouse.is_over_area( (480, 250), (800, 330)) and self.mouse.is_button_pressed( self.mouse.BUTTON_LEFT): return True elif pos == 1: if self.mouse.is_over_area( (480, 331), (800, 410)) and self.mouse.is_button_pressed( self.mouse.BUTTON_LEFT): return True elif pos == 2: if self.mouse.is_over_area( (480, 411), (800, 480)) and self.mouse.is_button_pressed( self.mouse.BUTTON_LEFT): return True else: if self.mouse.is_over_area( (480, 481), (800, 560)) and self.mouse.is_button_pressed( self.mouse.BUTTON_LEFT): return True return False
class BattleSceneFirst(SceneInterface): def __init__(self, hud: HudManager): self.hud = hud self.window = hud.get_window() self.key_board = hud.get_window().get_keyboard() self.background = BackgroundModel(BACKGROUND_BATTLE1) self.air_plane = AirPlaneModel(shoot=self.hud.get_special_look(), sprite=self.hud.get_ship_look()) self.enemy_plane = EnemyAirPlaneModel(*ENEMY_PLANE_FIRST_POSITION) self.coin = CoinModel() self.life = LifeModel(WIDTH_SCREEN, HEIGHT_SCREEN / 2, True) self.special = SpecialModel(WIDTH_SCREEN / 2, HEIGHT_SCREEN / 2, True) self.point = 0 points_background = pygame.transform.scale( GameImage(SOUND_BACKGROUND).image, (250, 90)) self.point_background = GameImage(SOUND_BACKGROUND) self.point_background.image = points_background self.point_background.set_position( self.window.width / 2 - points_background.get_width() / 2, -15) self.shot_time = 0.0 self.game_objects = [ self.background, self.enemy_plane, self.air_plane, self.coin, self.life, self.special, self.air_plane.get_shot(), self.air_plane.get_shot_special(), self.enemy_plane.get_shot() ] self.enemys = [self.enemy_plane] self.enemy_shot_times = [0.0] def handle_event(self, speed, state): if not state: return self.shot_time -= self.hud.get_window().delta_time() for i in range(len(self.enemys)): self.enemy_shot_times[i] -= self.hud.get_window().delta_time() if self.air_plane.get_shot().collide(self.enemys[i]): self.point += 1 if self.point % 4 == 0: self.special.change_visibility(self.enemys[i].animation.x, self.enemys[i].animation.y) if self.point % 5 == 0: self.life.change_visibility(self.enemys[i].animation.x, self.enemys[i].animation.y) if (self.enemys[i].lifeModel.lose_life()) == 0: self.enemys[i].hidden() if self.air_plane.get_shot_special().collide(self.enemys[i]): self.point += 3 self.enemys[i].lifeModel.empty_life() self.enemys[i].hidden() if self.enemys[i].get_shot().collide(self.air_plane): self.hud.lose_life() if self.enemy_shot_times[i] <= 0.0: self.enemys[i].can_shot(self.air_plane) self.enemy_shot_times[i] = 2 if self.key_board.key_pressed("UP"): # Direcional ^ self.air_plane.up(speed * 2) if self.key_board.key_pressed("DOWN"): self.air_plane.down(speed * 2) if self.key_board.key_pressed("RIGHT"): self.air_plane.forward(speed * 2) if self.key_board.key_pressed("LEFT"): self.air_plane.backward(speed * 2) if self.shot_time <= 0.0: if self.key_board.key_pressed("SPACE"): self.air_plane.shot() self.shot_time = 1 if self.key_board.key_pressed("S") and self.hud.get_special() >= 4: self.hud.lose_special() self.air_plane.shot_special() for game_object in self.game_objects: game_object.move(speed) if self.coin.collide(self.air_plane): self.hud.point.addPoint(1) if self.life.collide(self.air_plane): self.life.change_visibility() self.hud.add_life() if self.special.collide(self.air_plane): self.special.change_visibility() self.hud.add_special() def draw(self, state): for game_object in self.game_objects: game_object.draw() for enemy in self.enemys: enemy.get_life().draw() self.hud.draw() self.point_background.draw() CenterText(self.hud.get_window(), self.hud.get_window().width / 2, 30, GOLD, 64, "Pontos " + str(self.point)).draw() def update(self, state): if not state: return if self.point >= POINTS: self.hud.get_window().main_scene.change_scene('SecondHistory') for game_object in self.game_objects: game_object.update()
class Branches: global startSpeed changeY = startSpeed # Speed at which branch moves down direction = "up" #Determines whether speed increases or decreases over time # Images for branches tree_types = ('sprite/branches/right.png', 'sprite/branches/left.png', 'sprite/branches/middle.png') endOfScreen = False # Records if branch has reached end of screen def __init__(self, y, pos): self.y = y # y-coordinate (distance from top of screen) self.pos = pos if pos == "left": # branch 'left' to tree self.type = 1 elif pos == "right": # branch 'right' to tree self.type = 0 else: self.type = 2 # no branch if position is 'middle' # Assigns an image to each object self.texture = GameImage(self.tree_types[self.type]) self.texture.set_position(0, self.y) # Change position of object def set_position(self, x, y): self.texture.set_position(x, y) # Display branch def paint(self): self.set_position(0, self.y) self.texture.draw() # Move branch def move(self, snowmanPos): global game_state # Finds new y value (which defines top of branch) newY = self.y + self.changeY lowerBound = newY + branchHeight # y coordinate for bottom of branch bottomOfSnowman = snowmanY + snowmanH # y value for bottom of snowman if lowerBound > snowmanY and newY < bottomOfSnowman \ and snowmanPos == self.pos: # New branch would be in snowmans space (snowman hits branch) game_state = 0 # Game over gameEnd.play() # Play sound effect # Branch reaches end of screen so starts at top again elif (newY > sHeight): # Useful for objects of type 'middle' which create tree self.y = -64 self.paint() # Useful for other objects which are actual branches self.endOfScreen = True else: # Branch moves down self.y += self.changeY self.paint()