def move_torpedo(self): """ moves the torpedo in the direction it was fire and update the game score when we hit an asteroid """ if self._screen.is_space_pressed() and len(self.torpedo_lst) <= 15: torpedo = Torpedo(self.ship) torpedo.set_dx() torpedo.set_dy() self._screen.register_torpedo(torpedo) self.torpedo_lst.append(torpedo) dead_torpedo_lst = [] for i, torpedo in enumerate(self.torpedo_lst): if torpedo.get_life() > 0: self.move(torpedo) self._screen.draw_torpedo(torpedo, torpedo.get_lx(), torpedo.get_ly(), torpedo.get_heading()) torpedo.life_update() else: dead_torpedo_lst.append(i) for j, ast in enumerate(self.asteroid_lst): if ast.has_intersection(torpedo): self.score_update(ast.get_size()) self.torpedo_hit(ast, torpedo, i, j) dead_torpedo_lst.append(i) new_torpedo_list = [] for i in range(len(self.torpedo_lst)): if i not in dead_torpedo_lst: new_torpedo_list.append(self.torpedo_lst[i]) if i in dead_torpedo_lst: self._screen.unregister_torpedo(self.torpedo_lst[i]) self.torpedo_lst = new_torpedo_list
def create_torpedo(self): torp = Torpedo(self.__ship_dict["ship"].get_location(X), self.__ship_dict["ship"].get_location(Y), self.__ship_dict["ship"].get_speed(X), self.__ship_dict["ship"].get_speed(Y), self.__ship_dict["ship"].get_heading()) self.__screen.register_torpedo(torp) self.__screen.draw_torpedo(torp, torp.get_location(X), torp.get_location(Y), torp.get_heading()) self.__torpedo_dict[self.__torpedo_counter] = torp
def register_torpedo(self): ''' :return: Generates objects with Class type Torpedo and draws them to the screen ''' if self._screen.is_space_pressed() and len(self._torpedo_list) <= MAX_TORPEDOS: temp_x_speed, temp_y_speed = self._ship.get_speed() new_x_speed = temp_x_speed + ACC_FACTOR * math.cos(math.radians(self._ship.get_heading())) new_y_speed = temp_y_speed + ACC_FACTOR * math.sin(math.radians(self._ship.get_heading())) speed = new_x_speed, new_y_speed temp_torpedo = Torpedo(self._ship.get_location(), speed, self._ship.get_heading(), TORPEDO_RADIUS) if (id(temp_torpedo) not in TORPEDO_LIST_ID): TORPEDO_LIST_ID.append(temp_torpedo) self._screen.register_torpedo(temp_torpedo) x, y = temp_torpedo.get_location() self._screen.draw_torpedo(temp_torpedo, x, y, temp_torpedo.get_heading()) self._torpedo_list.append(temp_torpedo)
def _game_loop(self): """ Main game logic method """ ship_pos = self.ship.get_position() self._screen.draw_ship(ship_pos[self.X], ship_pos[self.Y], self.ship.get_heading()) ship_vel = self.ship.get_velocity() # Rotate ship to the left if self._screen.is_left_pressed(): self.ship.set_heading(self.ship.get_heading() + self.ROTATE_LEFT) # Rotate ship to the right if self._screen.is_right_pressed(): self.ship.set_heading(self.ship.get_heading() + self.ROTATE_RIGHT) # Accelerate ship if self._screen.is_up_pressed(): self.ship.accelerate() # Fire torpedo if self._screen.is_space_pressed(): if self.torpedo_count != self.MAX_TORPEDOS_AT_ONCE: torpedo = Torpedo(ship_pos, ship_vel, self.ship.get_heading()) self._screen.register_torpedo(torpedo) self.torpedo_lives.append(self.TORPEDO_LIFESPAN) self.torpedo_count += 1 self.torpedos.append(torpedo) # This section of code handles each asteroid objects parameter updates for asteroid in self.asteroids: ast_pos = asteroid.get_position() self._screen.draw_asteroid(asteroid, ast_pos[self.X], ast_pos[self.Y]) ast_vel = asteroid.get_velocity() # From here till the end of the loop, the code handles # intersections (if any) of the asteroid with the ship or with a # torpedo if asteroid.has_intersection(self.ship): self._screen.remove_life() self.ship_lives -= 1 self._screen.show_message(self.HIT_TITLE, self.HIT_MSG) self.remove_asteroid(asteroid) continue ast_size = asteroid.get_size() for torpedo in self.torpedos: if asteroid.has_intersection(torpedo): i = ast_size - 1 # Score option's index self.score += self.SCORE_OPTIONS[i] self._screen.set_score(self.score) # Split the asteroid into 2 smaller ones # Remove original asteroid self.remove_asteroid(asteroid) # Removes the torpedo after it hit the asteroid self.remove_torpedo(self.torpedos.index(torpedo), torpedo) if i == 0: # Iteration can be terminated if the removed # asteroid had the smallest size break # Calculate new velocity nom = map(add, ast_vel, torpedo.get_velocity()) den = sqrt(ast_vel[self.X]**2 + ast_vel[self.Y]**2) # Nominator / Denominator n_vel = tuple(v / den for v in nom) # Create new asteroids self.add_asteroid(ast_pos, n_vel, i) # Second asteroid with the opposing velocity self.add_asteroid(ast_pos, tuple(v * -1 for v in n_vel), i) # Move asteroid asteroid.set_position(self.get_new_coords(ast_vel, ast_pos)) # This section of code updates torpedos parameters for torpedo in self.torpedos: t_pos = torpedo.get_position() self._screen.draw_torpedo(torpedo, t_pos[self.X], t_pos[self.Y], torpedo.get_heading()) # Move torpedo torpedo.set_position( self.get_new_coords(torpedo.get_velocity(), t_pos)) # Decrease lifespan of the torpedo torp_index = self.torpedos.index(torpedo) self.torpedo_lives[torp_index] -= 1 # Remove torpedo after its lifespan is depleted if self.torpedo_lives[torp_index] == 0: self.remove_torpedo(torp_index, torpedo) # Exit game and show win message when all asteroids are destroyed if not self.asteroids: self.exit_game(self.WON_TITLE, self.WON_MSG) # Exit game and show loss message when ship is out of lives if self.ship_lives == 0: self.exit_game(self.LOST_TITLE, self.LOST_MSG) # Exit game on request if self._screen.should_end(): self.exit_game(self.QUIT_TITLE, self.QUIT_MSG) # Move ship self.ship.set_position(self.get_new_coords(ship_vel, ship_pos))