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.

164
game.py
View File

@ -1,5 +1,6 @@
import pygame import pygame
import random import random
import sys
# --- Inicializācija --- # --- Inicializācija ---
pygame.init() pygame.init()
@ -10,11 +11,11 @@ SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pixel Kombat: Ultimate") pygame.display.set_caption("Pixel Kombat: Ultimate")
CLOCK = pygame.time.Clock() CLOCK = pygame.time.Clock()
# --- Krāsas (PIEVIENOTS RED UN BLUE) --- # --- Krāsas ---
WHITE = (255, 255, 255) WHITE = (255, 255, 255)
BLACK = (0, 0, 0) BLACK = (0, 0, 0)
RED = (255, 0, 0) # <--- Šis trūka RED = (255, 0, 0)
BLUE = (0, 0, 255) # <--- Papildus BLUE = (0, 0, 255)
GRAY = (50, 50, 50) GRAY = (50, 50, 50)
DARK_GRAY = (20, 20, 20) DARK_GRAY = (20, 20, 20)
YELLOW = (255, 215, 0) YELLOW = (255, 215, 0)
@ -23,7 +24,7 @@ GREEN = (50, 200, 50)
CYAN = (0, 255, 255) CYAN = (0, 255, 255)
PURPLE = (160, 32, 240) PURPLE = (160, 32, 240)
# Pieejamās raksturu krāsas (saraksts) # Pieejamās raksturu krāsas
COLORS = [ COLORS = [
(235, 64, 52), # Red (235, 64, 52), # Red
(52, 119, 235), # Blue (52, 119, 235), # Blue
@ -33,15 +34,18 @@ COLORS = [
(255, 105, 180) # Pink (255, 105, 180) # Pink
] ]
# --- Fonti --- # --- Fonti (ar rezerves variantu) ---
try: def get_font(name, size):
FONT_BIG = pygame.font.Font(None, 74) try:
FONT_MED = pygame.font.Font(None, 50) return pygame.font.Font(name, size)
FONT_SMALL = pygame.font.Font(None, 32) except FileNotFoundError:
except: # Ja fonts nav atrasts, izmanto noklusējuma sistēmas fontu
FONT_BIG = pygame.font.SysFont("Arial", 74) return pygame.font.SysFont('arial', size)
FONT_MED = pygame.font.SysFont("Arial", 50)
FONT_SMALL = pygame.font.SysFont("Arial", 32) FONT_BIG = get_font("Act_Of_Rejection.ttf", 80)
FONT_MED = get_font("PressStart2P-Regular.ttf", 36)
FONT_SMALL = get_font("PressStart2P-Regular.ttf", 20)
FONT_TINY = get_font("PressStart2P-Regular.ttf", 14)
# --- Globālie mainīgie (Spēles stāvokļi) --- # --- Globālie mainīgie (Spēles stāvokļi) ---
STATE = "MENU" # MENU, CHAR_SELECT, BG_SELECT, DIALOGUE, GAME, GAMEOVER STATE = "MENU" # MENU, CHAR_SELECT, BG_SELECT, DIALOGUE, GAME, GAMEOVER
@ -49,24 +53,49 @@ SELECTED_BG = "CITY"
P1_COLOR = COLORS[0] # Noklusējums P1_COLOR = COLORS[0] # Noklusējums
P2_COLOR = COLORS[1] # Noklusējums P2_COLOR = COLORS[1] # Noklusējums
# --- Fona Ģenerators (Lai novērstu mirgošanu) ---
BG_ELEMENTS = []
def generate_bg_elements(bg_name):
global BG_ELEMENTS
BG_ELEMENTS = []
if bg_name == "CITY":
for i in range(5):
w = random.randint(80, 150)
h = random.randint(200, 400)
x = i * (WIDTH // 5) + 20
BG_ELEMENTS.append({'rect': pygame.Rect(x, HEIGHT - 50 - h, w-10, h)})
elif bg_name == "FOREST":
for i in range(8):
x = i * (WIDTH // 8) + 40
BG_ELEMENTS.append({'x': x})
# Inicializējam pirmo reizi
generate_bg_elements("CITY")
# --- UI Klases --- # --- UI Klases ---
class Button: class Button:
def __init__(self, x, y, w, h, text, color, hover_color, action_code): def __init__(self, x, y, w, h, text, color, hover_color, action_code):
# Rect tiek izmantots tikai klikšķu noteikšanai (invisible hitbox)
self.rect = pygame.Rect(x, y, w, h) self.rect = pygame.Rect(x, y, w, h)
self.text = text self.text = text
self.color = color self.color = color # Teksta krāsa (normāla)
self.hover_color = hover_color self.hover_color = hover_color # Teksta krāsa (pele virsū)
self.action_code = action_code self.action_code = action_code
def draw(self, surface): def draw(self, surface):
mouse_pos = pygame.mouse.get_pos() mouse_pos = pygame.mouse.get_pos()
color = self.hover_color if self.rect.collidepoint(mouse_pos) else self.color is_hovered = self.rect.collidepoint(mouse_pos)
pygame.draw.rect(surface, color, self.rect) # Izvēlamies krāsu atkarībā no peles pozīcijas
pygame.draw.rect(surface, WHITE, self.rect, 2) # Apmale current_color = self.hover_color if is_hovered else self.color
text_surf = FONT_SMALL.render(self.text, True, WHITE) # Taisnstūrus ZĪMĒT NEVARAM (dzēsts pēc pieprasījuma)
# pygame.draw.rect(surface, current_color, self.rect)
# Zīmējam tikai tekstu, kas ir centrēts rect iekšpusē
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)) surface.blit(text_surf, (self.rect.centerx - text_surf.get_width()//2, self.rect.centery - text_surf.get_height()//2))
def is_clicked(self, event): def is_clicked(self, event):
@ -171,23 +200,26 @@ class Fighter(pygame.sprite.Sprite):
def draw_city(surface): def draw_city(surface):
surface.fill((20, 30, 50)) # Nakts debesis surface.fill((20, 30, 50)) # Nakts debesis
pygame.draw.circle(surface, (200, 200, 200), (WIDTH//2, 100), 60) # Mēness pygame.draw.circle(surface, (200, 200, 200), (WIDTH//2, 100), 60) # Mēness
for i in range(5):
w = random.randint(50, 150) # Zīmējam iepriekš ģenerētās ēkas
h = random.randint(200, 400) for elem in BG_ELEMENTS:
x = i * (WIDTH // 5) + 20 pygame.draw.rect(surface, (10, 10, 20), elem['rect'])
pygame.draw.rect(surface, (10, 10, 20), (x, HEIGHT - 50 - h, w-10, h)) # Ēkas
pygame.draw.rect(surface, BROWN, (0, HEIGHT - 50, WIDTH, 50)) # Zeme pygame.draw.rect(surface, BROWN, (0, HEIGHT - 50, WIDTH, 50)) # Zeme
def draw_forest(surface): def draw_forest(surface):
surface.fill((50, 150, 50)) # Gaiši zaļš debesis/ugs surface.fill((50, 150, 50)) # Gaiši zaļš debesis/ugs
pygame.draw.circle(surface, (255, 255, 100), (WIDTH - 100, 80), 50) # Saule pygame.draw.circle(surface, (255, 255, 100), (WIDTH - 100, 80), 50) # Saule
for i in range(8):
x = i * (WIDTH // 8) + 40 # Zīmējam iepriekš ģenerētos kokus
for elem in BG_ELEMENTS:
x = elem['x']
# Koku stumbri # Koku stumbri
pygame.draw.rect(surface, (80, 50, 20), (x, HEIGHT - 200, 40, 150)) pygame.draw.rect(surface, (80, 50, 20), (x, HEIGHT - 200, 40, 150))
# Koku vainagi (trīsstūri stilā) # Koku vainagi (trīsstūri stilā)
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-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)]) 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 pygame.draw.rect(surface, (30, 100, 30), (0, HEIGHT - 50, WIDTH, 50)) # Zāle
def draw_dojo(surface): def draw_dojo(surface):
@ -243,40 +275,41 @@ class DialogueManager:
# --- Galvenā Spēle --- # --- Galvenā Spēle ---
def main(): def main():
global STATE, P1_COLOR, P2_COLOR, SELECTED_BG global STATE, P1_COLOR, P2_COLOR, SELECTED_BG, BG_ELEMENTS
# Kontroles # Kontroles
controls_p1 = {'left': pygame.K_a, 'right': pygame.K_d, 'jump': pygame.K_w, 'attack': pygame.K_SPACE} controls_p1 = {'left': pygame.K_a, 'right': pygame.K_d, 'jump': pygame.K_w, 'attack': pygame.K_SPACE}
# P2 uzbrukums tagad ir Enter taustiņš
controls_p2 = {'left': pygame.K_LEFT, 'right': pygame.K_RIGHT, 'jump': pygame.K_UP, 'attack': pygame.K_RETURN} controls_p2 = {'left': pygame.K_LEFT, 'right': pygame.K_RIGHT, 'jump': pygame.K_UP, 'attack': pygame.K_RETURN}
dialogue_mgr = DialogueManager() dialogue_mgr = DialogueManager()
# Izveidojam pogas # Izveidojam pogas (Bez taisnstūriem, teksta krāsas)
# Zila krāsa parasti, Sarkana izceļot (pelei virsū)
menu_buttons = [ menu_buttons = [
Button(WIDTH//2 - 100, 200, 200, 50, "Sakt Cīnu", GRAY, DARK_GRAY, "START"), Button(WIDTH//2 - 100, 250, 200, 50, "Sakt Cinu", BLUE, RED, "START"),
Button(WIDTH//2 - 100, 270, 200, 50, "Tēlu Izvēle", GRAY, DARK_GRAY, "CHARS"), Button(WIDTH//2 - 100, 320, 200, 50, "Telu Izvele", BLUE, RED, "CHARS"),
Button(WIDTH//2 - 100, 340, 200, 50, "Fona Izvēle", GRAY, DARK_GRAY, "BG"), Button(WIDTH//2 - 100, 390, 200, 50, "Fona Izvele", BLUE, RED, "BG"),
Button(WIDTH//2 - 100, 410, 200, 50, "Iziet", RED, (150, 0, 0), "QUIT") Button(WIDTH//2 - 100, 460, 200, 50, "Iziet", RED, YELLOW, "QUIT") # Iziet ir sarkans, kļūst dzeltens
] ]
# Šeit arī nomainām krāsas, lai būtu redzams uz fona (jo rect vairs nav)
bg_buttons = [ bg_buttons = [
Button(200, 300, 150, 100, "CITY", (20, 30, 50), DARK_GRAY, "CITY"), Button(200, 300, 150, 100, "CITY", WHITE, YELLOW, "CITY"),
Button(425, 300, 150, 100, "FOREST", (50, 150, 50), DARK_GRAY, "FOREST"), Button(425, 300, 150, 100, "FOREST", WHITE, YELLOW, "FOREST"),
Button(650, 300, 150, 100, "DOJO", (180, 100, 50), DARK_GRAY, "DOJO"), Button(650, 300, 150, 100, "DOJO", WHITE, YELLOW, "DOJO"),
Button(WIDTH//2 - 100, 450, 200, 50, "Atpakaļ", GRAY, DARK_GRAY, "BACK") Button(WIDTH//2 - 100, 450, 200, 50, "Atpakal", GRAY, WHITE, "BACK")
] ]
back_btn = Button(20, 20, 100, 40, "Atpakaļ", GRAY, DARK_GRAY, "BACK") back_btn = Button(20, 20, 100, 40, "Atpakal", GRAY, WHITE, "BACK")
# Spēlētāji (sākotnēji None, tiek veidoti pirms spēles) # Spēlētāji
fighter1 = None fighter1 = None
fighter2 = None fighter2 = None
winner = "PLAYER 1" # Noklusējuma vērtība
run = True run = True
while run: while run:
CLOCK.tick(60) CLOCK.tick(60)
mouse_pos = pygame.mouse.get_pos()
for event in pygame.event.get(): for event in pygame.event.get():
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
@ -297,13 +330,13 @@ def main():
run = False run = False
elif STATE == "CHAR_SELECT": elif STATE == "CHAR_SELECT":
# P1 izvēle (kreisā puse) # P1 izvēle
for i, color in enumerate(COLORS): for i, color in enumerate(COLORS):
rect = pygame.Rect(150 + i*60, 200, 50, 50) rect = pygame.Rect(150 + i*60, 200, 50, 50)
if event.type == pygame.MOUSEBUTTONDOWN and rect.collidepoint(event.pos): if event.type == pygame.MOUSEBUTTONDOWN and rect.collidepoint(event.pos):
P1_COLOR = color P1_COLOR = color
# P2 izvēle (labā puse) # P2 izvēle
for i, color in enumerate(COLORS): for i, color in enumerate(COLORS):
rect = pygame.Rect(WIDTH - 450 + i*60, 200, 50, 50) rect = pygame.Rect(WIDTH - 450 + i*60, 200, 50, 50)
if event.type == pygame.MOUSEBUTTONDOWN and rect.collidepoint(event.pos): if event.type == pygame.MOUSEBUTTONDOWN and rect.collidepoint(event.pos):
@ -319,6 +352,7 @@ def main():
STATE = "MENU" STATE = "MENU"
else: else:
SELECTED_BG = btn.action_code SELECTED_BG = btn.action_code
generate_bg_elements(SELECTED_BG) # Ģenerējam jaunu fonu
elif STATE == "DIALOGUE": elif STATE == "DIALOGUE":
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
@ -337,21 +371,47 @@ def main():
if event.type == pygame.KEYDOWN and event.key == pygame.K_r: if event.type == pygame.KEYDOWN and event.key == pygame.K_r:
STATE = "MENU" STATE = "MENU"
# --- Zīmēšanas Loģika --- # --- Zīmēšanas Loģika un Update ---
if STATE == "MENU": if STATE == "MENU":
SCREEN.fill(BLACK) SCREEN.fill(BLACK)
title = FONT_BIG.render("PIXEL KOMBAT", True, WHITE)
SCREEN.blit(title, (WIDTH//2 - title.get_width()//2, 100)) # --- LOGOTIPS (Street Fighter stils) ---
for btn in menu_buttons: btn.draw(SCREEN) title_text = "PIXEL KOMBAT"
# Ēna (Sarkana)
shadow_text = FONT_BIG.render(title_text, True, (180, 0, 0))
SCREEN.blit(shadow_text, (WIDTH//2 - shadow_text.get_width()//2 + 3, 53))
# Galvenais teksts (Dzeltena)
main_text = FONT_BIG.render(title_text, True, YELLOW)
SCREEN.blit(main_text, (WIDTH//2 - main_text.get_width()//2, 50))
# Apakšvirsraksts
sub_text = "- ULTIMATE EDITION -"
sub_surf = FONT_SMALL.render(sub_text, True, WHITE)
SCREEN.blit(sub_surf, (WIDTH//2 - sub_surf.get_width()//2, 130))
# --- POGAS (Tikai teksts) ---
for btn in menu_buttons:
btn.draw(SCREEN)
# --- APAKŠĒJĀ INFORMĀCIJA ---
# Copyright
cp_text = "© PIXEL KOMBAT 2024"
cp_surf = FONT_TINY.render(cp_text, True, WHITE)
SCREEN.blit(cp_surf, (WIDTH//2 - cp_surf.get_width()//2, HEIGHT - 30))
# Credits (Labajā pusē)
credit_text = "CREDIT 01"
credit_surf = FONT_SMALL.render(credit_text, True, YELLOW)
SCREEN.blit(credit_surf, (WIDTH - 180, HEIGHT - 30))
elif STATE == "CHAR_SELECT": elif STATE == "CHAR_SELECT":
SCREEN.fill(DARK_GRAY) SCREEN.fill(DARK_GRAY)
title = FONT_MED.render("IZVELIES TELU", True, WHITE)
title = FONT_MED.render("IZVĒLIES TĒLU", True, WHITE)
SCREEN.blit(title, (WIDTH//2 - title.get_width()//2, 50)) SCREEN.blit(title, (WIDTH//2 - title.get_width()//2, 50))
# Zīmējam P1 paneli
p1_text = FONT_SMALL.render("PLAYER 1", True, P1_COLOR) p1_text = FONT_SMALL.render("PLAYER 1", True, P1_COLOR)
SCREEN.blit(p1_text, (200, 150)) SCREEN.blit(p1_text, (200, 150))
for i, color in enumerate(COLORS): for i, color in enumerate(COLORS):
@ -371,14 +431,13 @@ def main():
elif STATE == "BG_SELECT": elif STATE == "BG_SELECT":
SCREEN.fill(BLACK) SCREEN.fill(BLACK)
title = FONT_MED.render("IZVĒLIES VIDI", True, WHITE) title = FONT_MED.render("IZVELIES VIDI", True, WHITE)
SCREEN.blit(title, (WIDTH//2 - title.get_width()//2, 50)) SCREEN.blit(title, (WIDTH//2 - title.get_width()//2, 50))
for btn in bg_buttons: for btn in bg_buttons:
btn.draw(SCREEN) btn.draw(SCREEN)
elif STATE == "DIALOGUE": elif STATE == "DIALOGUE":
# Rādam fona priekšskatījumu aiz dialoga
get_bg_function(SELECTED_BG)(SCREEN) get_bg_function(SELECTED_BG)(SCREEN)
dialogue_mgr.draw(SCREEN) dialogue_mgr.draw(SCREEN)
@ -421,7 +480,7 @@ def main():
elif STATE == "GAMEOVER": elif STATE == "GAMEOVER":
SCREEN.fill(BLACK) SCREEN.fill(BLACK)
txt = FONT_BIG.render(f"{winner} WINS!", True, YELLOW) txt = FONT_BIG.render(f"{winner} WINS!", True, YELLOW)
restart = FONT_SMALL.render("Nospied [R] atgriezties uz izvēlni", True, WHITE) 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(txt, (WIDTH//2 - txt.get_width()//2, HEIGHT//2 - 50))
SCREEN.blit(restart, (WIDTH//2 - restart.get_width()//2, HEIGHT//2 + 50)) SCREEN.blit(restart, (WIDTH//2 - restart.get_width()//2, HEIGHT//2 + 50))
@ -429,6 +488,7 @@ def main():
pygame.display.update() pygame.display.update()
pygame.quit() pygame.quit()
sys.exit()
if __name__ == "__main__": if __name__ == "__main__":
main() main()