-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmenu.py
More file actions
164 lines (138 loc) · 6.14 KB
/
menu.py
File metadata and controls
164 lines (138 loc) · 6.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import pygame as pg
from settings import *
# Load and scale background for menu
MENU_BACKGROUND = pg.transform.scale(GAME_IMAGES['background'], WINDOW_SIZE)
class Button:
def __init__(self, x, y, width, height, text, color=(200, 200, 200), hover_color=(255, 215, 0)):
self.rect = pg.Rect(x, y, width, height)
self.text = text
self.color = color
self.hover_color = hover_color
self.is_hovered = False
self.font = pg.font.Font(None, FONT_SIZE)
def draw(self, screen):
color = self.hover_color if self.is_hovered else self.color
pg.draw.rect(screen, BLACK, self.rect, 2)
pg.draw.rect(screen, color, self.rect.inflate(-2, -2))
text_surface = self.font.render(self.text, True, BLACK)
text_rect = text_surface.get_rect(center=self.rect.center)
screen.blit(text_surface, text_rect)
def handle_event(self, event):
if event.type == pg.MOUSEMOTION:
self.is_hovered = self.rect.collidepoint(event.pos)
if event.type == pg.MOUSEBUTTONDOWN:
if self.is_hovered:
return True
return False
class InputBox:
def __init__(self, x, y, width, height, text=''):
self.rect = pg.Rect(x, y, width, height)
self.text = text
self.font = pg.font.Font(None, FONT_SIZE)
self.active = False
self.color = GREEN
self.bg_color = (50, 50, 50)
self.txt_surface = self.font.render(text, True, SKY_BLUE)
def handle_event(self, event):
if event.type == pg.MOUSEBUTTONDOWN:
# Check if clicked inside the input box
was_active = self.active
self.active = self.rect.collidepoint(event.pos)
self.color = (255, 215, 0) if self.active else (200, 200, 200)
if event.type == pg.KEYDOWN:
if self.active:
if event.key == pg.K_RETURN:
self.active = False
return True
elif event.key == pg.K_BACKSPACE:
self.text = self.text[:-1]
else:
# Only add character if it's printable
if event.unicode.isprintable() and len(self.text) < 15: # Limit name length
self.text += event.unicode
# Re-render the text
self.txt_surface = self.font.render(self.text, True, BLACK)
return False
def draw(self, screen):
pg.draw.rect(screen, self.bg_color, self.rect)
pg.draw.rect(screen, self.color, self.rect, 2)
screen.blit(self.txt_surface, (self.rect.x + 5, self.rect.y + 5))
class Menu:
def __init__(self, screen):
self.screen = screen
self.clock = pg.time.Clock()
self.running = True
# Create buttons
center_x = WINDOW_WIDTH // 2
self.start_button = Button(
center_x - BUTTON_WIDTH//2,
WINDOW_HEIGHT - MENU_SPACING,
BUTTON_WIDTH, BUTTON_HEIGHT,
"Start Game",
BLUE
)
# Create input boxes
self.player1_input = InputBox(
center_x - BUTTON_WIDTH,
WINDOW_HEIGHT//2,
BUTTON_WIDTH, BUTTON_HEIGHT,
"Player 1",
)
self.player2_input = InputBox(
center_x + 20,
WINDOW_HEIGHT//2,
BUTTON_WIDTH, BUTTON_HEIGHT,
"Player 2",
)
# Load and play background music -- NEW
pg.mixer.music.load('assets/sounds/theme_song.mp3') # Adjust filename if different
pg.mixer.music.set_volume(0.5) # Moderate volume
pg.mixer.music.play(-1) # Loop indefinitely
def run(self):
while self.running:
self.clock.tick(FPS)
for event in pg.event.get():
if event.type == pg.QUIT:
pg.mixer.music.stop() # Stop music on quit -- NEW
pg.quit()
return None, None
if self.start_button.handle_event(event):
pg.mixer.music.stop() # Stop music when starting game -- NEW
self.running = False
return self.player1_input.text, self.player2_input.text
self.player1_input.handle_event(event)
self.player2_input.handle_event(event)
self.draw()
pg.display.flip()
def draw(self):
# Draw background
self.screen.blit(MENU_BACKGROUND, (0, 0))
# Draw semi-transparent overlay
overlay = pg.Surface(WINDOW_SIZE)
overlay.fill((0, 0, 0))
overlay.set_alpha(128)
self.screen.blit(overlay, (0, 0))
# Draw title
font = pg.font.Font(None, FONT_SIZE * 3)
title = font.render("Angry Birds", True, RED)
subtitle = font.render("2 Player", True, RED)
title_rect = title.get_rect(center=(WINDOW_WIDTH//2, MENU_SPACING))
subtitle_rect = subtitle.get_rect(center=(WINDOW_WIDTH//2, MENU_SPACING + 80))
self.screen.blit(title, title_rect)
self.screen.blit(subtitle, subtitle_rect)
# Draw birds
red_bird = pg.transform.scale(GAME_IMAGES['red'], (60, 60))
blue_bird = pg.transform.scale(GAME_IMAGES['blue'], (60, 60))
self.screen.blit(red_bird, (WINDOW_WIDTH//4, MENU_SPACING + 20))
self.screen.blit(blue_bird, (3*WINDOW_WIDTH//4 - 60, MENU_SPACING + 20))
# Draw player name labels
font = pg.font.Font(None, FONT_SIZE)
p1_label = font.render("Player 1 Name:", True, YELLOW)
p2_label = font.render("Player 2 Name:", True, YELLOW)
self.screen.blit(p1_label, (self.player1_input.rect.x, self.player1_input.rect.y - 30))
self.screen.blit(p2_label, (self.player2_input.rect.x, self.player2_input.rect.y - 30))
# Draw input boxes and button
self.player1_input.draw(self.screen)
self.player2_input.draw(self.screen)
self.start_button.draw(self.screen)
pg.display.flip()