started on main menu system, 3 gamemodes.

This commit is contained in:
kojtech 2026-10-22 21:15:31 +02:00
commit 48081bb043

167
main.py
View file

@ -8,6 +8,22 @@ screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Sugarmania") pygame.display.set_caption("Sugarmania")
clock = pygame.time.Clock() clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 36) font = pygame.font.SysFont(None, 36)
big_font = pygame.font.SysFont(None, 64)
small_font = pygame.font.SysFont(None, 26)
MENU_OPTIONS = ["Play", "Quit"]
MODE_NAMES = ["easy", "medium", "hard"]
MODES = {
"easy": {"lives": 5, "speed": 7, "spawn_every": 10, "enemy_pool": ["Bouncer"], "desc": "Only Bouncers. One new enemy per 10 sugar"},
"medium": {"lives": 3, "speed": 6, "spawn_every": 7, "enemy_pool": ["Bouncer", "Chaser"], "desc": "Bouncers and Chasers. One new enemy per 7 sugar"},
"hard": {"lives": 2, "speed": 5, "spawn_every": 5, "enemy_pool": ["Bouncer", "Chaser", "Dasher"], "desc": "Bouncers, Chasers and Dashers. One new enemy per 5 sugar"}
}
class ChaserEnemy: class ChaserEnemy:
def __init__(self, avoid_rect): def __init__(self, avoid_rect):
@ -17,8 +33,8 @@ class ChaserEnemy:
self.rect.y = random.randint(0, HEIGHT - 36) self.rect.y = random.randint(0, HEIGHT - 36)
if abs(self.rect.x - avoid_rect.x) > 150 or abs(self.rect.y - avoid_rect.y) > 150: if abs(self.rect.x - avoid_rect.x) > 150 or abs(self.rect.y - avoid_rect.y) > 150:
break break
self.speed = 2 self.speed = 2
self.spawn_timer = 60 self.spawn_timer = 60
def update(self, target): def update(self, target):
if self.rect.centerx < target.centerx: if self.rect.centerx < target.centerx:
@ -50,7 +66,7 @@ class DasherEnemy:
if self.state == "wait": if self.state == "wait":
dx = target.centerx - self.rect.centerx dx = target.centerx - self.rect.centerx
dy = target.centery - self.rect.centery dy = target.centery - self.rect.centery
dist = max(1, (dx ** 2 + dy ** 2) ** 0,5) dist = max(1, (dx ** 2 + dy ** 2) ** 0.5)
self.vx = dx / dist * 9 self.vx = dx / dist * 9
self.vy = dy / dist * 9 self.vy = dy / dist * 9
self.state = "dash" self.state = "dash"
@ -77,7 +93,7 @@ class BouncerEnemy:
self.vy = random.choice([-3, -2, 2, 3]) self.vy = random.choice([-3, -2, 2, 3])
self.spawn_timer = 60 self.spawn_timer = 60
def update(self): def update(self, target=None):
self.rect.x += self.vx self.rect.x += self.vx
self.rect.y += self.vy self.rect.y += self.vy
if self.rect.left < 0 or self.rect.right > WIDTH: if self.rect.left < 0 or self.rect.right > WIDTH:
@ -86,23 +102,13 @@ class BouncerEnemy:
self.vy = -self.vy self.vy = -self.vy
def enemy_for_level(level): #idk if I'll add the levels ENEMY_CLASSES = {"Bouncer": BouncerEnemy, "Chaser": ChaserEnemy, "Dasher": DasherEnemy}
if level == 2:
return ChaserEnemy
if level == 3:
return DasherEnemy
if level == 4:
return DasherEnemy
return random.choice([BouncerEnemy, DasherEnemy, ChaserEnemy])
player_img = pygame.image.load("player.png").convert_alpha() player_img = pygame.image.load("player.png").convert_alpha()
player_img = pygame.transform.scale(player_img, (40, 60)) player_img = pygame.transform.scale(player_img, (40, 60))
player = pygame.Rect(300, 220, 40, 60)
speed = 5
Bouncer_img = pygame.image.load("Bouncer.png").convert_alpha() Bouncer_img = pygame.image.load("Bouncer.png").convert_alpha()
Bouncer_img = pygame.transform.scale(Bouncer_img, (30, 45)) Bouncer_img = pygame.transform.scale(Bouncer_img, (30, 45))
@ -116,8 +122,6 @@ Dasher_img = pygame.transform.scale(Dasher_img, (30, 45))
sugar_img = pygame.image.load("honey.png").convert_alpha() sugar_img = pygame.image.load("honey.png").convert_alpha()
sugar_img = pygame.transform.scale(sugar_img, (50, 50)) sugar_img = pygame.transform.scale(sugar_img, (50, 50))
score = 0
Enemies = []
heart_img = pygame.image.load("Heart.png").convert_alpha() heart_img = pygame.image.load("Heart.png").convert_alpha()
@ -127,77 +131,90 @@ heart_img = pygame.transform.scale(heart_img,(40, 40))
def new_sugar(): def new_sugar():
return pygame.Rect(random.randint(0, WIDTH - 20), return pygame.Rect(random.randint(0, WIDTH - 20),
random.randint(0, HEIGHT - 20), 50, 50) #20,s random.randint(0, HEIGHT - 20), 50, 50) #20,s
sugar = new_sugar()
lives = 3
hit_timer = 0
#game loop #game loop
running = True def game_screen(mode):
while running: cfg = MODES[mode]
for event in pygame.event.get(): player = pygame.Rect(300, 220, 40, 60)
speed = cfg["speed"]
score = 0
Enemies = []
sugar = new_sugar()
lives = cfg["lives"]
hit_timer = 0
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
running = False return "quit", score
#movement
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] or keys[pygame.K_a]:
player.x -= speed
if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
player.x += speed
if keys[pygame.K_UP] or keys[pygame.K_w]:
player.y -= speed
if keys[pygame.K_DOWN] or keys[pygame.K_s]:
player.y += speed
for enemy in Enemies: #movement
if enemy.spawn_timer > 0: keys = pygame.key.get_pressed()
enemy.spawn_timer -= 1 if keys[pygame.K_LEFT] or keys[pygame.K_a]:
else: player.x -= speed
enemy.update() if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
if hit_timer > 0: player.x += speed
hit_timer -= 1 if keys[pygame.K_UP] or keys[pygame.K_w]:
else: player.y -= speed
if keys[pygame.K_DOWN] or keys[pygame.K_s]:
player.y += speed
for enemy in Enemies: for enemy in Enemies:
if enemy.spawn_timer <= 0 and player.colliderect(enemy.rect): if enemy.spawn_timer > 0:
lives -= 1 enemy.spawn_timer -= 1
hit_timer = 90 else:
break enemy.update(player)
if lives <= 0: if hit_timer > 0:
running = False hit_timer -= 1
else:
for enemy in Enemies:
if enemy.spawn_timer <= 0 and player.colliderect(enemy.rect):
lives -= 1
hit_timer = 90
break
if lives <= 0:
return "gameover", score
#keep player in #keep player in
player.clamp_ip(screen.get_rect()) player.clamp_ip(screen.get_rect())
# score # score
if player.colliderect(sugar): if player.colliderect(sugar):
score += 1 score += 1
sugar = new_sugar() sugar = new_sugar()
if score % 10 == 0: if score % cfg["spawn_every"] == 0 and cfg["enemy_pool"]:
Enemies.append(BouncerEnemy(player)) enemy_name = random.choice(cfg["enemy_pool"])
Enemies.append(ENEMY_CLASSES[enemy_name](player))
screen.fill((255, 228, 240)) # screen screen.fill((255, 228, 240)) # screen
screen.blit(sugar_img, sugar) #sugar screen.blit(sugar_img, sugar) #sugar
screen.blit(player_img, player) #player screen.blit(player_img, player) #player
if hit_timer % 10 < 5: if hit_timer % 10 < 5:
screen.blit(player_img, player)
text = font.render(f"score: {score}", True, (90, 30, 60))
screen.blit(text, (10, 10))
for enemy in Enemies:
if enemy.spawn_timer % 10 < 5:
screen.blit(Bouncer_img, enemy.rect)
screen.blit(player_img, player) screen.blit(player_img, player)
text = font.render(f"score: {score}", True, (90, 30, 60)) if hit_timer > 0 and hit_timer % 10 < 5:
screen.blit(text, (10, 10)) red = player_img.copy()
for enemy in Enemies: red.fill((255, 40, 40, 0), special_flags=pygame.BLEND_RGBA_ADD)
if enemy.spawn_timer % 10 < 5: screen.blit(red, player)
screen.blit(Bouncer_img, enemy.rect) for i in range(lives):
screen.blit(player_img, player) screen.blit(heart_img, (10 + i * 35, 40))
if hit_timer > 0 and hit_timer % 10 < 5: pygame.display.flip()
red = player_img.copy() clock.tick(60)
red.fill((255, 40, 40, 0), special_flags=pygame.BLEND_RGBA_ADD)
screen.blit(red, player)
for i in range(lives):
screen.blit(heart_img, (10 + i * 35, 40))
pygame.display.flip()
clock.tick(60)
pygame.quit() pygame.quit()
def menu_screen():
selected = 0
while True:
for