Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 29 additions & 28 deletions code/button.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
import pygame


class Button():
def __init__(self,x,y, image):
self.image = image
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.clicked = False

def draw(self, surface):
action = False

# get mouse position
pos = pygame.mouse.get_pos()

# check mouseover and clicked conditions
if self.rect.collidepoint(pos):
if pygame.mouse.get_pressed()[0] == 1:
action = True
self.clicked = True
if pygame.mouse.get_pressed()[0] == 0:
self.clicked = False
# draw button on screen
surface.blit(self.image, self.rect)

return action
import pygame


class Button():
def __init__(self,x,y, image):
self.image = image
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.clicked = False

def draw(self, surface):
action = False

# get mouse position
pos = pygame.mouse.get_pos()
self.clicked = False

# check mouseover and clicked conditions
if self.rect.collidepoint(pos):
if pygame.mouse.get_pressed()[0] == 1:
action = True
self.clicked = True
if pygame.mouse.get_pressed()[0] == 0:
self.clicked = False
# draw button on screen
surface.blit(self.image, self.rect)

return action
77 changes: 47 additions & 30 deletions code/level.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import pygame
from tiles import Tile
from settings import tile_size, screen_width, level_map2
from settings import tile_size, screen_width, level_map, level_map2, screen_height
from player import Player
from enemies import Enemy
from Door import Door
Expand Down Expand Up @@ -99,32 +99,33 @@ def check_door_collision(self):
if pygame.sprite.collide_rect(player, door):
keys = pygame.key.get_pressed()
if keys[pygame.K_SPACE]:
self.change_level() # Change the level when the player interacts with the door
def change_level(self):
self.change_level(level_map2) # Change the level when the player interacts with the door

def change_level(self, level=level_map):
# Clear all sprite groups
self.tiles.empty()
self.player.empty()
self.enemies.empty()
self.doors.empty()

# Load the new level data
self.setup_level(level_map2)
self.setup_level(level)

def vertical_enemy_collision(self):
for enemy in self.enemies.sprites():
temp_rect = enemy.rect.copy()
temp_rect.y += 1
flag = False
for sprite in self.tiles.sprites():
if sprite.rect.colliderect(temp_rect):
enemy.on_ground = True
flag = True
if not flag:
if enemy.direction.x < 0:
enemy.direction.x = 1
elif enemy.direction.x > 0:
enemy.direction.x = -1
pass
# for enemy in self.enemies.sprites():
# temp_rect = enemy.rect.copy()
# temp_rect.y += 1
# flag = False
# for sprite in self.tiles.sprites():
# if sprite.rect.colliderect(temp_rect):
# enemy.on_ground = True
# flag = True
# if not flag:
# if enemy.direction.x < 0:
# enemy.direction.x = 1
# elif enemy.direction.x > 0:
# enemy.direction.x = -1


def horizontal_movement_collision(self):
Expand All @@ -134,11 +135,11 @@ def horizontal_movement_collision(self):
#merging knock back, wall collision and invisble frames
for enemy in self.enemies.sprites():
for sprite in self.tiles.sprites():
if enemy.rect.colliderect(player.rect) and not player.is_invincible:
if enemy.rect.colliderect(player.rect) and not player.is_invincible and player.state != 'attack':



# check if player is on the left of enemy or right and knock in that direction
if player.rect.left >= enemy.rect.left:
if player.rect.left >= enemy.rect.left:
#player.direction.x = 1
#player.direction.y = -15
#player.rect.x += player.direction.x * player.speed * 2
Expand All @@ -151,7 +152,7 @@ def horizontal_movement_collision(self):
elif enemy.direction.x > 0:
enemy.direction.x = -1


elif player.rect.left <= enemy.rect.left:
#player.direction.x = -1
#player.direction.y = -15
Expand All @@ -165,7 +166,9 @@ def horizontal_movement_collision(self):

player.jump()
player.on_ground = False
# check collision with the wall
# check collision with the wall
if enemy.rect.colliderect(player.rect) and not player.is_invincible and player.state == 'attack' and player.direction.x != enemy.direction.x:
enemy.kill()
if sprite.rect.colliderect(player.rect) and sprite != self.doors.sprite:
if player.direction.x < 0:
player.rect.left = sprite.rect.right
Expand All @@ -174,31 +177,40 @@ def horizontal_movement_collision(self):
player.rect.right = sprite.rect.left
self.world_shift = 0


def vertical_movement_collision(self):
player = self.player.sprite
player.apply_gravity()

