Advertisement
Guest User

Geometry Wars Clone

a guest
Feb 1st, 2025
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 25.13 KB | Source Code | 0 0
  1. import pygame
  2. import sys
  3. import random
  4. import math
  5.  
  6. # Initialize PyGame
  7. pygame.init()
  8. screen_width, screen_height = 800, 600
  9. screen = pygame.display.set_mode((screen_width, screen_height))
  10. pygame.display.set_caption("Top-Down Shooter")
  11. clock = pygame.time.Clock()
  12.  
  13. # Fonts for displaying score, level, and messages
  14. font = pygame.font.SysFont(None, 36)
  15. big_font = pygame.font.SysFont(None, 72)
  16.  
  17. # --------------------------------------------------
  18. # Initialize Joystick (Controller) if available
  19. # --------------------------------------------------
  20. joystick = None
  21. if pygame.joystick.get_count() > 0:
  22.     joystick = pygame.joystick.Joystick(0)
  23.     joystick.init()
  24.     print("Joystick connected:", joystick.get_name())
  25.  
  26. # Variables for twin-stick firing:
  27. last_shot_time = 0
  28. fire_interval = 150  # milliseconds between shots while the right stick is held
  29.  
  30. # --------------------------------------------------
  31. # Helper Drawing Functions for Custom Shapes
  32. # --------------------------------------------------
  33.  
  34. def draw_star(surface, color, center, outer_radius, inner_radius, num_points=5):
  35.     """Draws a star shape with alternating outer and inner points."""
  36.     points = []
  37.     angle = math.radians(-90)  # start so the top point is upward
  38.     angle_step = math.pi / num_points
  39.     for i in range(num_points * 2):
  40.         r = outer_radius if i % 2 == 0 else inner_radius
  41.         x = center[0] + r * math.cos(angle)
  42.         y = center[1] + r * math.sin(angle)
  43.         points.append((x, y))
  44.         angle += angle_step
  45.     pygame.draw.polygon(surface, color, points)
  46.  
  47. def draw_hexagon(surface, color, center, radius):
  48.     """Draws a regular hexagon with a flat top."""
  49.     points = []
  50.     for i in range(6):
  51.         angle = math.radians(60 * i - 30)
  52.         x = center[0] + radius * math.cos(angle)
  53.         y = center[1] + radius * math.sin(angle)
  54.         points.append((x, y))
  55.     pygame.draw.polygon(surface, color, points)
  56.  
  57. # --------------------------------------------------
  58. # Player Class
  59. # --------------------------------------------------
  60.  
  61. class Player:
  62.     def __init__(self, pos):
  63.         self.pos = pygame.math.Vector2(pos)
  64.         self.direction = pygame.math.Vector2(0, -1)  # Initially facing up.
  65.         self.speed = 5
  66.  
  67.     def update(self, keys):
  68.         # Fallback keyboard movement (arrow keys).
  69.         dx, dy = 0, 0
  70.         if keys[pygame.K_LEFT]:
  71.             dx -= 1
  72.         if keys[pygame.K_RIGHT]:
  73.             dx += 1
  74.         if keys[pygame.K_UP]:
  75.             dy -= 1
  76.         if keys[pygame.K_DOWN]:
  77.             dy += 1
  78.         move = pygame.math.Vector2(dx, dy)
  79.         if move.length_squared() > 0:
  80.             move = move.normalize() * self.speed
  81.             self.direction = move.normalize()  # update facing direction
  82.             self.pos += move
  83.  
  84.     def draw(self, screen, camera_offset):
  85.         # Always drawn at the center of the screen.
  86.         center = pygame.math.Vector2(screen_width // 2, screen_height // 2)
  87.         points = [pygame.math.Vector2(0, -15),
  88.                   pygame.math.Vector2(-10, 10),
  89.                   pygame.math.Vector2(10, 10)]
  90.         angle = math.degrees(math.atan2(self.direction.y, self.direction.x)) + 90
  91.         rotated_points = [p.rotate(angle) for p in points]
  92.         transformed_points = [(center.x + p.x, center.y + p.y) for p in rotated_points]
  93.         pygame.draw.polygon(screen, (0, 255, 0), transformed_points)
  94.  
  95. # --------------------------------------------------
  96. # Enemy Classes (Types 1, 2, and 3)
  97. # --------------------------------------------------
  98.  
  99. class EnemyType1:
  100.     def __init__(self, pos):
  101.         self.pos = pygame.math.Vector2(pos)
  102.         self.speed = 1.2  # Base speed; will be scaled.
  103.         self.size = 10
  104.         self.color = (255, 0, 0)
  105.  
  106.     def update(self, player_pos, player_direction=None):
  107.         direction = player_pos - self.pos
  108.         if direction.length() != 0:
  109.             direction = direction.normalize()
  110.         self.pos += direction * self.speed
  111.  
  112.     def draw(self, screen, camera_offset):
  113.         screen_pos = self.pos - camera_offset
  114.         rect = pygame.Rect(int(screen_pos.x - self.size),
  115.                            int(screen_pos.y - self.size),
  116.                            2 * self.size, 2 * self.size)
  117.         pygame.draw.rect(screen, self.color, rect)
  118.  
  119. class EnemyType2:
  120.     def __init__(self, pos):
  121.         self.pos = pygame.math.Vector2(pos)
  122.         self.speed = 1.2  # Base speed; will be scaled.
  123.         self.size = 10
  124.         self.color = (255, 165, 0)
  125.  
  126.     def update(self, player_pos, player_direction):
  127.         to_enemy = self.pos - player_pos
  128.         if to_enemy.length() != 0:
  129.             to_enemy_norm = to_enemy.normalize()
  130.         else:
  131.             to_enemy_norm = pygame.math.Vector2(0, 0)
  132.         threshold = 0.7
  133.         dot_val = player_direction.dot(to_enemy_norm)
  134.         if dot_val > threshold:
  135.             move_dir = self.pos - player_pos  # retreat.
  136.         else:
  137.             move_dir = player_pos - self.pos  # approach.
  138.         if move_dir.length() != 0:
  139.             move_dir = move_dir.normalize()
  140.         self.pos += move_dir * self.speed
  141.  
  142.     def draw(self, screen, camera_offset):
  143.         screen_pos = self.pos - camera_offset
  144.         draw_hexagon(screen, self.color, (int(screen_pos.x), int(screen_pos.y)), self.size)
  145.  
  146. class EnemyType3:
  147.     def __init__(self, pos):
  148.         self.pos = pygame.math.Vector2(pos)
  149.         self.size = 10
  150.         self.color = (128, 0, 128)
  151.         self.state = "waiting"
  152.         self.state_start_time = pygame.time.get_ticks()
  153.         self.waiting_duration = 2000  # milliseconds.
  154.         self.dash_duration = 1000
  155.         self.dash_speed = 5  # Base dash speed; will be scaled.
  156.         self.dash_direction = pygame.math.Vector2(0, 0)
  157.  
  158.     def update(self, player_pos, player_direction=None):
  159.         current_time = pygame.time.get_ticks()
  160.         if self.state == "waiting":
  161.             if current_time - self.state_start_time >= self.waiting_duration:
  162.                 direction = player_pos - self.pos
  163.                 self.dash_direction = direction.normalize() if direction.length() != 0 else pygame.math.Vector2(0, 0)
  164.                 self.state = "dashing"
  165.                 self.state_start_time = current_time
  166.         elif self.state == "dashing":
  167.             self.pos += self.dash_direction * self.dash_speed
  168.             if current_time - self.state_start_time >= self.dash_duration:
  169.                 self.state = "waiting"
  170.                 self.state_start_time = current_time
  171.  
  172.     def draw(self, screen, camera_offset):
  173.         screen_pos = self.pos - camera_offset
  174.         pygame.draw.circle(screen, self.color,
  175.                            (int(screen_pos.x), int(screen_pos.y)), self.size)
  176.  
  177. # --------------------------------------------------
  178. # Projectile and PowerUp Classes (for Player)
  179. # --------------------------------------------------
  180.  
  181. class Projectile:
  182.     def __init__(self, pos, direction):
  183.         self.pos = pygame.math.Vector2(pos)
  184.         self.direction = pygame.math.Vector2(direction).normalize()
  185.         self.speed = 10
  186.         self.size = 5
  187.  
  188.     def update(self):
  189.         self.pos += self.direction * self.speed
  190.  
  191.     def draw(self, screen, camera_offset):
  192.         screen_pos = self.pos - camera_offset
  193.         pygame.draw.circle(screen, (255, 255, 0),
  194.                            (int(screen_pos.x), int(screen_pos.y)), self.size)
  195.  
  196. class PowerUp:
  197.     def __init__(self, pos, p_type):
  198.         self.pos = pygame.math.Vector2(pos)
  199.         self.type = p_type  # "shield" or "triple"
  200.         self.radius = 8
  201.     def draw(self, screen, camera_offset):
  202.         screen_pos = self.pos - camera_offset
  203.         center = (int(screen_pos.x), int(screen_pos.y))
  204.         if self.type == "shield":
  205.             color = (0, 255, 0)
  206.         elif self.type == "triple":
  207.             color = (0, 0, 255)
  208.         draw_star(screen, color, center, self.radius, self.radius * 0.5)
  209.  
  210. # --------------------------------------------------
  211. # Boss and Boss Projectile Classes (for Boss Levels)
  212. # --------------------------------------------------
  213.  
  214. class Boss:
  215.     def __init__(self, pos):
  216.         self.pos = pygame.math.Vector2(pos)
  217.         self.hp = 20
  218.         self.last_projectile_time = pygame.time.get_ticks()
  219.         self.projectile_interval = 1000  # ms
  220.         self.width = 200
  221.         self.top_width = 150
  222.         self.height = 100
  223.         self.move_speed = 2
  224.         self.move_direction = pygame.math.Vector2(random.uniform(-1, 1), random.uniform(-1, 1))
  225.         if self.move_direction.length() != 0:
  226.             self.move_direction = self.move_direction.normalize()
  227.         self.last_move_change_time = pygame.time.get_ticks()
  228.         self.move_change_interval = 1000
  229.      
  230.     def update(self, player_pos):
  231.         current_time = pygame.time.get_ticks()
  232.         if current_time - self.last_move_change_time >= self.move_change_interval:
  233.             angle = random.uniform(0, 2 * math.pi)
  234.             self.move_direction = pygame.math.Vector2(math.cos(angle), math.sin(angle))
  235.             self.last_move_change_time = current_time
  236.         self.pos += self.move_direction * self.move_speed
  237.         if current_time - self.last_projectile_time >= self.projectile_interval:
  238.             proj_type = "standard" if random.random() < 0.7 else "homing"
  239.             direction = (player_pos - self.pos).normalize() if (player_pos - self.pos).length() != 0 else pygame.math.Vector2(0, 0)
  240.             bp = BossProjectile(self.pos, direction, proj_type)
  241.             boss_projectiles.append(bp)
  242.             self.last_projectile_time = current_time
  243.  
  244.     def draw(self, screen, camera_offset):
  245.         screen_pos = self.pos - camera_offset
  246.         half_width = self.width / 2
  247.         half_top = self.top_width / 2
  248.         half_height = self.height / 2
  249.         points = [
  250.             (screen_pos.x - half_width, screen_pos.y + half_height),
  251.             (screen_pos.x + half_width, screen_pos.y + half_height),
  252.             (screen_pos.x + half_top, screen_pos.y - half_height),
  253.             (screen_pos.x - half_top, screen_pos.y - half_height)
  254.         ]
  255.         pygame.draw.polygon(screen, (255, 105, 180), points)
  256.         hp_text = font.render("HP: " + str(self.hp), True, (0, 0, 0))
  257.         text_rect = hp_text.get_rect(center=(screen_pos.x, screen_pos.y))
  258.         screen.blit(hp_text, text_rect)
  259.  
  260. class BossProjectile:
  261.     def __init__(self, pos, direction, proj_type):
  262.         self.pos = pygame.math.Vector2(pos)
  263.         self.direction = pygame.math.Vector2(direction).normalize()
  264.         self.proj_type = proj_type  # "standard" or "homing"
  265.         self.spawn_time = pygame.time.get_ticks()
  266.         self.to_remove = False
  267.         if self.proj_type == "standard":
  268.             self.speed = 7
  269.         else:
  270.             self.speed = 5 * 0.7  # 3.5 (slowed by 30%)
  271.         self.size = 8
  272.  
  273.     def update(self, player_pos):
  274.         if self.proj_type == "standard":
  275.             self.pos += self.direction * self.speed
  276.         else:
  277.             target_dir = (player_pos - self.pos)
  278.             if target_dir.length() != 0:
  279.                 target_dir = target_dir.normalize()
  280.             else:
  281.                 target_dir = pygame.math.Vector2(0, 0)
  282.             current_angle = math.atan2(self.direction.y, self.direction.x)
  283.             target_angle = math.atan2(target_dir.y, target_dir.x)
  284.             angle_diff = (target_angle - current_angle + math.pi) % (2 * math.pi) - math.pi
  285.             max_turn = math.radians(2)
  286.             if abs(angle_diff) > max_turn:
  287.                 angle_diff = max_turn if angle_diff > 0 else -max_turn
  288.             new_angle = current_angle + angle_diff
  289.             self.direction = pygame.math.Vector2(math.cos(new_angle), math.sin(new_angle))
  290.             self.pos += self.direction * self.speed
  291.             current_time = pygame.time.get_ticks()
  292.             if current_time - self.spawn_time >= 5000:
  293.                 self.to_remove = True
  294.  
  295.     def draw(self, screen, camera_offset):
  296.         screen_pos = self.pos - camera_offset
  297.         if self.proj_type == "standard":
  298.             pygame.draw.circle(screen, (255, 105, 180),
  299.                                (int(screen_pos.x), int(screen_pos.y)), self.size)
  300.         else:
  301.             tip = pygame.math.Vector2(0, -self.size)
  302.             left = pygame.math.Vector2(-self.size, self.size)
  303.             right = pygame.math.Vector2(self.size, self.size)
  304.             angle = math.degrees(math.atan2(self.direction.y, self.direction.x)) + 90
  305.             tip = tip.rotate(angle)
  306.             left = left.rotate(angle)
  307.             right = right.rotate(angle)
  308.             center = pygame.math.Vector2(screen_pos.x, screen_pos.y)
  309.             points = [(center.x + tip.x, center.y + tip.y),
  310.                       (center.x + left.x, center.y + left.y),
  311.                       (center.x + right.x, center.y + right.y)]
  312.             pygame.draw.polygon(screen, (255, 105, 180), points)
  313.  
  314. # --------------------------------------------------
  315. # Global Difficulty Variables and Spawning Function
  316. # --------------------------------------------------
  317.  
  318. enemy_speed_multiplier = 1.0
  319.  
  320. def spawn_enemies(num, player_pos):
  321.     enemy_list = []
  322.     for _ in range(num):
  323.         angle = random.uniform(0, 2 * math.pi)
  324.         distance = random.uniform(300, 500)
  325.         pos = pygame.math.Vector2(
  326.             player_pos.x + math.cos(angle) * distance,
  327.             player_pos.y + math.sin(angle) * distance
  328.         )
  329.         enemy_class = random.choice([EnemyType1, EnemyType2, EnemyType3])
  330.         enemy = enemy_class(pos)
  331.         if hasattr(enemy, 'speed'):
  332.             enemy.speed *= enemy_speed_multiplier
  333.         if hasattr(enemy, 'dash_speed'):
  334.             enemy.dash_speed *= enemy_speed_multiplier
  335.         enemy_list.append(enemy)
  336.     return enemy_list
  337.  
  338. # --------------------------------------------------
  339. # Game Initialization and Global Variables
  340. # --------------------------------------------------
  341.  
  342. player = Player((0, 0))
  343. level_number = 1
  344. level_enemy_kill_target = 10  # For normal levels.
  345. enemies = []
  346. projectiles = []
  347. powerups = []
  348. score = 0
  349. destroyed_count = 0
  350. player_health = 3  # Three health hearts.
  351. player_shield_active = False
  352. player_triple_shot_active = False
  353. player_triple_shot_end_time = 0
  354.  
  355. boss = None
  356. boss_projectiles = []
  357.  
  358. level_won = False
  359. win_time = 0
  360. level_lost = False
  361. lose_time = 0
  362.  
  363. last_enemy_spawn_time = pygame.time.get_ticks()
  364. enemy_spawn_interval = 1500  # milliseconds
  365. last_powerup_spawn_time = pygame.time.get_ticks()
  366. powerup_spawn_interval = 10000  # milliseconds
  367.  
  368. # --------------------------------------------------
  369. # Main Game Loop
  370. # --------------------------------------------------
  371.  
  372. while True:
  373.     dt = clock.tick(60)
  374.     current_time = pygame.time.get_ticks()
  375.  
  376.     # --- Event Handling ---
  377.     for event in pygame.event.get():
  378.         if event.type == pygame.QUIT:
  379.             pygame.quit()
  380.             sys.exit()
  381.         # Fallback keyboard shooting if no controller is connected.
  382.         if event.type == pygame.KEYDOWN:
  383.             if event.key == pygame.K_SPACE and not (level_won or level_lost) and (joystick is None):
  384.                 if player_triple_shot_active:
  385.                     directions = [player.direction,
  386.                                   player.direction.rotate(30),
  387.                                   player.direction.rotate(-30)]
  388.                     for d in directions:
  389.                         projectiles.append(Projectile(player.pos, d))
  390.                 else:
  391.                     projectiles.append(Projectile(player.pos, player.direction))
  392.  
  393.     # Compute camera offset so that the player remains centered.
  394.     camera_offset = player.pos - pygame.math.Vector2(screen_width/2, screen_height/2)
  395.  
  396.     boss_level = (level_number % 4 == 0)
  397.  
  398.     if not (level_won or level_lost):
  399.         keys = pygame.key.get_pressed()
  400.         # --- Movement: Use left analog stick (axes 0 and 1) if available, else keyboard ---
  401.         if joystick is not None:
  402.             lx = joystick.get_axis(0)
  403.             ly = joystick.get_axis(1)
  404.             deadzone = 0.2
  405.             if abs(lx) < deadzone:
  406.                 lx = 0
  407.             if abs(ly) < deadzone:
  408.                 ly = 0
  409.             move_input = pygame.math.Vector2(lx, ly)
  410.             if move_input.length() > 0:
  411.                 move = move_input.normalize() * player.speed
  412.                 player.direction = move_input.normalize()
  413.                 player.pos += move
  414.             else:
  415.                 player.update(keys)
  416.         else:
  417.             player.update(keys)
  418.  
  419.         # --- Twin-Stick Shooting: Use right analog stick (axes 2 and 3) ---
  420.         if joystick is not None:
  421.             rx = joystick.get_axis(2)
  422.             ry = joystick.get_axis(3)
  423.             deadzone_shoot = 0.2
  424.             shoot_input = pygame.math.Vector2(rx, ry)
  425.             if shoot_input.length() < deadzone_shoot:
  426.                 shoot_input = pygame.math.Vector2(0, 0)
  427.             if shoot_input.length() > 0:
  428.                 # Continuously fire while the right stick is held, using fire_interval.
  429.                 if current_time - last_shot_time >= fire_interval:
  430.                     if player_triple_shot_active:
  431.                         directions = [shoot_input.normalize(),
  432.                                       shoot_input.normalize().rotate(30),
  433.                                       shoot_input.normalize().rotate(-30)]
  434.                         for d in directions:
  435.                             projectiles.append(Projectile(player.pos, d))
  436.                     else:
  437.                         projectiles.append(Projectile(player.pos, shoot_input.normalize()))
  438.                     last_shot_time = current_time
  439.  
  440.         # --- Update player projectiles ---
  441.         for proj in projectiles:
  442.             proj.update()
  443.  
  444.         if boss_level:
  445.             if boss is None:
  446.                 boss = Boss((player.pos.x, player.pos.y - 200))
  447.             boss.update(player.pos)
  448.             for bp in boss_projectiles[:]:
  449.                 bp.update(player.pos)
  450.                 if bp.to_remove:
  451.                     boss_projectiles.remove(bp)
  452.             # Collision Detection for Boss Level:
  453.             for proj in projectiles[:]:
  454.                 if proj.pos.distance_to(boss.pos) < 100:
  455.                     boss.hp -= 1
  456.                     try:
  457.                         projectiles.remove(proj)
  458.                     except ValueError:
  459.                         pass
  460.             for proj in projectiles[:]:
  461.                 for bp in boss_projectiles[:]:
  462.                     if bp.proj_type == "homing" and proj.pos.distance_to(bp.pos) < (bp.size + proj.size):
  463.                         try:
  464.                             boss_projectiles.remove(bp)
  465.                         except ValueError:
  466.                             pass
  467.                         try:
  468.                             projectiles.remove(proj)
  469.                         except ValueError:
  470.                             pass
  471.                         break
  472.             for bp in boss_projectiles[:]:
  473.                 if bp.pos.distance_to(player.pos) < (15 + bp.size):
  474.                     try:
  475.                         boss_projectiles.remove(bp)
  476.                     except ValueError:
  477.                         pass
  478.                     if player_shield_active:
  479.                         player_shield_active = False
  480.                     else:
  481.                         player_health -= 1
  482.             if boss.hp <= 0:
  483.                 level_won = True
  484.                 win_time = current_time
  485.  
  486.         else:
  487.             if current_time - last_enemy_spawn_time >= enemy_spawn_interval:
  488.                 new_enemy = spawn_enemies(1, player.pos)[0]
  489.                 enemies.append(new_enemy)
  490.                 last_enemy_spawn_time = current_time
  491.             if current_time - last_powerup_spawn_time >= powerup_spawn_interval:
  492.                 spawn_x = random.uniform(player.pos.x - screen_width/2, player.pos.x + screen_width/2)
  493.                 spawn_y = random.uniform(player.pos.y - screen_height/2, player.pos.y + screen_height/2)
  494.                 p_type = "shield" if random.random() < 0.5 else "triple"
  495.                 powerups.append(PowerUp((spawn_x, spawn_y), p_type))
  496.                 last_powerup_spawn_time = current_time
  497.             for enemy in enemies:
  498.                 enemy.update(player.pos, player.direction)
  499.             if player_triple_shot_active and current_time >= player_triple_shot_end_time:
  500.                 player_triple_shot_active = False
  501.                 player_triple_shot_end_time = 0
  502.             for proj in projectiles[:]:
  503.                 for enemy in enemies[:]:
  504.                     if proj.pos.distance_to(enemy.pos) < (enemy.size + proj.size):
  505.                         try:
  506.                             enemies.remove(enemy)
  507.                         except ValueError:
  508.                             pass
  509.                         try:
  510.                             projectiles.remove(proj)
  511.                         except ValueError:
  512.                             pass
  513.                         score += 200
  514.                         destroyed_count += 1
  515.                         break
  516.             for enemy in enemies[:]:
  517.                 if enemy.pos.distance_to(player.pos) < (15 + enemy.size):
  518.                     try:
  519.                         enemies.remove(enemy)
  520.                     except ValueError:
  521.                         pass
  522.                     if player_shield_active:
  523.                         player_shield_active = False
  524.                     else:
  525.                         player_health -= 1
  526.             for pu in powerups[:]:
  527.                 if pu.pos.distance_to(player.pos) < (15 + pu.radius):
  528.                     if pu.type == "shield":
  529.                         player_shield_active = True
  530.                     elif pu.type == "triple":
  531.                         player_triple_shot_active = True
  532.                         player_triple_shot_end_time = current_time + 8000
  533.                     try:
  534.                         powerups.remove(pu)
  535.                     except ValueError:
  536.                         pass
  537.             if destroyed_count >= level_enemy_kill_target:
  538.                 level_won = True
  539.                 win_time = current_time
  540.             projectiles = [p for p in projectiles if p.pos.distance_to(player.pos) < 1000]
  541.  
  542.         if player_health <= 0:
  543.             level_lost = True
  544.             lose_time = current_time
  545.  
  546.     else:
  547.         if level_won and current_time - win_time >= 5000:
  548.             level_won = False
  549.             destroyed_count = 0
  550.             if not boss_level:
  551.                 level_enemy_kill_target = int(level_enemy_kill_target * 1.1)
  552.                 enemy_speed_multiplier *= 1.05
  553.             level_number += 1
  554.             enemies.clear()
  555.             projectiles.clear()
  556.             powerups.clear()
  557.             boss_projectiles.clear()
  558.             last_enemy_spawn_time = current_time
  559.             last_powerup_spawn_time = current_time
  560.             player_shield_active = False
  561.             player_triple_shot_active = False
  562.             player_triple_shot_end_time = 0
  563.             boss = None
  564.         elif level_lost and current_time - lose_time >= 5000:
  565.             level_lost = False
  566.             destroyed_count = 0
  567.             player_health = 3
  568.             player.pos = pygame.math.Vector2(0, 0)
  569.             enemies.clear()
  570.             projectiles.clear()
  571.             powerups.clear()
  572.             boss_projectiles.clear()
  573.             last_enemy_spawn_time = current_time
  574.             last_powerup_spawn_time = current_time
  575.             player_shield_active = False
  576.             player_triple_shot_active = False
  577.             player_triple_shot_end_time = 0
  578.             boss = None
  579.  
  580.     # --- Drawing ---
  581.     screen.fill((0, 0, 0))
  582.     if boss_level:
  583.         if boss is not None:
  584.             boss.draw(screen, camera_offset)
  585.         for bp in boss_projectiles:
  586.             bp.draw(screen, camera_offset)
  587.     else:
  588.         for enemy in enemies:
  589.             enemy.draw(screen, camera_offset)
  590.         for pu in powerups:
  591.             pu.draw(screen, camera_offset)
  592.     for proj in projectiles:
  593.         proj.draw(screen, camera_offset)
  594.     player.draw(screen, camera_offset)
  595.     score_text = font.render("Score: " + str(score), True, (255, 255, 255))
  596.     screen.blit(score_text, (screen_width - score_text.get_width() - 10, 10))
  597.     level_text = font.render("Level " + str(level_number), True, (255, 255, 255))
  598.     level_rect = level_text.get_rect(midtop=(screen_width/2, 10))
  599.     screen.blit(level_text, level_rect)
  600.     heart_width = 20
  601.     heart_height = 30
  602.     for i in range(player_health):
  603.         heart_x = 10 + i*(heart_width + 5)
  604.         heart_y = 10
  605.         pygame.draw.rect(screen, (255, 0, 0), (heart_x, heart_y, heart_width, heart_height))
  606.     if player_shield_active:
  607.         center = (screen_width//2, screen_height//2)
  608.         pygame.draw.circle(screen, (0, 0, 255), center, 25, 3)
  609.     if level_won:
  610.         win_text = big_font.render("You Win!", True, (255, 255, 255))
  611.         win_rect = win_text.get_rect(center=(screen_width/2, screen_height/2))
  612.         screen.blit(win_text, win_rect)
  613.     if level_lost:
  614.         lose_text = big_font.render("You Lose", True, (255, 255, 255))
  615.         lose_rect = lose_text.get_rect(center=(screen_width/2, screen_height/2))
  616.         screen.blit(lose_text, lose_rect)
  617.  
  618.     pygame.display.flip()
  619.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement