Advertisement
Aaditya69

Forest Fury

Oct 27th, 2024
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.87 KB | Gaming | 0 0
  1. import pygame
  2. import math
  3. import random
  4.  
  5. pygame.init()
  6.  
  7. width = 928
  8. height = 600
  9.  
  10. clock = pygame.time.Clock()
  11. FPS = 60
  12.  
  13. angle1 = 0
  14. angle2 = 0
  15. center_x1, center_y1 = 454, 150
  16. center_x2, center_y2 = 454, 380
  17. center_x3, center_y3 = 860, 570
  18. loop_width1 = 35
  19. loop_height1 = 10
  20. loop_width2 = 20
  21. loop_height2 = 8
  22.  
  23. intro_count = 3
  24. last_count = pygame.time.get_ticks()
  25. score = [0, 0]
  26. roundover = False
  27. roundover_cooldown = 3000
  28.  
  29. screen = pygame.display.set_mode((width, height))
  30. pygame.display.set_caption('FIGHTER')
  31.  
  32. bg_img = pygame.image.load('assets/bg.png').convert_alpha()
  33. menu_img = pygame.image.load('assets/menu.png').convert_alpha()
  34. txt_img = pygame.image.load('assets/txt.png').convert_alpha()
  35. play_img = pygame.image.load('assets/play.png').convert_alpha()
  36. quit_img = pygame.image.load('assets/quit.png').convert_alpha()
  37. p1_sprite_sheet = pygame.image.load('assets/sprites1.png').convert_alpha()
  38. p2_sprite_sheet = pygame.image.load('assets/sprites2.png').convert_alpha()
  39. p3_sprite_sheet = pygame.image.load('assets/sprites3.png').convert_alpha()
  40. p4_sprite_sheet = pygame.image.load('assets/sprites4.png').convert_alpha()
  41. p5_sprite_sheet = pygame.image.load('assets/sprites5.png').convert_alpha()
  42.  
  43. bgm = pygame.mixer.Sound('music/bgm.mp3')
  44. bgm.set_volume(100)
  45. fight_fx = pygame.mixer.Sound('music/fight.mp3')
  46. fight_fx.set_volume(0.5)
  47. hit1_fx = pygame.mixer.Sound('music/hit1.mp3')
  48. hit2_fx = pygame.mixer.Sound('music/hit2.mp3')
  49. sword1_fx = pygame.mixer.Sound('music/sword1.mp3')
  50. sword2_fx = pygame.mixer.Sound('music/sword2.mp3')
  51. miss1_fx = pygame.mixer.Sound('music/miss1.mp3')
  52. miss2_fx = pygame.mixer.Sound('music/miss2.mp3')
  53.  
  54. font1 = pygame.font.Font('assets/font.otf', 80)
  55. font2 = pygame.font.Font('assets/font.otf', 40)
  56.  
  57. p1_anim_steps = [8, 3, 3, 10, 3, 7, 8, 7]
  58. p2_anim_steps = [8, 3, 2, 8, 2, 7, 8, 8]
  59. p3_anim_steps = [8, 3, 3, 10, 3, 11, 7, 6]
  60. p4_anim_steps = [8, 3, 2, 4, 2, 7, 4, 4]
  61. p5_anim_steps = [8, 4, 2, 8, 2, 6, 6, 6]
  62.  
  63. p1_size = 162
  64. p1_scale = 4
  65. p1_offset = [72, 60]
  66. p1_data = [p1_size, p1_scale, p1_offset]
  67.  
  68. p2_size = 250
  69. p2_scale = 3
  70. p2_offset = [108, 113]
  71. p2_data = [p2_size, p2_scale, p2_offset]
  72.  
  73. p3_size = 300
  74. p3_scale = 4.5
  75. p3_offset = [108, 113]
  76. p3_data = [p3_size, p3_scale, p3_offset]
  77.  
  78. p4_size = 200
  79. p4_scale = 4
  80. p4_offset = [108, 113]
  81. p4_data = [p4_size, p4_scale, p4_offset]
  82.  
  83. p5_size = 200
  84. p5_scale = 4
  85. p5_offset = [108, 113]
  86. p5_data = [p5_size, p5_scale, p5_offset]
  87.  
  88. def draw_bg():
  89.     scaled_bg = pygame.transform.scale(bg_img, (width, height))
  90.     screen.blit(scaled_bg, (0, 0))
  91.    
  92. def draw_text(text, font, color, x, y):
  93.     txt_surf = font.render(text, True, color)
  94.     screen.blit(txt_surf, (x, y))
  95.  
  96. def draw_healthbars(health, x, y):
  97.     ratio = health / 100
  98.     pygame.draw.rect(screen, (200, 200, 200), (x - 2, y - 2, 398, 48))
  99.     pygame.draw.rect(screen, (200, 0, 0), (x, y, 394, 44))
  100.     pygame.draw.rect(screen, (0, 200, 0), (x, y, 394 * ratio, 44))
  101.  
  102. def draw_menu():
  103.     screen.blit(menu_img, (0, 0))
  104.  
  105. class Fighter:
  106.     def __init__(self, player, x, y, l, b, flip, data, sheet, anim_steps):
  107.         self.player = player
  108.         self.rect = pygame.Rect((x, y, l, b))
  109.         self.vel_y = 0
  110.         self.jumping = False
  111.         self.attacking = False
  112.         self.running = False
  113.         self.hit = False
  114.         self.alive = True
  115.         self.attack_type = 0
  116.         self.attack_cooldown = 0
  117.         self.health = 100
  118.         self.flip = flip
  119.         self.size = data[0]
  120.         self.img_scale = data[1]
  121.         self.offset = data[2]
  122.         self.anim_list = self.load_images(sheet, anim_steps)
  123.         self.action = 3
  124.         self.frame_index = 0
  125.         self.image = self.anim_list[self.action][self.frame_index]
  126.         self.update = pygame.time.get_ticks()
  127.  
  128.     def load_images(self, sheet, anim_steps):
  129.         anim_list = []
  130.         for y, anim in enumerate(anim_steps):
  131.             temp_list = []
  132.             for x in range(anim):
  133.                 temp_img = sheet.subsurface(x * self.size, y * self.size, self.size, self.size)
  134.                 temp_list.append(pygame.transform.scale(temp_img, (self.size * self.img_scale, self.size * self.img_scale)))
  135.             anim_list.append(temp_list)
  136.         return anim_list
  137.  
  138.     def draw(self, surf):
  139.         flipped_img = pygame.transform.flip(self.image, self.flip, False)
  140.         surf.blit(flipped_img, (self.rect.x - (self.offset[0] * self.img_scale),
  141.                                  self.rect.y - (self.offset[1] * self.img_scale)))
  142.  
  143.     def move(self, scr_width, scr_height, target, round_over):
  144.         vel = 10
  145.         gravity = 2
  146.         dx = 0
  147.         dy = 0
  148.         self.running = False
  149.         self.attack_type = 0
  150.        
  151.         keys = pygame.key.get_pressed()
  152.        
  153.         if not self.attacking and self.alive and not round_over:
  154.             if self.player == 1:
  155.                 if keys[pygame.K_LEFT]:
  156.                     dx = -vel
  157.                     self.running = True
  158.                 elif keys[pygame.K_RIGHT]:
  159.                     dx = vel
  160.                     self.running = True
  161.                 if keys[pygame.K_UP] and not self.jumping:
  162.                     self.vel_y = -40
  163.                     self.jumping = True
  164.                 if keys[pygame.K_RCTRL] or keys[pygame.K_RSHIFT]:
  165.                     self.attack(target)
  166.                     if keys[pygame.K_RCTRL]:
  167.                         self.attack_type = 1
  168.                     elif keys[pygame.K_RSHIFT]:
  169.                         self.attack_type = 2
  170.                        
  171.             elif self.player == 2:
  172.                 if keys[pygame.K_a]:
  173.                     dx = -vel
  174.                     self.running = True
  175.                 elif keys[pygame.K_d]:
  176.                     dx = vel
  177.                     self.running = True
  178.                 if keys[pygame.K_w] and not self.jumping:
  179.                     self.vel_y = -40
  180.                     self.jumping = True
  181.                 if keys[pygame.K_LSHIFT] or keys[pygame.K_f]:
  182.                     self.attack(target)
  183.                     if keys[pygame.K_LSHIFT]:
  184.                         self.attack_type = 1
  185.                     elif keys[pygame.K_f]:
  186.                         self.attack_type = 2
  187.            
  188.             self.vel_y += gravity
  189.             dy += self.vel_y
  190.            
  191.             if self.rect.left + dx < 0:
  192.                 dx = -self.rect.left
  193.             elif self.rect.right + dx > scr_width:
  194.                 dx = scr_width - self.rect.right
  195.            
  196.             if target.rect.centerx > self.rect.centerx:
  197.                 self.flip = False
  198.             else:
  199.                 self.flip = True
  200.            
  201.             if self.rect.bottom + dy > scr_height - 60:
  202.                 self.vel_y = 0
  203.                 self.jumping = False
  204.                 dy = scr_height - 60 - self.rect.bottom
  205.                
  206.             self.rect.y += dy
  207.             self.rect.x += dx
  208.            
  209.             if self.attack_cooldown > 0:
  210.                 self.attack_cooldown -= 1
  211.  
  212.     def animation(self):
  213.         if self.health <= 0:
  214.             self.health = 0
  215.             self.update_action(5)
  216.         elif self.hit:
  217.             self.update_action(1)
  218.         elif self.attacking:
  219.             if self.attack_type == 1:
  220.                 self.update_action(6)
  221.             elif self.attack_type == 2:
  222.                 self.update_action(7)
  223.         elif self.jumping:
  224.             self.update_action(2)          
  225.         elif self.running:
  226.             self.update_action(0)
  227.         else:
  228.             self.update_action(3)
  229.        
  230.         anim_cooldown = 60
  231.         self.image = self.anim_list[self.action][self.frame_index]
  232.        
  233.         if pygame.time.get_ticks() - self.update > anim_cooldown:
  234.             self.frame_index += 1
  235.             self.update = pygame.time.get_ticks()
  236.             if self.frame_index >= len(self.anim_list[self.action]):
  237.                 if self.action == 5:
  238.                     self.frame_index = len(self.anim_list[self.action]) - 1
  239.                 else:
  240.                     self.frame_index = 0
  241.                     if self.action in [6, 7]:
  242.                         self.attacking = False
  243.                         self.attack_cooldown = 20
  244.                     if self.action == 1:
  245.                         self.hit = False
  246.                         self.attacking = False
  247.                         self.attack_cooldown = 20
  248.  
  249.     def update_action(self, new_action):
  250.         if new_action != self.action:
  251.             self.action = new_action
  252.             self.frame_index = 0
  253.             self.update = pygame.time.get_ticks()
  254.  
  255.     def attack(self, target):
  256.         if self.attack_cooldown == 0:
  257.             self.attacking = True
  258.             attacking_rect = pygame.Rect(self.rect.centerx - (2 * self.rect.width * self.flip), self.rect.y, 2 * self.rect.width, self.rect.height)
  259.             if attacking_rect.colliderect(target.rect):
  260.                 x_x_ = random.randint(0, 1)
  261.                 if x_x_ == 0:
  262.                     target.health -= 8
  263.                     x_x_ = random.randint(0, 1)
  264.                 elif x_x_ == 1:
  265.                     target.health -= 10
  266.                     x_x_ = random.randint(0, 1)
  267.                 target.hit = True
  268.                
  269.                 if self.player == 1:
  270.                     _ = random.randint(0, 1)
  271.                     if _ == 0:
  272.                         if not pygame.mixer.get_busy():
  273.                             pygame.mixer.stop()
  274.                         sword1_fx.play()
  275.                     else:
  276.                         if not pygame.mixer.get_busy():
  277.                             pygame.mixer.stop()
  278.                         sword2_fx.play()
  279.                        
  280.                 elif self.player == 2:
  281.                     _ = random.randint(0, 1)
  282.                     if _ == 0:
  283.                         if not pygame.mixer.get_busy():
  284.                             pygame.mixer.stop()
  285.                         hit1_fx.play()
  286.                     else:
  287.                         if not pygame.mixer.get_busy():
  288.                             pygame.mixer.stop()
  289.                         hit2_fx.play()
  290.                
  291.             if not attacking_rect.colliderect(target.rect):
  292.                 _ = random.randint(0, 1)
  293.                 if _ == 0:
  294.                     if not pygame.mixer.get_busy():
  295.                         pygame.mixer.stop()
  296.                     miss1_fx.play()
  297.                 else:
  298.                     if not pygame.mixer.get_busy():
  299.                         pygame.mixer.stop()
  300.                     miss2_fx.play()
  301.  
  302. fighter1 = Fighter(1, 200, 380, 80, 160, False, p1_data, p1_sprite_sheet, p1_anim_steps)
  303. fighter2 = Fighter(2, 700, 380, 80, 160, True, p2_data, p2_sprite_sheet, p2_anim_steps)
  304.  
  305. state = 'menu'
  306. is_fight_fx_playing = False
  307. play_rect = play_img.get_rect()
  308. quit_rect = quit_img.get_rect()
  309.  
  310. while True:
  311.     keys = pygame.key.get_pressed()
  312.    
  313.     for event in pygame.event.get():
  314.         if event.type == pygame.QUIT:
  315.             pygame.quit()
  316.             exit()
  317.            
  318.         if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
  319.             if state == 'menu':
  320.                 if play_rect.collidepoint(event.pos):
  321.                     state = 'play'
  322.                     fighter1 = Fighter(1, 200, 380, 80, 160, False, p1_data, p1_sprite_sheet, p1_anim_steps)
  323.                     fighter2 = Fighter(2, 700, 380, 80, 160, True, p2_data, p2_sprite_sheet, p2_anim_steps)
  324.                 elif quit_rect.collidepoint(event.pos):
  325.                     pygame.quit()
  326.                     exit()
  327.  
  328.     if state == 'menu':
  329.         draw_menu()
  330.         if not pygame.mixer.get_busy():
  331.             pygame.mixer.stop()
  332.             bgm.play(loops=-1)
  333.        
  334.         angle1 += 0.03125
  335.         angle2 -= 0.03125
  336.    
  337.         x1 = center_x1 + loop_width1 * math.sin(angle1)
  338.         y1 = center_y1 + loop_height1 * math.sin(2 * angle1)  
  339.         x2 = center_x2 + loop_width2 * math.sin(angle2)
  340.         y2 = center_y2 + loop_height2 * math.sin(2 * angle2)  
  341.        
  342.         txt_rect = txt_img.get_rect(center=(x1, y1))
  343.         play_rect = play_img.get_rect(center=(x2, y2 - 110))
  344.         quit_rect = quit_img.get_rect(center=(x2, y2))
  345.  
  346.         screen.blit(play_img, play_rect)
  347.         screen.blit(quit_img, quit_rect)
  348.         screen.blit(txt_img, txt_rect)
  349.                    
  350.     elif state == 'play':  
  351.              
  352.         draw_bg()
  353.         bgm.stop()
  354.        
  355.         angle2 -= 0.03125  
  356.         x3 = center_x3 + loop_width2 * math.sin(angle2)
  357.         y3 = center_y3 + loop_height2 * math.sin(2 * angle2)
  358.        
  359.         scaled_quit = pygame.transform.scale(quit_img, (110, 40))
  360.        
  361.         quit_rect_ = scaled_quit.get_rect(center=(x3, y3))
  362.        
  363.         screen.blit(scaled_quit, quit_rect_)
  364.        
  365.         if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
  366.             if quit_rect_.collidepoint(event.pos):
  367.                         pygame.quit()
  368.                         exit()
  369.        
  370.         draw_healthbars(fighter1.health, 6, 12)
  371.         draw_healthbars(fighter2.health, 532, 12)
  372.         draw_text(str(score[0]), font2, (230, 230, 230), 400, 10)
  373.         draw_text(str(score[1]), font2, (230, 230, 230), 490, 10)
  374.        
  375.         fighter1.animation()
  376.         fighter2.animation()
  377.        
  378.         fighter1.draw(screen)
  379.         fighter2.draw(screen)
  380.        
  381.         if not roundover:
  382.             if fighter1.health <= 0:
  383.                 score[1] += 1
  384.                 roundover = True
  385.                 roundover_time = pygame.time.get_ticks()
  386.             elif fighter2.health <= 0:
  387.                 score[0] += 1
  388.                 roundover = True
  389.                 roundover_time = pygame.time.get_ticks()
  390.                
  391.         elif roundover:
  392.             victory = font1.render("VICTORY", True, (220, 0, 0))
  393.             screen.blit(victory, (200, height / 3))
  394.            
  395.             if pygame.time.get_ticks() - roundover_time > roundover_cooldown:
  396.                 intro_count = 3
  397.                 roundover = False
  398.                 is_fight_fx_playing = False
  399.                 fighter1 = Fighter(1, 200, 380, 80, 160, False, p1_data, p1_sprite_sheet, p1_anim_steps)
  400.                 fighter2 = Fighter(2, 700, 380, 80, 160, True, p2_data, p2_sprite_sheet, p2_anim_steps)
  401.        
  402.         if intro_count <= 0:
  403.             if not pygame.mixer.get_busy():
  404.                 pygame.mixer.stop()
  405.                 if not is_fight_fx_playing:
  406.                     fight_fx.play()  
  407.                     is_fight_fx_playing = True
  408.             fighter1.move(width, height, fighter2, roundover)
  409.             fighter2.move(width, height, fighter1, roundover)
  410.            
  411.         else:
  412.             draw_text(str(intro_count), font1, (200, 200, 200), width / 2, height / 3)
  413.             if (pygame.time.get_ticks() - last_count) >= 1000:
  414.                 intro_count -= 1
  415.                 last_count = pygame.time.get_ticks()
  416.    
  417.     pygame.display.update()
  418.    
  419.     clock.tick(FPS)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement