started on main menu system, 3 gamemodes.
This commit is contained in:
parent
3b7c57c7dc
commit
48081bb043
1 changed files with 96 additions and 79 deletions
167
main.py
167
main.py
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue