コード例 #1
0
    def create_new_enemy(self, position):
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Idle_front.png')
       enemy = actor.OmnidirectionalActor(0, play_img, "Random Enemy", True)
       enemy.set_fps(5)
       enemy.set_velocity([0, 0])
       enemy.set_acceleration_fraction(0.5)
       enemy.set_position(position)
       enemy.set_constraints(self.constraints)
       enemy.set_rotate_on_constraint(True)
       enemy.move()

       # Create a male enemy.
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Idle_side.png')
       enemy.add_idle_frame(image)
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Idle_front.png')
       enemy.add_idle_frame(image)
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Idle_side_flipped.png')
       enemy.add_idle_frame(image)
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Idle_back.png')
       enemy.add_idle_frame(image)

       # Add moving frames.
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Walking_side_1.png')
       enemy.add_moving_frame(image)
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Walking_side_2.png')
       enemy.add_moving_frame(image)
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Walking_front_1.png')
       enemy.add_moving_frame(image)
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Walking_front_2.png')
       enemy.add_moving_frame(image)
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Walking_side_1_flipped.png')
       enemy.add_moving_frame(image)
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Walking_side_2_flipped.png')
       enemy.add_moving_frame(image)
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Walking_back_1.png')
       enemy.add_moving_frame(image)
       image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/ForeverAlone/Walking_back_2.png')
       enemy.add_moving_frame(image)

       # Move in the direction of the player.
       p_pos = self.player.get_position()
       vec_2 = (float(p_pos[0] - position[0]), float(p_pos[1] - position[1]))
       vec_2 = math_utils.normalize_vector_2D(vec_2)
       enemy.set_angle(math_utils.angle_vectors_2D(self.vec_1, vec_2))

       self.enemies.add(enemy)
       audio.cached_audio_manager.play_sound('sfx/amiguito.wav')
コード例 #2
0
    def update(self):
       if self.next_transition != VALID_STATES['QUIT']:
          if self.next_transition != VALID_STATES['STAY']:
             self.next_transition = VALID_STATES['STAY']
             self.player.reset_then()
             self.then = pygame.time.get_ticks()
             # Start the huggable creation timer.
             pygame.time.set_timer(pygame.USEREVENT + 1, 1000)
             # Start the huggable angle change event.
             pygame.time.set_timer(pygame.USEREVENT + 2, 2000)
             # Start the enemy creation timer.
             pygame.time.set_timer(pygame.USEREVENT + 3, 3000)

             mixer.music.load('music/8-Bit_Easter/01-DANJYON KIMURA-TELEPORTER.mp3')
             mixer.music.play(-1)

          if self.cancel and self.time_left > 0:
             # If the player pressed escape, force a timeout.
             self.time_left = 0

          now = pygame.time.get_ticks()
          delta_t = now - self.then
          if delta_t >= 1000:
             self.time_left -= delta_t // 1000
             self.then = now

          if self.time_left <= 0 and player.PLAYERS[1].is_alive():
             player.PLAYERS[1].kill()
             self.done = True
             self.create_explosion(self.player.get_position())
             audio.cached_audio_manager.play_sound('sfx/Explo_4.wav')

          if not self.done:
             if self.cursor_x != self.screen_center[0] or self.cursor_y != self.screen_center[1]:
                vec_2 = (float(self.cursor_x) - float(self.screen_center[0]), float(self.cursor_y) - float(self.screen_center[1]))
                vec_2 = math_utils.normalize_vector_2D(vec_2)
                self.player.set_angle(math_utils.angle_vectors_2D(self.vec_1, vec_2))

             self.player.update()
             self.recenter_view()

             # Create new huggables.
             if self.create_huggable:
                for spawner in self.spawners:
                   if len(self.npcs) >= self.max_npc:
                      # If we reached the maximum number of npcs, cancel the timer and ignore the rest of the spawners.
                      pygame.time.set_timer(pygame.USEREVENT + 1, 0)
                      break
                   else:
                      chance = random.randrange(100)
                      if chance < 20:
                         self.create_new_huggable(spawner.get_position())
                         self.create_explosion(spawner.get_position())
                self.create_huggable = False

             if self.change_angle:
                for npc in self.npcs:
                   npc.set_angle(math_utils.ang_2_radians(float(random.randrange(-180, 180, 1))))
                self.change_angle = False

             if self.create_enemy:
                for spawner in self.spawners:
                   if len(self.enemies) >= self.max_npc:
                      # If we reached the maximum number of npcs, cancel the timer and ignore the rest of the spawners.
                      pygame.time.set_timer(pygame.USEREVENT + 3, 0)
                      break
                   else:
                      # First check the distance between the player and the spawner to avoid enemies spawning on top of
                      # the player.
                      if math_utils.distance_2D(self.player.get_position(), spawner.get_position()) > 1.5 * float(self.scare_dist):
                         chance = random.randrange(0, 50)
                         if chance < self.wave:
                            self.create_new_enemy(spawner.get_position())
                            self.create_explosion(spawner.get_position())
                self.create_enemy = False

             removal = set()
             for npc in self.npcs:
                # Check if the npc must run away from the player.
                if math_utils.distance_2D(self.player.get_position(), npc.get_position()) < self.scare_dist:
                   if not npc.is_scared():
                      npc.toggle_scared()
                   
                      npc.set_velocity([0, 0])

                   # Move in the opposite direction of the player.
                   n_pos = npc.get_position()
                   p_pos = self.player.get_position()
                   vec_2 = (float(n_pos[0] - p_pos[0]), float(n_pos[1] - p_pos[1]))
                   vec_2 = math_utils.normalize_vector_2D(vec_2)
                   npc.set_angle(math_utils.angle_vectors_2D(self.vec_1, vec_2))
                else:
                   if npc.is_scared():
                      npc.toggle_scared()

                npc.update()

                # Detect collisions with the player.
                if self.player.is_moving() and npc.test_collision_with_actor(self.player):
                   npc.make_invisible()
                   self.create_explosion(npc.get_position())
                   audio.cached_audio_manager.play_sound('sfx/Explo_4.wav')
                   player.PLAYERS[1].inc_score_by_one()
                   self.time_left += 1

                   if player.PLAYERS[1].get_score() % 25 == 0:
                      self.wave += 1
                      audio.cached_audio_manager.play_sound('sfx/new_stage_1.wav')

                # If the npc exploded this turn, remove it.
                if not npc.is_visible():
                   removal.add(npc)

             if len(removal) > 0 and len(self.npcs) >= self.max_npc:
                # If npcs dissapeared this cycle restart the timer.
                pygame.time.set_timer(pygame.USEREVENT + 1, 1000)

             self.npcs.difference_update(removal)

             removal = set()

             for enemy in self.enemies:
                enemy.update()

                if enemy.test_collision_with_actor(self.player):
                   # If the player lost, force a timeout.
                   self.time_left = 0
                
                if enemy.get_position()[0] <= self.constraints[0] or enemy.get_position()[0] >= self.constraints[1]:
                   enemy.make_invisible()
                   self.create_explosion(enemy.get_position())
                   removal.add(enemy)
                   audio.cached_audio_manager.play_sound('sfx/Explo_2.wav')
                elif enemy.get_position()[1] <= self.constraints[2] or enemy.get_position()[1] >= self.constraints[3]:
                   enemy.make_invisible()
                   self.create_explosion(enemy.get_position())
                   removal.add(enemy)
                   audio.cached_audio_manager.play_sound('sfx/Explo_2.wav')

             if len(removal) > 0 and len(self.enemies) >= self.max_npc:
                # If npcs dissapeared this cycle restart the timer.
                pygame.time.set_timer(pygame.USEREVENT + 1, 3000)

             self.enemies.difference_update(removal)

          elif self.time_left < -3:
             # Reset everything.
             self.time_left = 190
             self.wave = 0
             self.user_click = False
             self.done = False

             # Reset the player.
             self.player.set_angle(90)
             self.player.set_velocity([0, 0])
             self.player.stop()
             self.player.set_position(self.game_area_center)

             # TODO: Destroy all NPC's.
             self.explosions.clear()
             self.npcs.clear()
             self.enemies.clear()

             player.PLAYERS[1].revive()
             
             database.cursor.execute('SELECT * FROM score ORDER BY score ASC')
             row = database.cursor.fetchone()
             if player.PLAYERS[1].get_score() > row[2]:
                self.next_transition = VALID_STATES['SCORE']
             else:
                self.next_transition = VALID_STATES['MENU']

             # Stop the huggable creation timer.
             pygame.time.set_timer(pygame.USEREVENT + 1, 0)
             pygame.time.set_timer(pygame.USEREVENT + 2, 0)
             pygame.time.set_timer(pygame.USEREVENT + 3, 0)

             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)

       self.score_text = self.font.render("Puntos:   " + str(player.PLAYERS[1].get_score()), True, (0, 0, 0))
       if self.time_left > 30:
          self.time_text = self.font.render("Tiempo:   " + str(self.time_left), True, (0, 0, 0))
       else:
          self.time_text = self.font.render("Tiempo:   " + str(max(self.time_left, 0)), True, (255, 0, 0))
       self.wave_text = self.font.render("Oleada:   " + str(self.wave), True, (0, 0, 0))

       self.cursor_x = self.screen_center[0]
       self.cursor_y = self.screen_center[1]

       return self.next_transition
コード例 #3
0
    def __init__(self):
       BaseState.__init__(self)

       random.seed(None)

       self.background_color = (125, 158, 192)

       self.next_transition = VALID_STATES['SCORE']
       self.cursor_x = 0
       self.cursor_y = 0
       self.user_click = False
       self.cancel = False

       self.time_left = 160
       self.then = pygame.time.get_ticks()
       self.wave = 0
       self.done = False
       self.max_npc = 15
       self.create_huggable = False
       self.change_angle = False
       self.create_enemy = False

       self.bckg_x = 0
       self.bckg_y = 0

       self.explosions = set()
       self.npcs = set()
       self.enemies = set()

       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_front.png')
       self.player = actor.OmnidirectionalActor(0, play_img, "Player", True)
       self.player.set_fps(5)
       self.player.set_angle(math_utils.PI / 2.0)
       self.player.set_velocity([0, 0])

       self.spawners = set()
       for i in range(8):
          spawner = actor.BaseActor(40 + i + 1, None, "Spawner " + str(i))
          self.spawners.add(spawner)

       # Add idle frames to the player:
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_side.png')
       self.player.add_idle_frame(play_img)
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_front.png')
       self.player.add_idle_frame(play_img)
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_side2.png')
       self.player.add_idle_frame(play_img)
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_back.png')
       self.player.add_idle_frame(play_img)

       # Add moving frames to the player.
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_side_HUG_1.png')
       self.player.add_moving_frame(play_img)
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_side_HUG_2.png')
       self.player.add_moving_frame(play_img)
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_HUG_front_1.png')
       self.player.add_moving_frame(play_img)
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_HUG_front_2.png')
       self.player.add_moving_frame(play_img)
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_side_HUG_1_flipped.png')
       self.player.add_moving_frame(play_img)
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_side_HUG_2_flipped.png')
       self.player.add_moving_frame(play_img)
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_back_HUG_1.png')
       self.player.add_moving_frame(play_img)
       play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_back_HUG_2.png')
       self.player.add_moving_frame(play_img)

       # Create a surface for the background.
       bg_w = int(float(pygame.display.Info().current_w * 1315) / 1024.0)
       bg_h = int(float(pygame.display.Info().current_h * 1280) / 768.0)
       self.background = pygame.Surface((bg_w, bg_h))
       self.game_area = pygame.Surface((bg_w, bg_h))

       self.game_area_center = [bg_w // 2, bg_h // 2]

       # Center the player.
       self.player.set_position(self.game_area_center)
       self.constraints = [int((95.0 * float(pygame.display.Info().current_w)) / 1024.0),
                           bg_w - int((95.0 * float(pygame.display.Info().current_w)) / 1024.0),
                           int((155.0 * float(pygame.display.Info().current_h)) / 768.0),
                           bg_h - int((155.0 * float(pygame.display.Info().current_h)) / 768.0)]

       # Place the spawners in position.
       positions = [(180, 200), (660, 200), (1140, 200), (1140, 662), (1140, 1055), (660, 1055), (180, 1055), (180, 662)]
       i = 0
       for spawner in self.spawners:
          spawner.set_position([(positions[i][0] * bg_w) / 1315, (positions[i][1] * bg_h) / 1280])
          i += 1
       
       # Create the floor.
       floor = background.TiledBackground(bg_w, bg_h, 'gfx/piso.png')

       # Create the walls for the top and the bottom (the same for both).
       bg_h = int((80.0 * float(pygame.display.Info().current_h)) / 768.0)
       walls_top = background.TiledBackground(bg_w, bg_h, 'gfx/Pared.png')
       bg_y = self.background.get_height() - int((80.0 * float(pygame.display.Info().current_h)) / 768.0)

       # Create the left walls.
       bg_h = int(float(pygame.display.Info().current_h * 1280) / 768.0)
       walls_left = background.TiledBackground(-1, bg_h, 'gfx/Pared2.png')
       _y = int((80.0 * float(pygame.display.Info().current_h)) / 768.0)
       walls_left.set_position((0, _y))

       # Create the right walls.
       walls_right = background.TiledBackground(-1, bg_h, 'gfx/Pared3.png')
       _x = self.background.get_width() - int((40.0 * float(pygame.display.Info().current_w)) / 1024.0)
       walls_right.set_position((_x, _y))

       # Build the background image.
       floor.draw(self.background)
       walls_top.set_position((0, 0))
       walls_top.draw(self.background)
       walls_left.draw(self.background)
       walls_right.draw(self.background)
       walls_top.set_position((0, bg_y))
       walls_top.draw(self.background)

       # Center the view on the player
       p_pos = self.player.get_position()
       (dist_x, dist_y) = (math.fabs(self.screen_center[0] - p_pos[0]), math.fabs(self.screen_center[1] - p_pos[1]))
       self.bckg_x -= dist_x
       self.bckg_y -= dist_y
                      
       self.player.set_constraints(self.constraints)

       self.cursor_x = self.screen_center[0]
       self.cursor_y = self.screen_center[1]
       self.vec_1 = (float(pygame.display.Info().current_w) - float(self.screen_center[0]), 0.0)
       self.vec_1 = math_utils.normalize_vector_2D(self.vec_1)

       self.font = pygame.font.Font('font/ProfaisalEliteRiqa/Profaisal-EliteRiqaV1.0.ttf', 22)

       self.score_text = self.font.render("Puntos:   " + str(1000), True, (0, 0, 0))
       self.time_text = self.font.render("Tiempo:   " + str(190), True, (0, 0, 0))
       self.wave_text = self.font.render("Oleada:   " + str(999), True, (0, 0, 0))

       text_w = max(self.font.size("Puntos:   " + str(1000))[0], 
                    max(self.font.size("Tiempo:   " + str(190))[0], self.font.size("Oleada: " + str(999))[0])) + 10
       self.text_h = (3 * self.font.size("Puntos:   " + str(1000))[1]) + 20
       self.text_box = pygame.Surface((text_w, self.text_h))
       self.text_h = self.font.size("Puntos:   " + str(1000))[1]
       self.text_box.set_alpha(128 + 64 + 32)

       self.reticule = imloader.cached_image_loader.get_image_to_screen_percent('gfx/reticula.png')
       self.ret_rect = self.reticule.get_rect()
       self.ret_rect.center = self.screen_center

       self.scare_dist = (250 * pygame.display.Info().current_h) / 768