#merging vertical knock back, wall collision and invislbe frames
for enemy in self.enemies.sprites():
for sprite in self.tiles.sprites():
if enemy.rect.colliderect(player.rect) and not player.is_invincible:
if player.rect.left <= enemy.rect.left:
if enemy.rect.colliderect(player.rect) and not player.is_invincible and player.state != 'jumpAttack':
if player.rect.left < enemy.rect.left:
#player.direction.y = -15
player.is_attacked(-1)
if enemy.direction.x < 0:
enemy.direction.x = 1
elif enemy.direction.x > 0:
enemy.direction.x = -1
elif player.rect.left >= enemy.rect.left:
elif player.rect.left > enemy.rect.left:
#player.direction.y = -15
player.is_attacked(1)
if enemy.direction.x < 0:
enemy.direction.x = 1
elif enemy.direction.x > 0:
enemy.direction.x = -1
else:
player.is_attacked(player.direction.x)
if enemy.direction.x < 0:
enemy.direction.x = 1
elif enemy.direction.x > 0:
enemy.direction.x = -1

player.jump()
player.on_ground = False
player.on_ground = False
if enemy.rect.colliderect(player.rect) and not player.is_invincible and player.state == 'jumpAttack':
enemy.kill()
if sprite.rect.colliderect(player.rect):
if player.direction.y > 0:
player.rect.bottom = sprite.rect.top
Expand All @@ -219,7 +231,7 @@ def run(self):
# Doors
self.doors.draw(self.display_surface)
self.doors.update(self.world_shift)

# Player
self.player.update()
self.scroll_x() # scroll_x before horizontal_movement_collision for moving screen
Expand All @@ -234,3 +246,8 @@ def run(self):
self.horizontal_enemy_collision()
self.enemies.update(self.world_shift)
self.enemies.draw(self.display_surface)

def check_player(self):
if self.player.sprite.current_health == 0 or (self.player.sprite.rect.left < 0 or self.player.sprite.rect.right > screen_width) or (self.player.sprite.rect.bottom > screen_height or self.player.sprite.rect.bottom < -64):
return 0
return 1
106 changes: 69 additions & 37 deletions code/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,41 +5,73 @@
from button import Button
from os import path

class Main:

# Pygame setup
pygame.init()
screen = pygame.display.set_mode((screen_width,screen_height))
clock = pygame.time.Clock()
level = Level(level_map, screen)
main_menu = True
start_img = pygame.image.load(path.join(base_path , 'buttons', 'start-1.png')).convert_alpha()
exit_img= pygame.image.load(path.join(base_path, 'buttons','exit-1.png')).convert_alpha()
start_button = Button(screen_width//2 - start_img.get_width()//2, 200, start_img)
exit_button = Button(screen_width//2 - exit_img.get_width()//2, 400, exit_img)
pygame.display.set_caption("2D Platformer Game")

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

background = pygame.image.load(path.join(base_path, 'bg.png')).convert()
background = pygame.transform.smoothscale(background, screen.get_size())
screen.blit(background, (0, 0))

if start_button.clicked:
main_menu = False

if exit_button.clicked:
pygame.quit()
sys.exit()

if main_menu == True:
start_button.draw(screen)
exit_button.draw(screen)
else:
level.run()


pygame.display.update()
clock.tick(clock_tick)
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((screen_width, screen_height))
self.clock = pygame.time.Clock()
self.level = Level(level_map, self.screen)
self.main_menu = True
self.start_img = pygame.image.load(path.join(base_path, 'buttons', 'start-1.png')).convert_alpha()
self.exit_img = pygame.image.load(path.join(base_path, 'buttons', 'exit-1.png')).convert_alpha()
self.menu_img = pygame.image.load(path.join(base_path, 'title.png')).convert_alpha()

self.menu_background_img = pygame.transform.scale(pygame.image.load(path.join(base_path, 'sky1.png')).convert(), self.screen.get_size())
self.game_background_img = pygame.transform.scale(pygame.image.load(path.join(base_path, 'bg.png')).convert(), self.screen.get_size())

self.start_button = Button(screen_width//2 - self.start_img.get_width()//2, 500, self.start_img)
self.exit_button = Button(screen_width//2 - self.exit_img.get_width()//2, 600, self.exit_img)
pygame.display.set_caption("2D Platformer Game")


def run(self):
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

self.screen.fill((0, 0, 0)) # Clear the screen with black before drawing anything

# Check if the game is in the main menu state
if self.main_menu:
# Load the main menu background image
background_img = self.menu_background_img
else:
# Resize the background image to match the screen size
background_img = self.game_background_img

# Blit the background image onto the screen
self.screen.blit(background_img, (0, 0))

# Handle game logic based on the current state
if not self.main_menu:
self.level.run()
if not self.level.check_player():
self.main_menu = True
self.level.change_level(level_map)

if self.main_menu:
# Draw the main menu buttons
self.screen.blit(self.menu_img, (screen_width//2 - self.menu_img.get_width()//2, 50))
self.start_button.draw(self.screen)
self.exit_button.draw(self.screen)

if self.start_button.clicked:
self.main_menu = False

if self.exit_button.clicked:
return 2
else:
self.level.run()

pygame.display.update()
self.clock.tick(clock_tick)

if __name__ == '__main__':
main = Main()
out = 0
while out != 2:
out = main.run()
Loading