Upload files to "/"

faili
Diāna Dorogova 2026-02-23 07:41:38 +00:00
parent 3a2d0bca87
commit 353ae21df2
3 changed files with 493 additions and 433 deletions

Binary file not shown.

Binary file not shown.

926
game.py
View File

@ -1,434 +1,494 @@
import pygame import pygame
import random import random
import sys
# --- Inicializācija ---
pygame.init() # --- Inicializācija ---
pygame.init()
# Ekrāna iestatījumi
WIDTH, HEIGHT = 1024, 576 # Ekrāna iestatījumi
SCREEN = pygame.display.set_mode((WIDTH, HEIGHT)) WIDTH, HEIGHT = 1024, 576
pygame.display.set_caption("Pixel Kombat: Ultimate") SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))
CLOCK = pygame.time.Clock() pygame.display.set_caption("Pixel Kombat: Ultimate")
CLOCK = pygame.time.Clock()
# --- Krāsas (PIEVIENOTS RED UN BLUE) ---
WHITE = (255, 255, 255) # --- Krāsas ---
BLACK = (0, 0, 0) WHITE = (255, 255, 255)
RED = (255, 0, 0) # <--- Šis trūka BLACK = (0, 0, 0)
BLUE = (0, 0, 255) # <--- Papildus RED = (255, 0, 0)
GRAY = (50, 50, 50) BLUE = (0, 0, 255)
DARK_GRAY = (20, 20, 20) GRAY = (50, 50, 50)
YELLOW = (255, 215, 0) DARK_GRAY = (20, 20, 20)
BROWN = (139, 69, 19) YELLOW = (255, 215, 0)
GREEN = (50, 200, 50) BROWN = (139, 69, 19)
CYAN = (0, 255, 255) GREEN = (50, 200, 50)
PURPLE = (160, 32, 240) CYAN = (0, 255, 255)
PURPLE = (160, 32, 240)
# Pieejamās raksturu krāsas (saraksts)
COLORS = [ # Pieejamās raksturu krāsas
(235, 64, 52), # Red COLORS = [
(52, 119, 235), # Blue (235, 64, 52), # Red
(52, 235, 86), # Green (52, 119, 235), # Blue
(255, 215, 0), # Gold (52, 235, 86), # Green
(160, 32, 240), # Purple (255, 215, 0), # Gold
(255, 105, 180) # Pink (160, 32, 240), # Purple
] (255, 105, 180) # Pink
]
# --- Fonti ---
try: # --- Fonti (ar rezerves variantu) ---
FONT_BIG = pygame.font.Font(None, 74) def get_font(name, size):
FONT_MED = pygame.font.Font(None, 50) try:
FONT_SMALL = pygame.font.Font(None, 32) return pygame.font.Font(name, size)
except: except FileNotFoundError:
FONT_BIG = pygame.font.SysFont("Arial", 74) # Ja fonts nav atrasts, izmanto noklusējuma sistēmas fontu
FONT_MED = pygame.font.SysFont("Arial", 50) return pygame.font.SysFont('arial', size)
FONT_SMALL = pygame.font.SysFont("Arial", 32)
FONT_BIG = get_font("Act_Of_Rejection.ttf", 80)
# --- Globālie mainīgie (Spēles stāvokļi) --- FONT_MED = get_font("PressStart2P-Regular.ttf", 36)
STATE = "MENU" # MENU, CHAR_SELECT, BG_SELECT, DIALOGUE, GAME, GAMEOVER FONT_SMALL = get_font("PressStart2P-Regular.ttf", 20)
SELECTED_BG = "CITY" FONT_TINY = get_font("PressStart2P-Regular.ttf", 14)
P1_COLOR = COLORS[0] # Noklusējums
P2_COLOR = COLORS[1] # Noklusējums # --- Globālie mainīgie (Spēles stāvokļi) ---
STATE = "MENU" # MENU, CHAR_SELECT, BG_SELECT, DIALOGUE, GAME, GAMEOVER
# --- UI Klases --- SELECTED_BG = "CITY"
P1_COLOR = COLORS[0] # Noklusējums
class Button: P2_COLOR = COLORS[1] # Noklusējums
def __init__(self, x, y, w, h, text, color, hover_color, action_code):
self.rect = pygame.Rect(x, y, w, h) # --- Fona Ģenerators (Lai novērstu mirgošanu) ---
self.text = text BG_ELEMENTS = []
self.color = color
self.hover_color = hover_color def generate_bg_elements(bg_name):
self.action_code = action_code global BG_ELEMENTS
BG_ELEMENTS = []
def draw(self, surface): if bg_name == "CITY":
mouse_pos = pygame.mouse.get_pos() for i in range(5):
color = self.hover_color if self.rect.collidepoint(mouse_pos) else self.color w = random.randint(80, 150)
h = random.randint(200, 400)
pygame.draw.rect(surface, color, self.rect) x = i * (WIDTH // 5) + 20
pygame.draw.rect(surface, WHITE, self.rect, 2) # Apmale BG_ELEMENTS.append({'rect': pygame.Rect(x, HEIGHT - 50 - h, w-10, h)})
elif bg_name == "FOREST":
text_surf = FONT_SMALL.render(self.text, True, WHITE) for i in range(8):
surface.blit(text_surf, (self.rect.centerx - text_surf.get_width()//2, self.rect.centery - text_surf.get_height()//2)) x = i * (WIDTH // 8) + 40
BG_ELEMENTS.append({'x': x})
def is_clicked(self, event):
if event.type == pygame.MOUSEBUTTONDOWN: # Inicializējam pirmo reizi
if event.button == 1 and self.rect.collidepoint(event.pos): generate_bg_elements("CITY")
return True
return False # --- UI Klases ---
# --- Klase Spēlētājam --- class Button:
class Fighter(pygame.sprite.Sprite): def __init__(self, x, y, w, h, text, color, hover_color, action_code):
def __init__(self, x, y, color, facing_right, controls): # Rect tiek izmantots tikai klikšķu noteikšanai (invisible hitbox)
super().__init__() self.rect = pygame.Rect(x, y, w, h)
self.original_color = color self.text = text
self.color = color self.color = color # Teksta krāsa (normāla)
self.hover_color = hover_color # Teksta krāsa (pele virsū)
self.rect = pygame.Rect(x, y, 50, 100) self.action_code = action_code
self.vel_y = 0
self.speed = 7 def draw(self, surface):
self.jump_power = -18 mouse_pos = pygame.mouse.get_pos()
self.gravity = 0.8 is_hovered = self.rect.collidepoint(mouse_pos)
self.on_ground = False
# Izvēlamies krāsu atkarībā no peles pozīcijas
self.facing_right = facing_right current_color = self.hover_color if is_hovered else self.color
self.controls = controls
self.attacking = False # Taisnstūrus ZĪMĒT NEVARAM (dzēsts pēc pieprasījuma)
self.attack_cooldown = 0 # pygame.draw.rect(surface, current_color, self.rect)
self.attack_box = pygame.Rect(0, 0, 0, 0)
self.health = 100 # Zīmējam tikai tekstu, kas ir centrēts rect iekšpusē
self.hit_timer = 0 text_surf = FONT_SMALL.render(self.text, True, current_color)
surface.blit(text_surf, (self.rect.centerx - text_surf.get_width()//2, self.rect.centery - text_surf.get_height()//2))
def move(self, keys):
dx = 0 def is_clicked(self, event):
if keys[self.controls['left']]: if event.type == pygame.MOUSEBUTTONDOWN:
dx = -self.speed if event.button == 1 and self.rect.collidepoint(event.pos):
self.facing_right = False return True
if keys[self.controls['right']]: return False
dx = self.speed
self.facing_right = True # --- Klase Spēlētājam ---
class Fighter(pygame.sprite.Sprite):
self.rect.x += dx def __init__(self, x, y, color, facing_right, controls):
if self.rect.left < 0: self.rect.left = 0 super().__init__()
if self.rect.right > WIDTH: self.rect.right = WIDTH self.original_color = color
self.color = color
if keys[self.controls['jump']] and self.on_ground:
self.vel_y = self.jump_power self.rect = pygame.Rect(x, y, 50, 100)
self.on_ground = False self.vel_y = 0
self.speed = 7
self.vel_y += self.gravity self.jump_power = -18
self.rect.y += self.vel_y self.gravity = 0.8
self.on_ground = False
if self.rect.bottom >= HEIGHT - 50:
self.rect.bottom = HEIGHT - 50 self.facing_right = facing_right
self.vel_y = 0 self.controls = controls
self.on_ground = True self.attacking = False
self.attack_cooldown = 0
def attack(self): self.attack_box = pygame.Rect(0, 0, 0, 0)
if self.attack_cooldown == 0: self.health = 100
self.attacking = True self.hit_timer = 0
self.attack_cooldown = 20
if self.facing_right: def move(self, keys):
self.attack_box = pygame.Rect(self.rect.right, self.rect.y + 20, 60, 50) dx = 0
else: if keys[self.controls['left']]:
self.attack_box = pygame.Rect(self.rect.left - 60, self.rect.y + 20, 60, 50) dx = -self.speed
self.facing_right = False
def update(self): if keys[self.controls['right']]:
if self.attack_cooldown > 0: self.attack_cooldown -= 1 dx = self.speed
else: self.attacking = False self.facing_right = True
if self.hit_timer > 0: self.rect.x += dx
self.hit_timer -= 1 if self.rect.left < 0: self.rect.left = 0
self.color = WHITE if self.rect.right > WIDTH: self.rect.right = WIDTH
else:
self.color = self.original_color if keys[self.controls['jump']] and self.on_ground:
self.vel_y = self.jump_power
def draw(self, surface): self.on_ground = False
pygame.draw.rect(surface, self.color, self.rect)
pygame.draw.rect(surface, BLACK, self.rect, 2) self.vel_y += self.gravity
self.rect.y += self.vel_y
head_rect = pygame.Rect(self.rect.x + 10, self.rect.y - 20, 30, 20)
pygame.draw.rect(surface, self.color, head_rect) if self.rect.bottom >= HEIGHT - 50:
pygame.draw.rect(surface, BLACK, head_rect, 2) self.rect.bottom = HEIGHT - 50
self.vel_y = 0
eye_color = BLACK self.on_ground = True
if self.facing_right:
pygame.draw.rect(surface, eye_color, (self.rect.x + 30, self.rect.y - 15, 5, 5)) def attack(self):
else: if self.attack_cooldown == 0:
pygame.draw.rect(surface, eye_color, (self.rect.x + 15, self.rect.y - 15, 5, 5)) self.attacking = True
self.attack_cooldown = 20
if self.attacking: if self.facing_right:
pygame.draw.rect(surface, YELLOW, self.attack_box) self.attack_box = pygame.Rect(self.rect.right, self.rect.y + 20, 60, 50)
pygame.draw.rect(surface, WHITE, self.attack_box, 2) else:
self.attack_box = pygame.Rect(self.rect.left - 60, self.rect.y + 20, 60, 50)
def take_damage(self, amount):
self.health -= amount def update(self):
self.hit_timer = 10 if self.attack_cooldown > 0: self.attack_cooldown -= 1
self.vel_y = -5 else: self.attacking = False
if self.rect.centerx < WIDTH // 2: self.rect.x -= 20
else: self.rect.x += 20 if self.hit_timer > 0:
self.hit_timer -= 1
# --- Fona Zīmēšanas Funkcijas --- self.color = WHITE
else:
def draw_city(surface): self.color = self.original_color
surface.fill((20, 30, 50)) # Nakts debesis
pygame.draw.circle(surface, (200, 200, 200), (WIDTH//2, 100), 60) # Mēness def draw(self, surface):
for i in range(5): pygame.draw.rect(surface, self.color, self.rect)
w = random.randint(50, 150) pygame.draw.rect(surface, BLACK, self.rect, 2)
h = random.randint(200, 400)
x = i * (WIDTH // 5) + 20 head_rect = pygame.Rect(self.rect.x + 10, self.rect.y - 20, 30, 20)
pygame.draw.rect(surface, (10, 10, 20), (x, HEIGHT - 50 - h, w-10, h)) # Ēkas pygame.draw.rect(surface, self.color, head_rect)
pygame.draw.rect(surface, BROWN, (0, HEIGHT - 50, WIDTH, 50)) # Zeme pygame.draw.rect(surface, BLACK, head_rect, 2)
def draw_forest(surface): eye_color = BLACK
surface.fill((50, 150, 50)) # Gaiši zaļš debesis/ugs if self.facing_right:
pygame.draw.circle(surface, (255, 255, 100), (WIDTH - 100, 80), 50) # Saule pygame.draw.rect(surface, eye_color, (self.rect.x + 30, self.rect.y - 15, 5, 5))
for i in range(8): else:
x = i * (WIDTH // 8) + 40 pygame.draw.rect(surface, eye_color, (self.rect.x + 15, self.rect.y - 15, 5, 5))
# Koku stumbri
pygame.draw.rect(surface, (80, 50, 20), (x, HEIGHT - 200, 40, 150)) if self.attacking:
# Koku vainagi (trīsstūri stilā) pygame.draw.rect(surface, YELLOW, self.attack_box)
pygame.draw.polygon(surface, (20, 100, 20), [(x-40, HEIGHT-200), (x+40, HEIGHT-200), (x, HEIGHT-300)]) pygame.draw.rect(surface, WHITE, self.attack_box, 2)
pygame.draw.polygon(surface, (20, 100, 20), [(x-35, HEIGHT-240), (x+35, HEIGHT-240), (x, HEIGHT-340)])
pygame.draw.rect(surface, (30, 100, 30), (0, HEIGHT - 50, WIDTH, 50)) # Zāle def take_damage(self, amount):
self.health -= amount
def draw_dojo(surface): self.hit_timer = 10
surface.fill((180, 100, 50)) # Koka sieni self.vel_y = -5
# Girdīngs if self.rect.centerx < WIDTH // 2: self.rect.x -= 20
pygame.draw.rect(surface, (100, 50, 0), (0, HEIGHT - 200, WIDTH, 50)) else: self.rect.x += 20
pygame.draw.rect(surface, (100, 50, 0), (0, 0, WIDTH, 50))
# Vairogzīmes # --- Fona Zīmēšanas Funkcijas ---
for i in range(1, 10):
x = i * (WIDTH // 10) def draw_city(surface):
pygame.draw.line(surface, (50, 0, 0), (x, 50), (x, HEIGHT - 200), 2) surface.fill((20, 30, 50)) # Nakts debesis
pygame.draw.rect(surface, (50, 0, 0), (0, HEIGHT - 50, WIDTH, 50)) # Sarkanā grīda pygame.draw.circle(surface, (200, 200, 200), (WIDTH//2, 100), 60) # Mēness
def get_bg_function(name): # Zīmējam iepriekš ģenerētās ēkas
if name == "CITY": return draw_city for elem in BG_ELEMENTS:
if name == "FOREST": return draw_forest pygame.draw.rect(surface, (10, 10, 20), elem['rect'])
return draw_dojo
pygame.draw.rect(surface, BROWN, (0, HEIGHT - 50, WIDTH, 50)) # Zeme
# --- Dialogi ---
class DialogueManager: def draw_forest(surface):
def __init__(self): surface.fill((50, 150, 50)) # Gaiši zaļš debesis/ugs
self.lines = [ pygame.draw.circle(surface, (255, 255, 100), (WIDTH - 100, 80), 50) # Saule
"PREPARE FOR BATTLE!",
"Who will win today?", # Zīmējam iepriekš ģenerētos kokus
"Fight with honor!", for elem in BG_ELEMENTS:
"Show me your moves!" x = elem['x']
] # Koku stumbri
self.current_text = random.choice(self.lines) pygame.draw.rect(surface, (80, 50, 20), (x, HEIGHT - 200, 40, 150))
self.active = False # Koku vainagi (trīsstūri stilā)
self.timer = 0 pygame.draw.polygon(surface, (20, 100, 20), [(x-40, HEIGHT-200), (x+40, HEIGHT-200), (x, HEIGHT-300)])
pygame.draw.polygon(surface, (20, 100, 20), [(x-35, HEIGHT-240), (x+35, HEIGHT-240), (x, HEIGHT-340)])
def start(self):
self.active = True pygame.draw.rect(surface, (30, 100, 30), (0, HEIGHT - 50, WIDTH, 50)) # Zāle
self.timer = pygame.time.get_ticks()
self.current_text = random.choice(self.lines) def draw_dojo(surface):
surface.fill((180, 100, 50)) # Koka sieni
def draw(self, surface): # Girdīngs
if not self.active: return pygame.draw.rect(surface, (100, 50, 0), (0, HEIGHT - 200, WIDTH, 50))
pygame.draw.rect(surface, (100, 50, 0), (0, 0, WIDTH, 50))
# Kaste # Vairogzīmes
box_rect = pygame.Rect(WIDTH//2 - 300, HEIGHT//2 - 50, 600, 100) for i in range(1, 10):
pygame.draw.rect(surface, BLACK, box_rect) x = i * (WIDTH // 10)
pygame.draw.rect(surface, WHITE, box_rect, 4) pygame.draw.line(surface, (50, 0, 0), (x, 50), (x, HEIGHT - 200), 2)
pygame.draw.rect(surface, (50, 0, 0), (0, HEIGHT - 50, WIDTH, 50)) # Sarkanā grīda
# Teksts
text_surf = FONT_MED.render(self.current_text, True, YELLOW) def get_bg_function(name):
surface.blit(text_surf, (box_rect.centerx - text_surf.get_width()//2, box_rect.centery - text_surf.get_height()//2)) if name == "CITY": return draw_city
if name == "FOREST": return draw_forest
# Instrukcija return draw_dojo
sub_surf = FONT_SMALL.render("Nospiediet [SPACE] lai sāktu", True, WHITE)
surface.blit(sub_surf, (box_rect.centerx - sub_surf.get_width()//2, box_rect.bottom + 10)) # --- Dialogi ---
class DialogueManager:
# --- Galvenā Spēle --- def __init__(self):
self.lines = [
def main(): "PREPARE FOR BATTLE!",
global STATE, P1_COLOR, P2_COLOR, SELECTED_BG "Who will win today?",
"Fight with honor!",
# Kontroles "Show me your moves!"
controls_p1 = {'left': pygame.K_a, 'right': pygame.K_d, 'jump': pygame.K_w, 'attack': pygame.K_SPACE} ]
# P2 uzbrukums tagad ir Enter taustiņš self.current_text = random.choice(self.lines)
controls_p2 = {'left': pygame.K_LEFT, 'right': pygame.K_RIGHT, 'jump': pygame.K_UP, 'attack': pygame.K_RETURN} self.active = False
self.timer = 0
dialogue_mgr = DialogueManager()
def start(self):
# Izveidojam pogas self.active = True
menu_buttons = [ self.timer = pygame.time.get_ticks()
Button(WIDTH//2 - 100, 200, 200, 50, "Sakt Cīnu", GRAY, DARK_GRAY, "START"), self.current_text = random.choice(self.lines)
Button(WIDTH//2 - 100, 270, 200, 50, "Tēlu Izvēle", GRAY, DARK_GRAY, "CHARS"),
Button(WIDTH//2 - 100, 340, 200, 50, "Fona Izvēle", GRAY, DARK_GRAY, "BG"), def draw(self, surface):
Button(WIDTH//2 - 100, 410, 200, 50, "Iziet", RED, (150, 0, 0), "QUIT") if not self.active: return
]
# Kaste
bg_buttons = [ box_rect = pygame.Rect(WIDTH//2 - 300, HEIGHT//2 - 50, 600, 100)
Button(200, 300, 150, 100, "CITY", (20, 30, 50), DARK_GRAY, "CITY"), pygame.draw.rect(surface, BLACK, box_rect)
Button(425, 300, 150, 100, "FOREST", (50, 150, 50), DARK_GRAY, "FOREST"), pygame.draw.rect(surface, WHITE, box_rect, 4)
Button(650, 300, 150, 100, "DOJO", (180, 100, 50), DARK_GRAY, "DOJO"),
Button(WIDTH//2 - 100, 450, 200, 50, "Atpakaļ", GRAY, DARK_GRAY, "BACK") # Teksts
] text_surf = FONT_MED.render(self.current_text, True, YELLOW)
surface.blit(text_surf, (box_rect.centerx - text_surf.get_width()//2, box_rect.centery - text_surf.get_height()//2))
back_btn = Button(20, 20, 100, 40, "Atpakaļ", GRAY, DARK_GRAY, "BACK")
# Instrukcija
# Spēlētāji (sākotnēji None, tiek veidoti pirms spēles) sub_surf = FONT_SMALL.render("Nospiediet [SPACE] lai sāktu", True, WHITE)
fighter1 = None surface.blit(sub_surf, (box_rect.centerx - sub_surf.get_width()//2, box_rect.bottom + 10))
fighter2 = None
# --- Galvenā Spēle ---
run = True
while run: def main():
CLOCK.tick(60) global STATE, P1_COLOR, P2_COLOR, SELECTED_BG, BG_ELEMENTS
mouse_pos = pygame.mouse.get_pos()
# Kontroles
for event in pygame.event.get(): controls_p1 = {'left': pygame.K_a, 'right': pygame.K_d, 'jump': pygame.K_w, 'attack': pygame.K_SPACE}
if event.type == pygame.QUIT: controls_p2 = {'left': pygame.K_LEFT, 'right': pygame.K_RIGHT, 'jump': pygame.K_UP, 'attack': pygame.K_RETURN}
run = False
dialogue_mgr = DialogueManager()
# Pogu apstrāde atkarībā no stāvokļa
if STATE == "MENU": # Izveidojam pogas (Bez taisnstūriem, teksta krāsas)
for btn in menu_buttons: # Zila krāsa parasti, Sarkana izceļot (pelei virsū)
if btn.is_clicked(event): menu_buttons = [
if btn.action_code == "START": Button(WIDTH//2 - 100, 250, 200, 50, "Sakt Cinu", BLUE, RED, "START"),
dialogue_mgr.start() Button(WIDTH//2 - 100, 320, 200, 50, "Telu Izvele", BLUE, RED, "CHARS"),
STATE = "DIALOGUE" Button(WIDTH//2 - 100, 390, 200, 50, "Fona Izvele", BLUE, RED, "BG"),
elif btn.action_code == "CHARS": Button(WIDTH//2 - 100, 460, 200, 50, "Iziet", RED, YELLOW, "QUIT") # Iziet ir sarkans, kļūst dzeltens
STATE = "CHAR_SELECT" ]
elif btn.action_code == "BG":
STATE = "BG_SELECT" # Šeit arī nomainām krāsas, lai būtu redzams uz fona (jo rect vairs nav)
elif btn.action_code == "QUIT": bg_buttons = [
run = False Button(200, 300, 150, 100, "CITY", WHITE, YELLOW, "CITY"),
Button(425, 300, 150, 100, "FOREST", WHITE, YELLOW, "FOREST"),
elif STATE == "CHAR_SELECT": Button(650, 300, 150, 100, "DOJO", WHITE, YELLOW, "DOJO"),
# P1 izvēle (kreisā puse) Button(WIDTH//2 - 100, 450, 200, 50, "Atpakal", GRAY, WHITE, "BACK")
for i, color in enumerate(COLORS): ]
rect = pygame.Rect(150 + i*60, 200, 50, 50)
if event.type == pygame.MOUSEBUTTONDOWN and rect.collidepoint(event.pos): back_btn = Button(20, 20, 100, 40, "Atpakal", GRAY, WHITE, "BACK")
P1_COLOR = color
# Spēlētāji
# P2 izvēle (labā puse) fighter1 = None
for i, color in enumerate(COLORS): fighter2 = None
rect = pygame.Rect(WIDTH - 450 + i*60, 200, 50, 50) winner = "PLAYER 1" # Noklusējuma vērtība
if event.type == pygame.MOUSEBUTTONDOWN and rect.collidepoint(event.pos):
P2_COLOR = color run = True
while run:
if back_btn.is_clicked(event): CLOCK.tick(60)
STATE = "MENU"
for event in pygame.event.get():
elif STATE == "BG_SELECT": if event.type == pygame.QUIT:
for btn in bg_buttons: run = False
if btn.is_clicked(event):
if btn.action_code == "BACK": # Pogu apstrāde atkarībā no stāvokļa
STATE = "MENU" if STATE == "MENU":
else: for btn in menu_buttons:
SELECTED_BG = btn.action_code if btn.is_clicked(event):
if btn.action_code == "START":
elif STATE == "DIALOGUE": dialogue_mgr.start()
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: STATE = "DIALOGUE"
dialogue_mgr.active = False elif btn.action_code == "CHARS":
# Inicializējam spēli STATE = "CHAR_SELECT"
fighter1 = Fighter(200, 300, P1_COLOR, True, controls_p1) elif btn.action_code == "BG":
fighter2 = Fighter(800, 300, P2_COLOR, False, controls_p2) STATE = "BG_SELECT"
STATE = "GAME" elif btn.action_code == "QUIT":
run = False
elif STATE == "GAME":
if event.type == pygame.KEYDOWN: elif STATE == "CHAR_SELECT":
if event.key == fighter1.controls['attack']: fighter1.attack() # P1 izvēle
if event.key == fighter2.controls['attack']: fighter2.attack() for i, color in enumerate(COLORS):
rect = pygame.Rect(150 + i*60, 200, 50, 50)
elif STATE == "GAMEOVER": if event.type == pygame.MOUSEBUTTONDOWN and rect.collidepoint(event.pos):
if event.type == pygame.KEYDOWN and event.key == pygame.K_r: P1_COLOR = color
STATE = "MENU"
# P2 izvēle
# --- Zīmēšanas Loģika --- for i, color in enumerate(COLORS):
rect = pygame.Rect(WIDTH - 450 + i*60, 200, 50, 50)
if STATE == "MENU": if event.type == pygame.MOUSEBUTTONDOWN and rect.collidepoint(event.pos):
SCREEN.fill(BLACK) P2_COLOR = color
title = FONT_BIG.render("PIXEL KOMBAT", True, WHITE)
SCREEN.blit(title, (WIDTH//2 - title.get_width()//2, 100)) if back_btn.is_clicked(event):
for btn in menu_buttons: btn.draw(SCREEN) STATE = "MENU"
elif STATE == "CHAR_SELECT": elif STATE == "BG_SELECT":
SCREEN.fill(DARK_GRAY) for btn in bg_buttons:
if btn.is_clicked(event):
title = FONT_MED.render("IZVĒLIES TĒLU", True, WHITE) if btn.action_code == "BACK":
SCREEN.blit(title, (WIDTH//2 - title.get_width()//2, 50)) STATE = "MENU"
else:
# Zīmējam P1 paneli SELECTED_BG = btn.action_code
p1_text = FONT_SMALL.render("PLAYER 1", True, P1_COLOR) generate_bg_elements(SELECTED_BG) # Ģenerējam jaunu fonu
SCREEN.blit(p1_text, (200, 150))
for i, color in enumerate(COLORS): elif STATE == "DIALOGUE":
r = pygame.Rect(150 + i*60, 200, 50, 50) if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
pygame.draw.rect(SCREEN, color, r) dialogue_mgr.active = False
pygame.draw.rect(SCREEN, WHITE, r, 2 if color != P1_COLOR else 5) # Inicializējam spēli
fighter1 = Fighter(200, 300, P1_COLOR, True, controls_p1)
# Zīmējam P2 paneli fighter2 = Fighter(800, 300, P2_COLOR, False, controls_p2)
p2_text = FONT_SMALL.render("PLAYER 2", True, P2_COLOR) STATE = "GAME"
SCREEN.blit(p2_text, (WIDTH - 350, 150))
for i, color in enumerate(COLORS): elif STATE == "GAME":
r = pygame.Rect(WIDTH - 450 + i*60, 200, 50, 50) if event.type == pygame.KEYDOWN:
pygame.draw.rect(SCREEN, color, r) if event.key == fighter1.controls['attack']: fighter1.attack()
pygame.draw.rect(SCREEN, WHITE, r, 2 if color != P2_COLOR else 5) if event.key == fighter2.controls['attack']: fighter2.attack()
back_btn.draw(SCREEN) elif STATE == "GAMEOVER":
if event.type == pygame.KEYDOWN and event.key == pygame.K_r:
elif STATE == "BG_SELECT": STATE = "MENU"
SCREEN.fill(BLACK)
title = FONT_MED.render("IZVĒLIES VIDI", True, WHITE) # --- Zīmēšanas Loģika un Update ---
SCREEN.blit(title, (WIDTH//2 - title.get_width()//2, 50))
if STATE == "MENU":
for btn in bg_buttons: SCREEN.fill(BLACK)
btn.draw(SCREEN)
# --- LOGOTIPS (Street Fighter stils) ---
elif STATE == "DIALOGUE": title_text = "PIXEL KOMBAT"
# Rādam fona priekšskatījumu aiz dialoga
get_bg_function(SELECTED_BG)(SCREEN) # Ēna (Sarkana)
dialogue_mgr.draw(SCREEN) shadow_text = FONT_BIG.render(title_text, True, (180, 0, 0))
SCREEN.blit(shadow_text, (WIDTH//2 - shadow_text.get_width()//2 + 3, 53))
elif STATE == "GAME":
keys = pygame.key.get_pressed() # Galvenais teksts (Dzeltena)
main_text = FONT_BIG.render(title_text, True, YELLOW)
# Spēles loģika SCREEN.blit(main_text, (WIDTH//2 - main_text.get_width()//2, 50))
fighter1.move(keys)
fighter2.move(keys) # Apakšvirsraksts
fighter1.update() sub_text = "- ULTIMATE EDITION -"
fighter2.update() sub_surf = FONT_SMALL.render(sub_text, True, WHITE)
SCREEN.blit(sub_surf, (WIDTH//2 - sub_surf.get_width()//2, 130))
if fighter1.attacking and fighter1.attack_box.colliderect(fighter2.rect):
if fighter2.hit_timer == 0: fighter2.take_damage(5) # --- POGAS (Tikai teksts) ---
if fighter2.attacking and fighter2.attack_box.colliderect(fighter1.rect): for btn in menu_buttons:
if fighter1.hit_timer == 0: fighter1.take_damage(5) btn.draw(SCREEN)
if fighter1.health <= 0 or fighter2.health <= 0: # --- APAKŠĒJĀ INFORMĀCIJA ---
STATE = "GAMEOVER" # Copyright
winner = "PLAYER 1" if fighter2.health <= 0 else "PLAYER 2" cp_text = "© PIXEL KOMBAT 2024"
cp_surf = FONT_TINY.render(cp_text, True, WHITE)
# Zīmēšana SCREEN.blit(cp_surf, (WIDTH//2 - cp_surf.get_width()//2, HEIGHT - 30))
bg_func = get_bg_function(SELECTED_BG)
bg_func(SCREEN) # Credits (Labajā pusē)
credit_text = "CREDIT 01"
fighter1.draw(SCREEN) credit_surf = FONT_SMALL.render(credit_text, True, YELLOW)
fighter2.draw(SCREEN) SCREEN.blit(credit_surf, (WIDTH - 180, HEIGHT - 30))
# Health bars elif STATE == "CHAR_SELECT":
pygame.draw.rect(SCREEN, BLACK, (20, 20, 400, 40)) SCREEN.fill(DARK_GRAY)
pygame.draw.rect(SCREEN, RED, (20, 20, 400, 40)) title = FONT_MED.render("IZVELIES TELU", True, WHITE)
pygame.draw.rect(SCREEN, P1_COLOR, (20, 20, (fighter1.health/100)*400, 40)) SCREEN.blit(title, (WIDTH//2 - title.get_width()//2, 50))
pygame.draw.rect(SCREEN, WHITE, (20, 20, 400, 40), 2)
p1_text = FONT_SMALL.render("PLAYER 1", True, P1_COLOR)
pygame.draw.rect(SCREEN, BLACK, (WIDTH-420, 20, 400, 40)) SCREEN.blit(p1_text, (200, 150))
pygame.draw.rect(SCREEN, RED, (WIDTH-420, 20, 400, 40)) for i, color in enumerate(COLORS):
pygame.draw.rect(SCREEN, P2_COLOR, (WIDTH-420, 20, (fighter2.health/100)*400, 40)) r = pygame.Rect(150 + i*60, 200, 50, 50)
pygame.draw.rect(SCREEN, WHITE, (WIDTH-420, 20, 400, 40), 2) pygame.draw.rect(SCREEN, color, r)
pygame.draw.rect(SCREEN, WHITE, r, 2 if color != P1_COLOR else 5)
elif STATE == "GAMEOVER":
SCREEN.fill(BLACK) # Zīmējam P2 paneli
txt = FONT_BIG.render(f"{winner} WINS!", True, YELLOW) p2_text = FONT_SMALL.render("PLAYER 2", True, P2_COLOR)
restart = FONT_SMALL.render("Nospied [R] atgriezties uz izvēlni", True, WHITE) SCREEN.blit(p2_text, (WIDTH - 350, 150))
for i, color in enumerate(COLORS):
SCREEN.blit(txt, (WIDTH//2 - txt.get_width()//2, HEIGHT//2 - 50)) r = pygame.Rect(WIDTH - 450 + i*60, 200, 50, 50)
SCREEN.blit(restart, (WIDTH//2 - restart.get_width()//2, HEIGHT//2 + 50)) pygame.draw.rect(SCREEN, color, r)
pygame.draw.rect(SCREEN, WHITE, r, 2 if color != P2_COLOR else 5)
pygame.display.update()
back_btn.draw(SCREEN)
pygame.quit()
elif STATE == "BG_SELECT":
if __name__ == "__main__": SCREEN.fill(BLACK)
title = FONT_MED.render("IZVELIES VIDI", True, WHITE)
SCREEN.blit(title, (WIDTH//2 - title.get_width()//2, 50))
for btn in bg_buttons:
btn.draw(SCREEN)
elif STATE == "DIALOGUE":
get_bg_function(SELECTED_BG)(SCREEN)
dialogue_mgr.draw(SCREEN)
elif STATE == "GAME":
keys = pygame.key.get_pressed()
# Spēles loģika
fighter1.move(keys)
fighter2.move(keys)
fighter1.update()
fighter2.update()
if fighter1.attacking and fighter1.attack_box.colliderect(fighter2.rect):
if fighter2.hit_timer == 0: fighter2.take_damage(5)
if fighter2.attacking and fighter2.attack_box.colliderect(fighter1.rect):
if fighter1.hit_timer == 0: fighter1.take_damage(5)
if fighter1.health <= 0 or fighter2.health <= 0:
STATE = "GAMEOVER"
winner = "PLAYER 1" if fighter2.health <= 0 else "PLAYER 2"
# Zīmēšana
bg_func = get_bg_function(SELECTED_BG)
bg_func(SCREEN)
fighter1.draw(SCREEN)
fighter2.draw(SCREEN)
# Health bars
pygame.draw.rect(SCREEN, BLACK, (20, 20, 400, 40))
pygame.draw.rect(SCREEN, RED, (20, 20, 400, 40))
pygame.draw.rect(SCREEN, P1_COLOR, (20, 20, (fighter1.health/100)*400, 40))
pygame.draw.rect(SCREEN, WHITE, (20, 20, 400, 40), 2)
pygame.draw.rect(SCREEN, BLACK, (WIDTH-420, 20, 400, 40))
pygame.draw.rect(SCREEN, RED, (WIDTH-420, 20, 400, 40))
pygame.draw.rect(SCREEN, P2_COLOR, (WIDTH-420, 20, (fighter2.health/100)*400, 40))
pygame.draw.rect(SCREEN, WHITE, (WIDTH-420, 20, 400, 40), 2)
elif STATE == "GAMEOVER":
SCREEN.fill(BLACK)
txt = FONT_BIG.render(f"{winner} WINS!", True, YELLOW)
restart = FONT_SMALL.render("Nospied [R] atgriezties uz izvelni", True, WHITE)
SCREEN.blit(txt, (WIDTH//2 - txt.get_width()//2, HEIGHT//2 - 50))
SCREEN.blit(restart, (WIDTH//2 - restart.get_width()//2, HEIGHT//2 + 50))
pygame.display.update()
pygame.quit()
sys.exit()
if __name__ == "__main__":
main() main()