Fifa by Gemini
unknown
python
16 days ago
25 kB
8
Indexable
import pygame import sys import math import random import numpy # Dla generowania dźwięku # --- Skalowanie --- SCALE_FACTOR = 1.5 # Inicjalizacja Pygame pygame.init() pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=512) # Ustawienia ekranu SCREEN_WIDTH = int(800 * SCALE_FACTOR) SCREEN_HEIGHT = int(600 * SCALE_FACTOR) screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("Prosta Piłka Nożna v1.5 - Stylowi Bramkarze!") # Kolory BLACK = (0, 0, 0) WHITE = (255, 255, 255) GREEN = (0, 128, 0) DARK_GREEN = (0, 100, 0) RED = (200, 0, 0) # Kolor Drużyny 2 (AI) BLUE = (0, 0, 200) # Kolor Drużyny 1 (Gracz) YELLOW = (255, 255, 0) SKIN_TONE = (230, 190, 135) GOALIE_JERSEY_COLOR_1 = (50, 150, 50) # Zielony strój bramkarza drużyny 1 GOALIE_JERSEY_COLOR_2 = (130, 60, 130) # Fioletowy strój bramkarza drużyny 2 # Ustawienia gry FPS = 60 clock = pygame.time.Clock() FONT_SIZE_LARGE = int(74 * SCALE_FACTOR) FONT_SIZE_SMALL = int(36 * SCALE_FACTOR) FONT_SIZE_TIMER = int(48 * SCALE_FACTOR) FONT = pygame.font.Font(None, FONT_SIZE_LARGE) SMALL_FONT = pygame.font.Font(None, FONT_SIZE_SMALL) TIMER_FONT = pygame.font.Font(None, FONT_SIZE_TIMER) mixer_init_result = pygame.mixer.get_init() _SAMPLE_SIZE_BITS = abs(mixer_init_result[1]) if mixer_init_result and mixer_init_result[1] != 0 else 16 def generate_beep_sound_corrected(frequency=440, duration_ms=100): # Bez zmian sample_rate = pygame.mixer.get_init()[0] num_samples = int(sample_rate * duration_ms / 1000.0) buf = numpy.zeros((num_samples, 2), dtype=numpy.int16) max_sample = 2**(_SAMPLE_SIZE_BITS - 1) - 1 for i in range(num_samples): t = float(i) / sample_rate buf[i][0] = int(max_sample * math.sin(2 * math.pi * frequency * t)) buf[i][1] = int(max_sample * math.sin(2 * math.pi * frequency * t)) return pygame.sndarray.make_sound(buf) try: # Bez zmian KICK_SOUND = generate_beep_sound_corrected(660, 70) GOAL_SOUND = generate_beep_sound_corrected(880, 300) WALL_HIT_SOUND = generate_beep_sound_corrected(220, 50) WHISTLE_SOUND = generate_beep_sound_corrected(1200, 500) except Exception as e: print(f"Nie udało się wygenerować dźwięków: {e}") KICK_SOUND, GOAL_SOUND, WALL_HIT_SOUND, WHISTLE_SOUND = None, None, None, None # Stany gry i czas (bez zmian) GAME_STATE_KICK_OFF = "KICK_OFF" GAME_STATE_PLAYING = "PLAYING" GAME_STATE_FULL_TIME = "FULL_TIME" GAME_STATE_SHOW_MESSAGE = "SHOW_MESSAGE" current_game_state = GAME_STATE_KICK_OFF message_text = "Przygotuj się!" message_duration_frames = FPS * 2 next_state_after_message = GAME_STATE_PLAYING HALF_DURATION_SECONDS = 60 half_timer = HALF_DURATION_SECONDS current_half = 1 player1_attacks_right_goal = True # Ustawienia boiska (bez zmian) PITCH_MARGIN = int(50 * SCALE_FACTOR) LINE_THICKNESS = int(5 * SCALE_FACTOR) PITCH_RECT = pygame.Rect(PITCH_MARGIN, PITCH_MARGIN, SCREEN_WIDTH - 2 * PITCH_MARGIN, SCREEN_HEIGHT - 2 * PITCH_MARGIN) CENTER_CIRCLE_RADIUS = int(50 * SCALE_FACTOR) GOAL_POST_THICKNESS = int(10 * SCALE_FACTOR) GOAL_OPENING_DEPTH = int(15*SCALE_FACTOR) GOAL_HEIGHT = int(150 * SCALE_FACTOR) PHYS_LEFT_GOAL_RECT = pygame.Rect(PITCH_RECT.left - GOAL_OPENING_DEPTH, PITCH_RECT.centery - GOAL_HEIGHT // 2, GOAL_OPENING_DEPTH, GOAL_HEIGHT) PHYS_RIGHT_GOAL_RECT = pygame.Rect(PITCH_RECT.right, PITCH_RECT.centery - GOAL_HEIGHT // 2, GOAL_OPENING_DEPTH, GOAL_HEIGHT) VIS_LEFT_GOAL_POSTS = pygame.Rect(PITCH_RECT.left - GOAL_POST_THICKNESS + LINE_THICKNESS, PITCH_RECT.centery - GOAL_HEIGHT // 2, GOAL_POST_THICKNESS, GOAL_HEIGHT) VIS_RIGHT_GOAL_POSTS = pygame.Rect(PITCH_RECT.right - LINE_THICKNESS, PITCH_RECT.centery - GOAL_HEIGHT // 2, GOAL_POST_THICKNESS, GOAL_HEIGHT) class Player(pygame.sprite.Sprite): # Bez zmian def __init__(self, x, y, color, control_keys=None, is_ai=False): super().__init__() self.original_color = color self.player_width = int(20 * SCALE_FACTOR) self.player_height = int(30 * SCALE_FACTOR) self.image = pygame.Surface([self.player_width, self.player_height], pygame.SRCALPHA) self.image.fill((0,0,0,0)) torso_height = self.player_height * 0.7 torso_width = self.player_width * 0.8 torso_y_offset = self.player_height - torso_height torso_rect_params = pygame.Rect((self.player_width - torso_width) / 2, torso_y_offset, torso_width, torso_height) pygame.draw.rect(self.image, self.original_color, torso_rect_params, border_radius=int(3 * SCALE_FACTOR)) head_radius = self.player_width * 0.33 head_center_x = self.player_width / 2 head_center_y = torso_y_offset - head_radius + int(2*SCALE_FACTOR) pygame.draw.circle(self.image, SKIN_TONE, (head_center_x, head_center_y), head_radius) pygame.draw.circle(self.image, tuple(c*0.8 for c in self.original_color), (head_center_x, head_center_y), head_radius, int(1*SCALE_FACTOR)) self.rect = self.image.get_rect() self.initial_pos = (x,y) self.rect.center = self.initial_pos self.speed = int(5 * SCALE_FACTOR) self.control_keys = control_keys self.is_ai = is_ai def reset_position(self, new_initial_pos=None): if new_initial_pos: self.initial_pos = new_initial_pos self.rect.center = self.initial_pos def update(self, ball): # Bez zmian w tej sekcji (poprawki AI były wcześniej) if self.control_keys: keys = pygame.key.get_pressed() if keys[self.control_keys['up']]: self.rect.y -= self.speed if keys[self.control_keys['down']]: self.rect.y += self.speed if keys[self.control_keys['left']]: self.rect.x -= self.speed if keys[self.control_keys['right']]: self.rect.x += self.speed elif self.is_ai: target_x = ball.rect.centerx target_y = ball.rect.centery ai_speed_factor = 0.65 current_ai_speed = self.speed * ai_speed_factor boundary_safety_margin = self.player_height * 0.5 ball_near_boundary_margin = ball.radius + int(5 * SCALE_FACTOR) is_ai_roughly_aligned_with_ball_x = abs(self.rect.centerx - ball.rect.centerx) < self.player_width * 2.5 is_stuck_top = (ball.rect.top < PITCH_RECT.top + ball_near_boundary_margin and \ self.rect.top < PITCH_RECT.top + boundary_safety_margin and \ is_ai_roughly_aligned_with_ball_x and \ self.rect.centery < ball.rect.centery + ball.radius) is_stuck_bottom = (ball.rect.bottom > PITCH_RECT.bottom - ball_near_boundary_margin and \ self.rect.bottom > PITCH_RECT.bottom - boundary_safety_margin and \ is_ai_roughly_aligned_with_ball_x and \ self.rect.centery > ball.rect.centery - ball.radius) if is_stuck_top or is_stuck_bottom: current_ai_speed *= 0.9 if is_stuck_top: target_y = ball.rect.centery + self.player_height else: target_y = ball.rect.centery - self.player_height ai_attacks_left_goal = not player1_attacks_right_goal if self.original_color == RED else player1_attacks_right_goal if ai_attacks_left_goal: target_x = ball.rect.centerx + self.player_width * 1.5 if ball.rect.centerx > PITCH_RECT.centerx: target_x = PITCH_RECT.centerx else: target_x = ball.rect.centerx - self.player_width * 1.5 if ball.rect.centerx < PITCH_RECT.centerx: target_x = PITCH_RECT.centerx if self.rect.centerx < target_x: self.rect.x += current_ai_speed elif self.rect.centerx > target_x: self.rect.x -= current_ai_speed if self.rect.centery < target_y: self.rect.y += current_ai_speed elif self.rect.centery > target_y: self.rect.y -= current_ai_speed self.rect.clamp_ip(PITCH_RECT) class Goalkeeper(pygame.sprite.Sprite): # ZMODYFIKOWANY WYGLĄD def __init__(self, jersey_color, team_color_for_head_outline, own_goal_rect, movement_area_rect): super().__init__() self.jersey_color = jersey_color # Główny kolor koszulki bramkarza self.team_base_color = team_color_for_head_outline # Kolor drużyny (np. na obwódkę głowy) self.width = int(22 * SCALE_FACTOR) self.height = int(32 * SCALE_FACTOR) self.image = pygame.Surface([self.width, self.height], pygame.SRCALPHA) self.image.fill((0,0,0,0)) # Tułów (koszulka w paski) torso_height_abs = self.height * 0.7 torso_width_abs = self.width * 0.9 # Tułów bramkarza nieco szerszy torso_y_offset_abs = self.height - torso_height_abs torso_left_abs = (self.width - torso_width_abs) / 2 stripe_color1 = self.jersey_color # Drugi kolor paska - kontrastujący if sum(stripe_color1) / 3 > 160: # Jeśli główny kolor jest stosunkowo jasny stripe_color2 = tuple(max(0, c - 60) for c in stripe_color1) # Ciemniejszy odcień lub czarny if sum(stripe_color2) / 3 > 100 : stripe_color2 = (40,40,40) # Jeśli nadal za jasny, daj ciemnoszary else: # Jeśli główny kolor jest ciemny stripe_color2 = tuple(min(255, c + 80) for c in stripe_color1) # Jaśniejszy odcień lub biały if sum(stripe_color2) / 3 < 150 : stripe_color2 = (220,220,220) # Jeśli nadal za ciemny, daj jasnoszary num_vertical_stripes = 5 single_stripe_width = torso_width_abs / num_vertical_stripes for i in range(num_vertical_stripes): s_x = torso_left_abs + i * single_stripe_width current_s_color = stripe_color1 if i % 2 == 0 else stripe_color2 s_w = single_stripe_width if i == num_vertical_stripes - 1: # Ostatni pasek - dociągnij do krawędzi s_w = torso_left_abs + torso_width_abs - s_x stripe_rect = pygame.Rect(s_x, torso_y_offset_abs, s_w, torso_height_abs) pygame.draw.rect(self.image, current_s_color, stripe_rect) # Głowa (podobna do zawodnika z pola) head_radius_abs = self.width * 0.30 head_center_x_abs = self.width / 2 head_center_y_abs = torso_y_offset_abs - head_radius_abs + int(2*SCALE_FACTOR) pygame.draw.circle(self.image, SKIN_TONE, (head_center_x_abs, head_center_y_abs), head_radius_abs) pygame.draw.circle(self.image, tuple(c*0.8 for c in self.team_base_color), (head_center_x_abs, head_center_y_abs), head_radius_abs, int(1*SCALE_FACTOR)) self.rect = self.image.get_rect() self.movement_area = movement_area_rect self.rect.center = self.movement_area.center self.speed = int(4.5 * SCALE_FACTOR) self.own_goal_rect = own_goal_rect def update(self, ball): # Bez zmian target_y = ball.rect.centery if self.rect.centery < target_y: self.rect.y += self.speed elif self.rect.centery > target_y: self.rect.y -= self.speed self.rect.clamp_ip(self.movement_area) def reset_position(self): # Bez zmian self.rect.center = self.movement_area.center class Ball(pygame.sprite.Sprite): # Bez zmian def __init__(self, x, y): super().__init__() self.radius = int(7 * SCALE_FACTOR) self.image = pygame.Surface([self.radius*2, self.radius*2], pygame.SRCALPHA) self.image.fill((0,0,0,0)) pygame.draw.circle(self.image, YELLOW, (self.radius, self.radius), self.radius) pygame.draw.circle(self.image, BLACK, (self.radius, self.radius), self.radius, int(1*SCALE_FACTOR)) self.rect = self.image.get_rect() self.rect.center = (x, y) self.velocity_x = 0 self.velocity_y = 0 self.max_speed = int(8 * SCALE_FACTOR) self.friction = 0.985 def update(self): # Bez zmian self.rect.x += self.velocity_x self.rect.y += self.velocity_y self.velocity_x *= self.friction self.velocity_y *= self.friction if abs(self.velocity_x) < 0.1: self.velocity_x = 0 if abs(self.velocity_y) < 0.1: self.velocity_y = 0 if self.rect.top < PITCH_RECT.top + LINE_THICKNESS: self.rect.top = PITCH_RECT.top + LINE_THICKNESS; self.velocity_y *= -1 if WALL_HIT_SOUND: WALL_HIT_SOUND.play() elif self.rect.bottom > PITCH_RECT.bottom - LINE_THICKNESS: self.rect.bottom = PITCH_RECT.bottom - LINE_THICKNESS; self.velocity_y *= -1 if WALL_HIT_SOUND: WALL_HIT_SOUND.play() is_aligned_with_left_goal_y = PHYS_LEFT_GOAL_RECT.top <= self.rect.centery <= PHYS_LEFT_GOAL_RECT.bottom is_aligned_with_right_goal_y = PHYS_RIGHT_GOAL_RECT.top <= self.rect.centery <= PHYS_RIGHT_GOAL_RECT.bottom if self.rect.left < PITCH_RECT.left + LINE_THICKNESS: if not (is_aligned_with_left_goal_y and self.rect.right > PHYS_LEFT_GOAL_RECT.right - self.radius * 2): self.rect.left = PITCH_RECT.left + LINE_THICKNESS; self.velocity_x *= -1 if WALL_HIT_SOUND: WALL_HIT_SOUND.play() elif self.rect.right > PITCH_RECT.right - LINE_THICKNESS: if not (is_aligned_with_right_goal_y and self.rect.left < PHYS_RIGHT_GOAL_RECT.left + self.radius * 2): self.rect.right = PITCH_RECT.right - LINE_THICKNESS; self.velocity_x *= -1 if WALL_HIT_SOUND: WALL_HIT_SOUND.play() def kick(self, kicker_rect, kicker_type="field_player"): # Bez zmian if KICK_SOUND: KICK_SOUND.play() kick_strength_factor = 1.25 if kicker_type == "goalie": kick_strength_factor = 1.0 is_left_goalie = kicker_rect.centerx < SCREEN_WIDTH / 2 kick_direction_x = 1 if is_left_goalie else -1 offset_y = (self.rect.centery - kicker_rect.centery) if abs(offset_y) < kicker_rect.height / 4 : offset_y = random.uniform(-self.radius * 2, self.radius * 2) angle = math.atan2(offset_y, kick_direction_x * (PITCH_RECT.width / 4) ) else: angle = math.atan2(self.rect.centery - kicker_rect.centery, self.rect.centerx - kicker_rect.centerx) kick_strength = self.max_speed * kick_strength_factor self.velocity_x = kick_strength * math.cos(angle) self.velocity_y = kick_strength * math.sin(angle) speed = math.hypot(self.velocity_x, self.velocity_y) if speed > kick_strength: self.velocity_x = (self.velocity_x / speed) * kick_strength self.velocity_y = (self.velocity_y / speed) * kick_strength overlap_iterations = 0 max_overlap_iterations = 15 push_angle = math.atan2(self.rect.centery - kicker_rect.centery, self.rect.centerx - kicker_rect.centerx) while self.rect.colliderect(kicker_rect) and overlap_iterations < max_overlap_iterations: self.rect.x += math.cos(push_angle) self.rect.y += math.sin(push_angle) overlap_iterations += 1 if self.rect.colliderect(kicker_rect) : kicker_radius_approx = max(kicker_rect.width, kicker_rect.height) / 2 required_sep = kicker_radius_approx + self.radius + int(3*SCALE_FACTOR) self.rect.centerx = kicker_rect.centerx + math.cos(push_angle) * required_sep self.rect.centery = kicker_rect.centery + math.sin(push_angle) * required_sep def reset(self): # Bez zmian self.rect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2) self.velocity_x = 0; self.velocity_y = 0 # Tworzenie obiektów (bez zmian w logice, tylko przekazanie dodatkowego koloru do Goalkeeper) all_sprites = pygame.sprite.Group() players_group = pygame.sprite.Group() goalies_group = pygame.sprite.Group() P1_START_POS_LEFT = (PITCH_RECT.centerx - int(200 * SCALE_FACTOR), PITCH_RECT.centery) P1_START_POS_RIGHT = (PITCH_RECT.centerx + int(200 * SCALE_FACTOR), PITCH_RECT.centery) AI_START_POS_LEFT = (PITCH_RECT.centerx - int(200 * SCALE_FACTOR), PITCH_RECT.centery) AI_START_POS_RIGHT = (PITCH_RECT.centerx + int(200 * SCALE_FACTOR), PITCH_RECT.centery) player1_keys = {'up': pygame.K_w, 'down': pygame.K_s, 'left': pygame.K_a, 'right': pygame.K_d} player1 = Player(P1_START_POS_LEFT[0], P1_START_POS_LEFT[1], BLUE, player1_keys) player2 = Player(AI_START_POS_RIGHT[0], AI_START_POS_RIGHT[1], RED, is_ai=True) ball = Ball(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2) all_sprites.add(player1, player2, ball) players_group.add(player1, player2) GOALIE_AREA_WIDTH = int(30 * SCALE_FACTOR) GOALIE_AREA_OFFSET_X = int(10 * SCALE_FACTOR) left_goalie_movement_area = pygame.Rect(PHYS_LEFT_GOAL_RECT.right - GOALIE_AREA_OFFSET_X, PHYS_LEFT_GOAL_RECT.top, GOALIE_AREA_WIDTH, PHYS_LEFT_GOAL_RECT.height) right_goalie_movement_area = pygame.Rect(PHYS_RIGHT_GOAL_RECT.left - GOALIE_AREA_WIDTH + GOALIE_AREA_OFFSET_X, PHYS_RIGHT_GOAL_RECT.top, GOALIE_AREA_WIDTH, PHYS_RIGHT_GOAL_RECT.height) # Przy tworzeniu bramkarzy przekazujemy teraz kolor drużyny dla obwódki głowy goalie1 = Goalkeeper(GOALIE_JERSEY_COLOR_1, BLUE, PHYS_LEFT_GOAL_RECT, left_goalie_movement_area) goalie2 = Goalkeeper(GOALIE_JERSEY_COLOR_2, RED, PHYS_RIGHT_GOAL_RECT, right_goalie_movement_area) all_sprites.add(goalie1, goalie2) goalies_group.add(goalie1, goalie2) score_player1 = 0 score_player2 = 0 def setup_half(): # Zmodyfikowano, aby przekazać team_base_color (choć jest stały dla instancji) ball.reset() if player1_attacks_right_goal: player1.reset_position(P1_START_POS_LEFT) goalie1.movement_area = left_goalie_movement_area; goalie1.own_goal_rect = PHYS_LEFT_GOAL_RECT; goalie1.team_base_color = BLUE; goalie1.reset_position() player2.reset_position(AI_START_POS_RIGHT) goalie2.movement_area = right_goalie_movement_area; goalie2.own_goal_rect = PHYS_RIGHT_GOAL_RECT; goalie2.team_base_color = RED; goalie2.reset_position() else: player1.reset_position(P1_START_POS_RIGHT) goalie1.movement_area = right_goalie_movement_area; goalie1.own_goal_rect = PHYS_RIGHT_GOAL_RECT; goalie1.team_base_color = BLUE; goalie1.reset_position() player2.reset_position(AI_START_POS_LEFT) goalie2.movement_area = left_goalie_movement_area; goalie2.own_goal_rect = PHYS_LEFT_GOAL_RECT; goalie2.team_base_color = RED; goalie2.reset_position() setup_half() # Funkcje rysujące i pętla główna (bez zmian) def draw_pitch(): screen.fill(DARK_GREEN) pygame.draw.rect(screen, GREEN, PITCH_RECT) pygame.draw.rect(screen, WHITE, PITCH_RECT, LINE_THICKNESS) pygame.draw.line(screen, WHITE, (PITCH_RECT.centerx, PITCH_RECT.top), (PITCH_RECT.centerx, PITCH_RECT.bottom), LINE_THICKNESS) pygame.draw.circle(screen, WHITE, PITCH_RECT.center, CENTER_CIRCLE_RADIUS, LINE_THICKNESS) pygame.draw.rect(screen, WHITE, VIS_LEFT_GOAL_POSTS) pygame.draw.rect(screen, WHITE, VIS_RIGHT_GOAL_POSTS) def draw_scores(): score1_text = SMALL_FONT.render(str(score_player1), True, WHITE) score2_text = SMALL_FONT.render(str(score_player2), True, WHITE) screen.blit(score1_text, (PITCH_MARGIN + int(20*SCALE_FACTOR), int(10*SCALE_FACTOR))) screen.blit(score2_text, (SCREEN_WIDTH - PITCH_MARGIN - int(40*SCALE_FACTOR) - score2_text.get_width()/2 , int(10*SCALE_FACTOR))) def draw_timer(): timer_text_str = "" if current_game_state == GAME_STATE_PLAYING: minutes = int(half_timer) // 60 seconds = int(half_timer) % 60 timer_text_str = f"{minutes:02}:{seconds:02}" elif message_text == "Przerwa! Zmiana stron.": timer_text_str = "PRZERWA" elif current_game_state == GAME_STATE_FULL_TIME or message_text.startswith("Koniec Meczu!"): timer_text_str = "KONIEC" elif current_game_state == GAME_STATE_KICK_OFF or current_game_state == GAME_STATE_SHOW_MESSAGE: if message_text == "Przygotuj się!": timer_text_str = "START" elif "GOL!" in message_text: timer_text_str = "GOL!" else: timer_text_str = "1. POŁOWA" if current_half == 1 else "2. POŁOWA" timer_surface = TIMER_FONT.render(timer_text_str, True, YELLOW) timer_rect = timer_surface.get_rect(center=(SCREEN_WIDTH / 2, PITCH_MARGIN / 2 + int(5*SCALE_FACTOR) )) screen.blit(timer_surface, timer_rect) def show_message_and_set_next_state(msg_text, duration_sec, next_state): global current_game_state, message_text, message_duration_frames, next_state_after_message current_game_state = GAME_STATE_SHOW_MESSAGE message_text = msg_text message_duration_frames = FPS * duration_sec next_state_after_message = next_state running = True show_message_and_set_next_state("Przygotuj się!", 2, GAME_STATE_KICK_OFF) while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if current_game_state == GAME_STATE_SHOW_MESSAGE: message_duration_frames -= 1 if message_duration_frames <= 0: current_game_state = next_state_after_message if current_game_state == GAME_STATE_KICK_OFF or \ (current_game_state == GAME_STATE_PLAYING and ("GOL!" in message_text or "Rozpoczęcie" in message_text or "Przygotuj się!" in message_text)): setup_half() if WHISTLE_SOUND and ("Rozpoczęcie" in message_text or "Przygotuj się!" in message_text): WHISTLE_SOUND.play() elif current_game_state == GAME_STATE_KICK_OFF: show_message_and_set_next_state(f"Rozpoczęcie {current_half}. połowy!", 2, GAME_STATE_PLAYING) elif current_game_state == GAME_STATE_PLAYING: half_timer -= 1 / FPS if half_timer <= 0: if WHISTLE_SOUND: WHISTLE_SOUND.play() if current_half == 1: current_half = 2 player1_attacks_right_goal = not player1_attacks_right_goal half_timer = HALF_DURATION_SECONDS show_message_and_set_next_state("Przerwa! Zmiana stron.", 3, GAME_STATE_KICK_OFF) else: current_game_state = GAME_STATE_FULL_TIME final_msg = f"Koniec Meczu! Wynik: {score_player1} - {score_player2}" show_message_and_set_next_state(final_msg, 10, GAME_STATE_FULL_TIME) else: for player_sprite in players_group: player_sprite.update(ball) for goalie_sprite in goalies_group: goalie_sprite.update(ball) ball.update() for player_sprite in players_group: if pygame.sprite.collide_rect(player_sprite, ball): ball.kick(player_sprite.rect, kicker_type="field_player") for goalie_sprite in goalies_group: if pygame.sprite.collide_rect(goalie_sprite, ball): ball.kick(goalie_sprite.rect, kicker_type="goalie") goal_this_frame = False; msg_on_goal = "" if player1_attacks_right_goal: if PHYS_RIGHT_GOAL_RECT.colliderect(ball.rect): score_player1 += 1; goal_this_frame = True; msg_on_goal = "GRACZ 1 GOL!" elif PHYS_LEFT_GOAL_RECT.colliderect(ball.rect): score_player2 += 1; goal_this_frame = True; msg_on_goal = "AI GOL!" else: if PHYS_LEFT_GOAL_RECT.colliderect(ball.rect): score_player1 += 1; goal_this_frame = True; msg_on_goal = "GRACZ 1 GOL!" elif PHYS_RIGHT_GOAL_RECT.colliderect(ball.rect): score_player2 += 1; goal_this_frame = True; msg_on_goal = "AI GOL!" if goal_this_frame: if GOAL_SOUND: GOAL_SOUND.play() show_message_and_set_next_state(msg_on_goal, 2, GAME_STATE_PLAYING) elif current_game_state == GAME_STATE_FULL_TIME: pass draw_pitch() all_sprites.draw(screen) draw_scores() draw_timer() if current_game_state == GAME_STATE_SHOW_MESSAGE: text_surface = FONT.render(message_text, True, YELLOW) text_rect = text_surface.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2)) bg_rect = text_rect.inflate(int(20*SCALE_FACTOR), int(20*SCALE_FACTOR)) bg_shadow_rect = bg_rect.move(int(3*SCALE_FACTOR), int(3*SCALE_FACTOR)) pygame.draw.rect(screen, (0,0,0,150) if bg_shadow_rect.width > 0 and bg_shadow_rect.height > 0 else BLACK, bg_shadow_rect) pygame.draw.rect(screen, BLACK, bg_rect) pygame.draw.rect(screen, YELLOW, bg_rect, int(3*SCALE_FACTOR)) screen.blit(text_surface, text_rect) pygame.display.flip() clock.tick(FPS) pygame.quit() sys.exit()
Editor is loading...
Leave a Comment