From ae7c7d66edc0e2bb2cc87d1fbbf9e22f12bd0bbf Mon Sep 17 00:00:00 2001 From: Miguel Angel Astor Romero Date: Tue, 22 Jan 2013 10:26:58 -0430 Subject: [PATCH] Added spawnable npcs. Fixed angle-radian convertion functions. --- actor.py | 6 +++ ingame.py | 136 ++++++++++++++++++++++++++++++++++++++++++++++++-- math_utils.py | 4 +- 3 files changed, 140 insertions(+), 6 deletions(-) diff --git a/actor.py b/actor.py index ebc9190..15b46e1 100644 --- a/actor.py +++ b/actor.py @@ -262,6 +262,7 @@ class OmnidirectionalActor(BaseActor): self.idle_frames = [] self.moving_frames = [] + self.scared_frames = [] self.current_frame = 0 def is_moving(self): @@ -355,6 +356,11 @@ class OmnidirectionalActor(BaseActor): if self.current_frame >= len(self.moving_frames): self.current_frame = len(self.moving_frames) - 1 + def toggle_scared(self): + aux = self.moving_frames + self.moving_frames = self.scared_frames + self.scared_frames = aux + def draw(self, canvas): if self.image is not None: if not self.animated: diff --git a/ingame.py b/ingame.py index 7d243a5..37459c1 100644 --- a/ingame.py +++ b/ingame.py @@ -3,6 +3,7 @@ ########################################### import math import copy +import random import pygame try: @@ -21,6 +22,8 @@ class InGameState(BaseState): def __init__(self): BaseState.__init__(self) + random.seed(None) + self.background_color = (125, 158, 192) self.next_transition = VALID_STATES['SCORE'] @@ -186,6 +189,119 @@ class InGameState(BaseState): # Append it to the explosions set. self.explosions.add(explosion) + + def create_huggable(self, position): + play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_front.png') + huggable = actor.OmnidirectionalActor(0, play_img, "Random Huggable", True) + huggable.set_fps(5) + huggable.set_angle(math_utils.ang_2_radians(float(random.randrange(-180, 180, 1)))) + huggable.set_velocity([0, 0]) + huggable.set_position(position) + huggable.set_constraints(self.constraints) + huggable.move() + + gender = random.choice([0, 1]) + if gender == 0: + # Create a male huggable. + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Idle_side.png') + huggable.add_idle_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Idle_front.png') + huggable.add_idle_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Idle_side_flipped.png') + huggable.add_idle_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Idle_back.png') + huggable.add_idle_frame(image) + + # Add moving frames. + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_1.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_2.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_front_1.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_front_2.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_1_flipped.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_2_flipped.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_back_1.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_back_2.png') + huggable.add_moving_frame(image) + + huggable.toggle_scared() + # Add scared frames. + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_1_scared.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_2_scared.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_front_1_scared.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_front_2_scared.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_1_scared_flipped.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_2_scared_flipped.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_back_1.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_back_2.png') + huggable.add_moving_frame(image) + + huggable.toggle_scared() + + else: + # Create a female huggable. + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Idle_side.png') + huggable.add_idle_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Idle_front.png') + huggable.add_idle_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Idle_side_flipped.png') + huggable.add_idle_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Idle_back.png') + huggable.add_idle_frame(image) + + # Add moving frames. + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_1.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_2.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_front_1.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_front_2.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_1_flipped.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_2_flipped.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_back_1.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_back_2.png') + huggable.add_moving_frame(image) + + huggable.toggle_scared() + # Add scared frames. + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_1_scared.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_2_scared.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_front_1_scared.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_front_2_scared.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_1_scared_flipped.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_2_scared_flipped.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_back_1.png') + huggable.add_moving_frame(image) + image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_back_2.png') + huggable.add_moving_frame(image) + + huggable.toggle_scared() + + self.npcs.add(huggable) def input(self): for event in pygame.event.get(): @@ -247,6 +363,11 @@ class InGameState(BaseState): self.player.update() self.recenter_view() + for npc in self.npcs: + npc.update() + + # TODO: Detect collisions here. + elif self.time_left < -3: # Reset everything. self.time_left = 190 @@ -275,12 +396,14 @@ class InGameState(BaseState): self.cancel = False + # Remove finished explosions removal = set() for explosion in self.explosions: if explosion.get_current_frame() == 6: removal.add(explosion) self.explosions.difference_update(removal) + # Remove invisible npcs. removal = set() for npc in self.npcs: if not npc.is_visible(): @@ -304,13 +427,18 @@ class InGameState(BaseState): self.game_area.blit(self.background, (0, 0)) # Blit everything to the bacground. + # Sort npcs by Y coordinate and draw. + # The idea is to draw npcs near the bottom edge of the screen last. + npc_list = list(self.npcs) if player.PLAYERS[1].is_alive(): - self.player.draw(self.game_area) + npc_list.append(self.player) + sorted(npc_list, key = lambda npc: npc.get_position()[1]) + for npc in npc_list: + npc.draw(self.game_area) - # Sort explosions by Y coordinate and draw. - # The idea is to draw explosion near the bottom edge of the screen last. + # Same idea here. expl_list = list(self.explosions) - sorted(expl_list, key = lambda explosion: explosion.get_position()[1], reverse = True) + sorted(expl_list, key = lambda explosion: explosion.get_position()[1]) for explosion in expl_list: explosion.draw(self.game_area) diff --git a/math_utils.py b/math_utils.py index c1925d8..e38a4cf 100644 --- a/math_utils.py +++ b/math_utils.py @@ -22,7 +22,7 @@ def angle_vectors_2D(vec1, vec2): return math.atan2(vec2[1], vec2[0]) - math.atan2(vec1[1], vec1[0]) def ang_2_radians(ang): - return ang * (180 / PI) + return (ang * PI) / 180.0 def radians_2_ang(rad): - return rad * (PI / 180) + return (rad * 180.0) / PI