diff --git a/Jungle Adventures/LICENSE b/Jungle Adventures/LICENSE new file mode 100644 index 0000000..d1a29cb --- /dev/null +++ b/Jungle Adventures/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Denis Muriungi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Jungle Adventures/README.md b/Jungle Adventures/README.md new file mode 100644 index 0000000..039acf3 --- /dev/null +++ b/Jungle Adventures/README.md @@ -0,0 +1,58 @@ +# Jungle Adventure + +This is a 2D RPG game based on the real-life military operation Linda Nchi conducted by the Kenyan army against Al-Shabaab militants in Somalia. The game features a variety of enemies, weapons, and levels that the player must navigate in order to complete the game. + +## Play here + +[Play](https://muriungi6.itch.io/jungle-adventure) + +## Screenshots + +![Menu Screen](https://github.com/riush03/Python-Games/blob/master/Jungle%20%20Adventures/screenshots/Screenshot_1.png) +## Requirements + +To run this game, you will need to have the following software installed: + +- Python 3.x +- Pygame library[game.py](game.py) + +You can install Pygame using the following command: + + +## How to Play + +1. Clone the repository to your local machine using `git clone`. + +2. Navigate to the game directory in your terminal or command prompt. + +3. Run the game by executing the `main.py` file: + +4. Use the following controls to navigate the game: + + - ⬆️/SPACE to Jump + - ⬅️ to move left + - ➡️ to move right + - ⬇️ to move down + + +5. Your goal is to navigate through each level, defeat enemies, and reach the end of the level without losing all your health. Collect power-ups along the way to gain an advantage against your enemies. + +Enjoy the game! + +## How to Run/Test + +1. Clone the repository to your local machine using `git clone`. + +2. Navigate to the game directory in your terminal or command prompt. + +3. Double-click on the `OLN.py` file to run the game. + +4. Use the following controls to navigate the game: + + - ⬆️/SPACE to Jump + - ⬅️ to move left + - ➡️ to move right + - ⬇️ to move down + + +Enjoy the game. diff --git a/Jungle Dash/app.png b/Jungle Adventures/app.png similarity index 100% rename from Jungle Dash/app.png rename to Jungle Adventures/app.png diff --git a/Jungle Dash/assets/BG1.png b/Jungle Adventures/assets/BG1.png similarity index 100% rename from Jungle Dash/assets/BG1.png rename to Jungle Adventures/assets/BG1.png diff --git a/Jungle Dash/assets/BG2.png b/Jungle Adventures/assets/BG2.png similarity index 100% rename from Jungle Dash/assets/BG2.png rename to Jungle Adventures/assets/BG2.png diff --git a/Jungle Dash/assets/d1.png b/Jungle Adventures/assets/d1.png similarity index 100% rename from Jungle Dash/assets/d1.png rename to Jungle Adventures/assets/d1.png diff --git a/Jungle Dash/assets/d2.png b/Jungle Adventures/assets/d2.png similarity index 100% rename from Jungle Dash/assets/d2.png rename to Jungle Adventures/assets/d2.png diff --git a/Jungle Dash/assets/d3.png b/Jungle Adventures/assets/d3.png similarity index 100% rename from Jungle Dash/assets/d3.png rename to Jungle Adventures/assets/d3.png diff --git a/Jungle Dash/assets/d4.png b/Jungle Adventures/assets/d4.png similarity index 100% rename from Jungle Dash/assets/d4.png rename to Jungle Adventures/assets/d4.png diff --git a/Jungle Dash/assets/exit.png b/Jungle Adventures/assets/exit.png similarity index 100% rename from Jungle Dash/assets/exit.png rename to Jungle Adventures/assets/exit.png diff --git a/Jungle Dash/assets/gate1.png b/Jungle Adventures/assets/gate1.png similarity index 100% rename from Jungle Dash/assets/gate1.png rename to Jungle Adventures/assets/gate1.png diff --git a/Jungle Dash/assets/gate2.png b/Jungle Adventures/assets/gate2.png similarity index 100% rename from Jungle Dash/assets/gate2.png rename to Jungle Adventures/assets/gate2.png diff --git a/Jungle Dash/assets/gate3.png b/Jungle Adventures/assets/gate3.png similarity index 100% rename from Jungle Dash/assets/gate3.png rename to Jungle Adventures/assets/gate3.png diff --git a/Jungle Dash/assets/gate4.png b/Jungle Adventures/assets/gate4.png similarity index 100% rename from Jungle Dash/assets/gate4.png rename to Jungle Adventures/assets/gate4.png diff --git a/Jungle Dash/assets/gate5.png b/Jungle Adventures/assets/gate5.png similarity index 100% rename from Jungle Dash/assets/gate5.png rename to Jungle Adventures/assets/gate5.png diff --git a/Jungle Dash/assets/ghost.png b/Jungle Adventures/assets/ghost.png similarity index 100% rename from Jungle Dash/assets/ghost.png rename to Jungle Adventures/assets/ghost.png diff --git a/Jungle Dash/assets/gover.png b/Jungle Adventures/assets/gover.png similarity index 100% rename from Jungle Dash/assets/gover.png rename to Jungle Adventures/assets/gover.png diff --git a/Jungle Dash/assets/home.png b/Jungle Adventures/assets/home.png similarity index 100% rename from Jungle Dash/assets/home.png rename to Jungle Adventures/assets/home.png diff --git a/Jungle Dash/assets/jungle dash.png b/Jungle Adventures/assets/jungle dash.png similarity index 100% rename from Jungle Dash/assets/jungle dash.png rename to Jungle Adventures/assets/jungle dash.png diff --git a/Jungle Dash/assets/left.png b/Jungle Adventures/assets/left.png similarity index 100% rename from Jungle Dash/assets/left.png rename to Jungle Adventures/assets/left.png diff --git a/Jungle Dash/assets/load_btn.png b/Jungle Adventures/assets/load_btn.png similarity index 100% rename from Jungle Dash/assets/load_btn.png rename to Jungle Adventures/assets/load_btn.png diff --git a/Jungle Dash/assets/moving.png b/Jungle Adventures/assets/moving.png similarity index 100% rename from Jungle Dash/assets/moving.png rename to Jungle Adventures/assets/moving.png diff --git a/Jungle Dash/assets/music-on.png b/Jungle Adventures/assets/music-on.png similarity index 100% rename from Jungle Dash/assets/music-on.png rename to Jungle Adventures/assets/music-on.png diff --git a/Jungle Dash/assets/play.png b/Jungle Adventures/assets/play.png similarity index 100% rename from Jungle Dash/assets/play.png rename to Jungle Adventures/assets/play.png diff --git a/Jungle Dash/assets/replay.png b/Jungle Adventures/assets/replay.png similarity index 100% rename from Jungle Dash/assets/replay.png rename to Jungle Adventures/assets/replay.png diff --git a/Jungle Dash/assets/right.png b/Jungle Adventures/assets/right.png similarity index 100% rename from Jungle Dash/assets/right.png rename to Jungle Adventures/assets/right.png diff --git a/Jungle Dash/assets/save_btn.png b/Jungle Adventures/assets/save_btn.png similarity index 100% rename from Jungle Dash/assets/save_btn.png rename to Jungle Adventures/assets/save_btn.png diff --git a/Jungle Dash/assets/setting.png b/Jungle Adventures/assets/setting.png similarity index 100% rename from Jungle Dash/assets/setting.png rename to Jungle Adventures/assets/setting.png diff --git a/Jungle Dash/assets/sun.png b/Jungle Adventures/assets/sun.png similarity index 100% rename from Jungle Dash/assets/sun.png rename to Jungle Adventures/assets/sun.png diff --git a/Jungle Dash/assets/won.png b/Jungle Adventures/assets/won.png similarity index 100% rename from Jungle Dash/assets/won.png rename to Jungle Adventures/assets/won.png diff --git a/Jungle Dash/level_editor.py b/Jungle Adventures/level_editor.py similarity index 96% rename from Jungle Dash/level_editor.py rename to Jungle Adventures/level_editor.py index 7f25b61..32fab25 100644 --- a/Jungle Dash/level_editor.py +++ b/Jungle Adventures/level_editor.py @@ -1,301 +1,301 @@ -import os -os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" - -import pickle -import pygame -from pygame.locals import * -from pprint import pprint - -if not os.path.exists('levels/'): - os.mkdir('levels/') - - -# EDIT HERE ( WINDOW SIZE & TILE SIZE ) -SIZE = WIDTH , HEIGHT= 1000, 650 -tile_size = 50 - -# Not to be edited -pygame.init() -clock = pygame.time.Clock() -fps = 30 - -cols = WIDTH // tile_size -rows = HEIGHT // tile_size -margin = 210 - -win_width = WIDTH + margin -win_height = HEIGHT - -win = pygame.display.set_mode((win_width, win_height)) -pygame.display.set_caption('Level Editor') - -# load backgrounds -sun_img = pygame.image.load('assets/sun.png') -bg_img = pygame.image.load('assets/BG1.png') -bg_img = pygame.transform.scale(bg_img, (win_width - margin, HEIGHT)) - -# load buttons -save_img = pygame.image.load('assets/save_btn.png') -load_img = pygame.image.load('assets/load_btn.png') -left_img = pygame.image.load('assets/left.png') -right_img = pygame.image.load('assets/right.png') - -# load tiles -tiles = [] -for t in sorted(os.listdir('tiles/'), key=lambda s: int(s[:-4])): - tile = pygame.image.load('tiles/' + t) - tiles.append(tile) - - -#define game variables -clicked = False -current_level = 1 - -#define colours -WHITE = (255, 255, 255) -GREEN = (144, 201, 120) -BLUE = (30, 144, 255) - -font = pygame.font.SysFont('Futura', 24) - -# Empty world data -world_data = [] -for r in range(rows): - c = [0] * cols - world_data.append(c) - -def draw_text(text_, font, color, pos): - text = font.render(text_, True, color) - win.blit(text, pos) - -def draw_lines(): - for row in range(rows+1): - pygame.draw.line(win, WHITE, (0, tile_size*row), (WIDTH, tile_size*row), 2) - for col in range(cols): - pygame.draw.line(win, WHITE, (tile_size*col, 0), (tile_size*col, HEIGHT), 2) - -def draw_world(): - for row in range(rows): - for col in range(cols): - index = world_data[row][col] - if index > 0: - if index in range(1,14) or index in (25,26): - #dirt block - img = pygame.transform.scale(tiles[index-1], (tile_size, tile_size)) - win.blit(img, (col * tile_size, row * tile_size)) - if index == 14: - #bush blocks - img = pygame.transform.scale(tiles[index-1], (tile_size, int(tile_size * 0.50))) - win.blit(img, (col * tile_size, row * tile_size + tile_size // 2)) - if index == 15: - #lava blocks - img = pygame.transform.scale(tiles[index-1], (tile_size, int(tile_size * 0.50))) - win.blit(img, (col * tile_size, row * tile_size + tile_size // 2)) - if index == 16: - #Lava Still block - img = pygame.transform.scale(tiles[index-1], (tile_size, tile_size)) - win.blit(img, (col * tile_size, row * tile_size)) - if index == 17: - #Diamond blocks - img = pygame.transform.scale(tiles[index-1], (tile_size, tile_size)) - win.blit(img, (col * tile_size, row * tile_size)) - if index == 18: - #Crate block - img = pygame.transform.scale(tiles[index-1], (tile_size, tile_size)) - win.blit(img, (col * tile_size, row * tile_size)) - if index == 19: - #Water blocks - img = pygame.transform.scale(tiles[index-1], (tile_size, int(tile_size * 0.50))) - win.blit(img, (col * tile_size, row * tile_size + tile_size // 2)) - if index == 20: - #Water blocks - img = pygame.transform.scale(tiles[index-1], (tile_size, tile_size)) - win.blit(img, (col * tile_size, row * tile_size)) - if index == 21: - #tree blocks - img = pygame.transform.scale(tiles[index-1], (3*tile_size, 3 * tile_size)) - win.blit(img, ((col-1) * tile_size + 10, (row-2) * tile_size + 5)) - if index == 22: - #mushroom blocks - img = pygame.transform.scale(tiles[index-1], (int(tile_size * 0.80), int(tile_size * 0.80))) - win.blit(img, (col * tile_size + tile_size//8, row * tile_size + tile_size // 5)) - if index == 23: - #Bee blocks - img = pygame.transform.scale(tiles[index-1], (50, 50)) - win.blit(img, (col * tile_size, row * tile_size)) - if index == 24: - #Bee blocks - img = tiles[index-1] - win.blit(img, (col * tile_size - tile_size//4, row * tile_size - tile_size//4)) - if index == 27: - #flower blocks - img = pygame.transform.scale(tiles[index-1], (2*tile_size, tile_size)) - win.blit(img, ((col) * tile_size, row * tile_size)) - if index == 28: - #treelimb blocks - img = pygame.transform.scale(tiles[index-1], (5*tile_size + 20, tile_size)) - win.blit(img, ((col-2) * tile_size + 10, row * tile_size + tile_size // 4)) - if index == 29: - #slime blocks - img = pygame.transform.scale(tiles[index-1], (int(1.2*tile_size), tile_size)) - win.blit(img, (col * tile_size - 10, row * tile_size)) - - -class Button: - def __init__(self, pos, image): - self.image = image - self.rect = self.image.get_rect() - self.rect.topleft = pos - self.clicked = False - - def draw(self): - action = False - - pos = pygame.mouse.get_pos() - if self.rect.collidepoint(pos): - if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False: - action = True - self.clicked = True - - if pygame.mouse.get_pressed()[0] == 0: - self.clicked = False - - win.blit(self.image, self.rect) - - return action - -class Tile(): - def __init__(self, pos, image, index): - image = pygame.transform.scale(image, (40,40)) - self.image = image - self.rect = self.image.get_rect() - self.rect.topleft = pos - self.clicked = False - self.index = index - - def update(self): - action = False - - pos = pygame.mouse.get_pos() - if self.rect.collidepoint(pos): - if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False: - action = self.index - self.clicked = True - - if pygame.mouse.get_pressed()[0] == 0: - self.clicked = False - - win.blit(self.image, self.rect) - - return action - -tile_group = [] -for index, tile in enumerate(tiles): - row = index // (margin // (40 + 5) ) - column = index % (margin // (40 + 5) ) - pos = (WIDTH + 5 +(column * tile_size) + 5, 5 + row * tile_size + 5) - t = Tile(pos, tile, index+1) - tile_group.append(t) - -# #create load and save buttons -load_button = Button((WIDTH + 10, HEIGHT - 80), load_img) -save_button = Button((WIDTH + 110, HEIGHT - 80), save_img) -left_button = Button((WIDTH + 30, HEIGHT - 35), left_img) -right_button = Button((WIDTH + 140, HEIGHT - 35), right_img) - -initial_r = pygame.Rect(1*tile_size,1*tile_size,tile_size, tile_size) -rect = [initial_r, [1,1]] - -running = True -while running: - for event in pygame.event.get(): - if event.type == QUIT: - running = False - - if event.type == MOUSEBUTTONDOWN and clicked == False: - clicked = True - pos = pygame.mouse.get_pos() - if pos[0] <= WIDTH: - x = pos[0] // tile_size - y = pos[1] // tile_size - if pygame.mouse.get_pressed()[0]: - r = rect[1] - if r == [x,y]: - world_data[y][x] += 1 - if world_data[y][x] >= len(tiles) + 1: - world_data[y][x] = 0 - else: - r1 = pygame.Rect(x*tile_size, y*tile_size, tile_size, tile_size) - r2 = [x,y] - rect = [r1, r2] - elif pygame.mouse.get_pressed()[2]: - r = rect[1] - if r == [x,y]: - world_data[y][x] -= 1 - if world_data[y][x] < 0: - world_data[y][x] = len(tiles) - else: - r1 = pygame.Rect(x*tile_size, y*tile_size, tile_size, tile_size) - r2 = [x,y] - rect = [r1, r2] - - - if event.type == KEYDOWN: - pos = rect[1] - if event.key == K_LEFT: - if pos[0] > 0: - pos[0] -= 1 - elif event.key == K_RIGHT: - if pos[0] < cols-1: - pos[0] += 1 - elif event.key == K_UP: - if pos[1] > 0: - pos[1] -= 1 - elif event.key == K_DOWN: - if pos[1] < rows-1: - pos[1] += 1 - - rect[0] = pygame.Rect(pos[0]*tile_size, pos[1]*tile_size, tile_size, tile_size) - rect[1] = pos - - if event.type == pygame.MOUSEBUTTONUP: - clicked = False - - win.fill(BLUE) - win.blit(bg_img, (0,0)) - win.blit(sun_img, (80,60)) - draw_lines() - draw_world() - pygame.draw.rect(win, (255,0,0), rect[0], 3) - - for tile in tile_group: - index = tile.update() - if index: - current_tile = index - r = rect[1] - world_data[r[1]][r[0]] = index - - if save_button.draw(): - #save level data - pickle_out = open(f'levels/level{current_level}_data', 'wb') - pickle.dump(world_data, pickle_out) - pickle_out.close() - if load_button.draw(): - #load in level data - if os.path.exists(f'levels/level{current_level}_data'): - pickle_in = open(f'levels/level{current_level}_data', 'rb') - world_data = pickle.load(pickle_in) - - if left_button.draw(): - current_level -= 1 - if current_level < 1: - current_level = 1 - if right_button.draw(): - current_level += 1 - - #text showing current level - draw_text(f'Level: {current_level}', font, WHITE, (WIDTH + 70, win_height - 25)) - - pygame.display.flip() - +import os +os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" + +import pickle +import pygame +from pygame.locals import * +from pprint import pprint + +if not os.path.exists('levels/'): + os.mkdir('levels/') + + +# EDIT HERE ( WINDOW SIZE & TILE SIZE ) +SIZE = WIDTH , HEIGHT= 1000, 650 +tile_size = 50 + +# Not to be edited +pygame.init() +clock = pygame.time.Clock() +fps = 30 + +cols = WIDTH // tile_size +rows = HEIGHT // tile_size +margin = 210 + +win_width = WIDTH + margin +win_height = HEIGHT + +win = pygame.display.set_mode((win_width, win_height)) +pygame.display.set_caption('Level Editor') + +# load backgrounds +sun_img = pygame.image.load('assets/sun.png') +bg_img = pygame.image.load('assets/BG1.png') +bg_img = pygame.transform.scale(bg_img, (win_width - margin, HEIGHT)) + +# load buttons +save_img = pygame.image.load('assets/save_btn.png') +load_img = pygame.image.load('assets/load_btn.png') +left_img = pygame.image.load('assets/left.png') +right_img = pygame.image.load('assets/right.png') + +# load tiles +tiles = [] +for t in sorted(os.listdir('tiles/'), key=lambda s: int(s[:-4])): + tile = pygame.image.load('tiles/' + t) + tiles.append(tile) + + +#define game variables +clicked = False +current_level = 1 + +#define colours +WHITE = (255, 255, 255) +GREEN = (144, 201, 120) +BLUE = (30, 144, 255) + +font = pygame.font.SysFont('Futura', 24) + +# Empty world data +world_data = [] +for r in range(rows): + c = [0] * cols + world_data.append(c) + +def draw_text(text_, font, color, pos): + text = font.render(text_, True, color) + win.blit(text, pos) + +def draw_lines(): + for row in range(rows+1): + pygame.draw.line(win, WHITE, (0, tile_size*row), (WIDTH, tile_size*row), 2) + for col in range(cols): + pygame.draw.line(win, WHITE, (tile_size*col, 0), (tile_size*col, HEIGHT), 2) + +def draw_world(): + for row in range(rows): + for col in range(cols): + index = world_data[row][col] + if index > 0: + if index in range(1,14) or index in (25,26): + #dirt block + img = pygame.transform.scale(tiles[index-1], (tile_size, tile_size)) + win.blit(img, (col * tile_size, row * tile_size)) + if index == 14: + #bush blocks + img = pygame.transform.scale(tiles[index-1], (tile_size, int(tile_size * 0.50))) + win.blit(img, (col * tile_size, row * tile_size + tile_size // 2)) + if index == 15: + #lava blocks + img = pygame.transform.scale(tiles[index-1], (tile_size, int(tile_size * 0.50))) + win.blit(img, (col * tile_size, row * tile_size + tile_size // 2)) + if index == 16: + #Lava Still block + img = pygame.transform.scale(tiles[index-1], (tile_size, tile_size)) + win.blit(img, (col * tile_size, row * tile_size)) + if index == 17: + #Diamond blocks + img = pygame.transform.scale(tiles[index-1], (tile_size, tile_size)) + win.blit(img, (col * tile_size, row * tile_size)) + if index == 18: + #Crate block + img = pygame.transform.scale(tiles[index-1], (tile_size, tile_size)) + win.blit(img, (col * tile_size, row * tile_size)) + if index == 19: + #Water blocks + img = pygame.transform.scale(tiles[index-1], (tile_size, int(tile_size * 0.50))) + win.blit(img, (col * tile_size, row * tile_size + tile_size // 2)) + if index == 20: + #Water blocks + img = pygame.transform.scale(tiles[index-1], (tile_size, tile_size)) + win.blit(img, (col * tile_size, row * tile_size)) + if index == 21: + #tree blocks + img = pygame.transform.scale(tiles[index-1], (3*tile_size, 3 * tile_size)) + win.blit(img, ((col-1) * tile_size + 10, (row-2) * tile_size + 5)) + if index == 22: + #mushroom blocks + img = pygame.transform.scale(tiles[index-1], (int(tile_size * 0.80), int(tile_size * 0.80))) + win.blit(img, (col * tile_size + tile_size//8, row * tile_size + tile_size // 5)) + if index == 23: + #Bee blocks + img = pygame.transform.scale(tiles[index-1], (50, 50)) + win.blit(img, (col * tile_size, row * tile_size)) + if index == 24: + #Bee blocks + img = tiles[index-1] + win.blit(img, (col * tile_size - tile_size//4, row * tile_size - tile_size//4)) + if index == 27: + #flower blocks + img = pygame.transform.scale(tiles[index-1], (2*tile_size, tile_size)) + win.blit(img, ((col) * tile_size, row * tile_size)) + if index == 28: + #treelimb blocks + img = pygame.transform.scale(tiles[index-1], (5*tile_size + 20, tile_size)) + win.blit(img, ((col-2) * tile_size + 10, row * tile_size + tile_size // 4)) + if index == 29: + #slime blocks + img = pygame.transform.scale(tiles[index-1], (int(1.2*tile_size), tile_size)) + win.blit(img, (col * tile_size - 10, row * tile_size)) + + +class Button: + def __init__(self, pos, image): + self.image = image + self.rect = self.image.get_rect() + self.rect.topleft = pos + self.clicked = False + + def draw(self): + action = False + + pos = pygame.mouse.get_pos() + if self.rect.collidepoint(pos): + if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False: + action = True + self.clicked = True + + if pygame.mouse.get_pressed()[0] == 0: + self.clicked = False + + win.blit(self.image, self.rect) + + return action + +class Tile(): + def __init__(self, pos, image, index): + image = pygame.transform.scale(image, (40,40)) + self.image = image + self.rect = self.image.get_rect() + self.rect.topleft = pos + self.clicked = False + self.index = index + + def update(self): + action = False + + pos = pygame.mouse.get_pos() + if self.rect.collidepoint(pos): + if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False: + action = self.index + self.clicked = True + + if pygame.mouse.get_pressed()[0] == 0: + self.clicked = False + + win.blit(self.image, self.rect) + + return action + +tile_group = [] +for index, tile in enumerate(tiles): + row = index // (margin // (40 + 5) ) + column = index % (margin // (40 + 5) ) + pos = (WIDTH + 5 +(column * tile_size) + 5, 5 + row * tile_size + 5) + t = Tile(pos, tile, index+1) + tile_group.append(t) + +# #create load and save buttons +load_button = Button((WIDTH + 10, HEIGHT - 80), load_img) +save_button = Button((WIDTH + 110, HEIGHT - 80), save_img) +left_button = Button((WIDTH + 30, HEIGHT - 35), left_img) +right_button = Button((WIDTH + 140, HEIGHT - 35), right_img) + +initial_r = pygame.Rect(1*tile_size,1*tile_size,tile_size, tile_size) +rect = [initial_r, [1,1]] + +running = True +while running: + for event in pygame.event.get(): + if event.type == QUIT: + running = False + + if event.type == MOUSEBUTTONDOWN and clicked == False: + clicked = True + pos = pygame.mouse.get_pos() + if pos[0] <= WIDTH: + x = pos[0] // tile_size + y = pos[1] // tile_size + if pygame.mouse.get_pressed()[0]: + r = rect[1] + if r == [x,y]: + world_data[y][x] += 1 + if world_data[y][x] >= len(tiles) + 1: + world_data[y][x] = 0 + else: + r1 = pygame.Rect(x*tile_size, y*tile_size, tile_size, tile_size) + r2 = [x,y] + rect = [r1, r2] + elif pygame.mouse.get_pressed()[2]: + r = rect[1] + if r == [x,y]: + world_data[y][x] -= 1 + if world_data[y][x] < 0: + world_data[y][x] = len(tiles) + else: + r1 = pygame.Rect(x*tile_size, y*tile_size, tile_size, tile_size) + r2 = [x,y] + rect = [r1, r2] + + + if event.type == KEYDOWN: + pos = rect[1] + if event.key == K_LEFT: + if pos[0] > 0: + pos[0] -= 1 + elif event.key == K_RIGHT: + if pos[0] < cols-1: + pos[0] += 1 + elif event.key == K_UP: + if pos[1] > 0: + pos[1] -= 1 + elif event.key == K_DOWN: + if pos[1] < rows-1: + pos[1] += 1 + + rect[0] = pygame.Rect(pos[0]*tile_size, pos[1]*tile_size, tile_size, tile_size) + rect[1] = pos + + if event.type == pygame.MOUSEBUTTONUP: + clicked = False + + win.fill(BLUE) + win.blit(bg_img, (0,0)) + win.blit(sun_img, (80,60)) + draw_lines() + draw_world() + pygame.draw.rect(win, (255,0,0), rect[0], 3) + + for tile in tile_group: + index = tile.update() + if index: + current_tile = index + r = rect[1] + world_data[r[1]][r[0]] = index + + if save_button.draw(): + #save level data + pickle_out = open(f'levels/level{current_level}_data', 'wb') + pickle.dump(world_data, pickle_out) + pickle_out.close() + if load_button.draw(): + #load in level data + if os.path.exists(f'levels/level{current_level}_data'): + pickle_in = open(f'levels/level{current_level}_data', 'rb') + world_data = pickle.load(pickle_in) + + if left_button.draw(): + current_level -= 1 + if current_level < 1: + current_level = 1 + if right_button.draw(): + current_level += 1 + + #text showing current level + draw_text(f'Level: {current_level}', font, WHITE, (WIDTH + 70, win_height - 25)) + + pygame.display.flip() + pygame.quit() \ No newline at end of file diff --git a/Jungle Dash/levels/level10_data b/Jungle Adventures/levels/level10_data similarity index 100% rename from Jungle Dash/levels/level10_data rename to Jungle Adventures/levels/level10_data diff --git a/Jungle Dash/levels/level11_data b/Jungle Adventures/levels/level11_data similarity index 100% rename from Jungle Dash/levels/level11_data rename to Jungle Adventures/levels/level11_data diff --git a/Jungle Dash/levels/level12_data b/Jungle Adventures/levels/level12_data similarity index 100% rename from Jungle Dash/levels/level12_data rename to Jungle Adventures/levels/level12_data diff --git a/Jungle Dash/levels/level1_data b/Jungle Adventures/levels/level1_data similarity index 100% rename from Jungle Dash/levels/level1_data rename to Jungle Adventures/levels/level1_data diff --git a/Jungle Dash/levels/level2_data b/Jungle Adventures/levels/level2_data similarity index 100% rename from Jungle Dash/levels/level2_data rename to Jungle Adventures/levels/level2_data diff --git a/Jungle Dash/levels/level3_data b/Jungle Adventures/levels/level3_data similarity index 100% rename from Jungle Dash/levels/level3_data rename to Jungle Adventures/levels/level3_data diff --git a/Jungle Dash/levels/level4_data b/Jungle Adventures/levels/level4_data similarity index 100% rename from Jungle Dash/levels/level4_data rename to Jungle Adventures/levels/level4_data diff --git a/Jungle Dash/levels/level5_data b/Jungle Adventures/levels/level5_data similarity index 100% rename from Jungle Dash/levels/level5_data rename to Jungle Adventures/levels/level5_data diff --git a/Jungle Dash/levels/level6_data b/Jungle Adventures/levels/level6_data similarity index 100% rename from Jungle Dash/levels/level6_data rename to Jungle Adventures/levels/level6_data diff --git a/Jungle Dash/levels/level7_data b/Jungle Adventures/levels/level7_data similarity index 100% rename from Jungle Dash/levels/level7_data rename to Jungle Adventures/levels/level7_data diff --git a/Jungle Dash/levels/level8_data b/Jungle Adventures/levels/level8_data similarity index 100% rename from Jungle Dash/levels/level8_data rename to Jungle Adventures/levels/level8_data diff --git a/Jungle Dash/levels/level9_data b/Jungle Adventures/levels/level9_data similarity index 100% rename from Jungle Dash/levels/level9_data rename to Jungle Adventures/levels/level9_data diff --git a/Jungle Dash/objects.py b/Jungle Adventures/main.py similarity index 64% rename from Jungle Dash/objects.py rename to Jungle Adventures/main.py index 7899780..eeaa7de 100644 --- a/Jungle Dash/objects.py +++ b/Jungle Adventures/main.py @@ -1,544 +1,714 @@ -import os -import pickle -import random -import pygame -from pygame import mixer -from pygame.locals import * - -SIZE = WIDTH , HEIGHT= 1000, 650 -tile_size = 50 - -pygame.font.init() -score_font = pygame.font.SysFont('Bauhaus 93', 30) - -WHITE = (255,255,255) -BLUE = (30, 144, 255) - -# load sounds -mixer.init() - -pygame.mixer.music.load('sounds/Ballad for Olivia.mp3') -pygame.mixer.music.set_volume(0.3) -pygame.mixer.music.play(-1, 0.0, 5000) - -diamond_fx = pygame.mixer.Sound('sounds/341695__projectsu012__coins-1.wav') -diamond_fx.set_volume(0.5) -jump_fx = pygame.mixer.Sound('sounds/jump.wav') -jump_fx.set_volume(0.5) -dead_fx = pygame.mixer.Sound('sounds/406113__daleonfire__dead.wav') -dead_fx.set_volume(0.5) -sounds = [diamond_fx, ] - - -# loading images -dead_img = pygame.image.load('assets/ghost.png') -game_over_img = pygame.image.load('assets/gover.png') -game_over_img = pygame.transform.scale(game_over_img, (300,250)) -game_over_rect = game_over_img.get_rect(center=(WIDTH//2, HEIGHT//2 - HEIGHT//6)) - -# creates background -class World: - def __init__(self, win, data, groups): - self.tile_list = [] - self.win = win - self.groups = groups - - tiles = [] - for t in sorted(os.listdir('tiles/'), key=lambda s: int(s[:-4])): - tile = pygame.image.load('tiles/' + t) - tiles.append(tile) - - row_count = 0 - for row in data: - col_count = 0 - for col in row: - if col > 0: - if col in range(1,14) or col == 18: - # dirt blocks - img = pygame.transform.scale(tiles[col-1], (tile_size, tile_size)) - rect = img.get_rect() - rect.x = col_count * tile_size - rect.y = row_count * tile_size - tile = (img, rect) - self.tile_list.append(tile) - - if col == 14: - # bush - bush = Forest('bush',col_count * tile_size, row_count * tile_size + tile_size // 2) - self.groups[2].add(bush) - - if col == 15: - # lava - lava = Fluid('lava_flow', col_count * tile_size, row_count * tile_size + tile_size // 2) - self.groups[1].add(lava) - if col == 16: - lava = Fluid('lava_still', col_count * tile_size, row_count * tile_size) - self.groups[1].add(lava) - - if col == 17: - # diamond - diamond = Diamond(col_count * tile_size, row_count * tile_size) - self.groups[3].add(diamond) - if col == 19: - # water block - water = Fluid('water_flow', col_count * tile_size, row_count * tile_size + tile_size // 2) - self.groups[1].add(water) - if col == 20: - # water block - water = Fluid('water_still', col_count * tile_size, row_count * tile_size) - self.groups[1].add(water) - if col == 21: - # tree - tree = Forest('tree', (col_count-1) * tile_size + 10, (row_count-2) * tile_size + 5) - self.groups[2].add(tree) - if col == 22: - # mushroom - mushroom = Forest('mushroom', col_count * tile_size, row_count * tile_size + tile_size // 4) - self.groups[2].add(mushroom) - if col == 23: - # bee - bee = Bee(col_count * tile_size, row_count * tile_size) - self.groups[4].add(bee) - if col == 24: - #Gate blocks - gate = ExitGate(col_count * tile_size - tile_size//4, row_count * tile_size - tile_size//4) - self.groups[5].add(gate) - if col == 25: - #Side moving platform - platform = MovingPlatform('side', col_count * tile_size, row_count * tile_size) - self.groups[6].add(platform) - if col == 26: - #top moving platform - platform = MovingPlatform('up', col_count * tile_size, row_count * tile_size) - self.groups[6].add(platform) - if col == 27: - #flower - flower = Forest('flower', (col_count) * tile_size, row_count * tile_size) - self.groups[2].add(flower) - if col == 28: - # bridge - bridge = Bridge((col_count-2) * tile_size + 10, row_count * tile_size + tile_size // 4) - self.groups[7].add(bridge) - if col == 29: - #Slime - slime = Slime(col_count * tile_size - 10, row_count * tile_size + tile_size // 4) - self.groups[4].add(slime) - - - col_count += 1 - row_count += 1 - - diamond = Diamond((WIDTH//tile_size - 3) * tile_size, tile_size // 2) - self.groups[3].add(diamond) - - def draw(self): - for tile in self.tile_list: - self.win.blit(tile[0], tile[1]) - -# ------------------------------------------------------------------------------------------------- -# Creates Player -class Player: - def __init__(self, win, pos, world, groups): - self.reset(win, pos, world, groups) - - def update(self, pressed_keys, game_over, level_won, game_won): - dx = 0 - dy = 0 - walk_cooldown = 3 - col_threshold = 20 - - - if not game_over and not game_won: - if (pressed_keys[K_UP] or pressed_keys[K_SPACE]) and not self.jumped and not self.in_air: - self.vel_y = -15 - jump_fx.play() - self.jumped = True - if (pressed_keys[K_UP] or pressed_keys[K_SPACE]) == False: - self.jumped = False - if pressed_keys[K_LEFT]: - dx -= 5 - self.counter += 1 - self.direction = -1 - if pressed_keys[K_RIGHT]: - dx += 5 - self.counter += 1 - self.direction = 1 - - if pressed_keys[K_LEFT] == False and pressed_keys[K_RIGHT] == False: - self.counter = 0 - self.index = 0 - self.image = self.img_right[self.index] - - if self.direction == 1: - self.image = self.img_right[self.index] - elif self.direction == -1: - self.image = self.img_left[self.index] - - if self.counter > walk_cooldown: - self.counter = 0 - self.index += 1 - if self.index >= len(self.img_right): - self.index = 0 - - if self.direction == 1: - self.image = self.img_right[self.index] - elif self.direction == -1: - self.image = self.img_left[self.index] - - - # add gravity - self.vel_y += 1 - if self.vel_y > 10: - self.vel_y = 10 - dy += self.vel_y - - # check for colision - self.in_air = True - for tile in self.world.tile_list: - # check for collision in x direction - if tile[1].colliderect(self.rect.x+dx, self.rect.y, self.width, self.height): - dx = 0 - - # check for collision in y direction - if tile[1].colliderect(self.rect.x, self.rect.y + dy, self.width, self.height): - # check if below the ground - if self.vel_y < 0: - dy = tile[1].bottom - self.rect.top - self.vel_y = 0 - elif self.vel_y >= 0: - dy = tile[1].top - self.rect.bottom - self.vel_y = 0 - self.in_air = False - - if pygame.sprite.spritecollide(self, self.groups[0], False): - game_over = True - if pygame.sprite.spritecollide(self, self.groups[1], False): - game_over = True - if pygame.sprite.spritecollide(self, self.groups[4], False): - game_over = True - - # temp = self - # temp = temp.rect.x + 20 - # if pygame.sprite.spritecollide(temp, self.groups[5], False): - # level_won = True - for gate in self.groups[5]: - if gate.rect.colliderect(self.rect.x - tile_size//2, self.rect.y, self.width, self.height): - level_won = True - - if game_over: - dead_fx.play() - - # check for collision with moving platform - for platform in self.groups[6]: - # collision in x direction - if platform.rect.colliderect(self.rect.x+dx, self.rect.y, self.width, self.height): - dx = 0 - - # collision in y direction - if platform.rect.colliderect(self.rect.x, self.rect.y + dy, self.width, self.height): - # check if below platform - if abs((self.rect.top + dy) - platform.rect.bottom) < col_threshold: - self.vel_y = 0 - dy = (platform.rect.bottom - self.rect.top) - - # check if above platform - elif abs((self.rect.bottom + dy) - platform.rect.top) < col_threshold: - self.rect.bottom = platform.rect.top - 1 - self.in_air = False - dy = 0 - # move sideways with the platform - if platform.move_x: - self.rect.x += platform.move_direction - - for bridge in self.groups[7]: - # collision in x direction - if ( bridge.rect.colliderect(self.rect.x+dx, self.rect.y, self.width, self.height) and - ( bridge.rect.bottom < self.rect.bottom + 5)): - dx = 0 - - # collision in y direction - if bridge.rect.colliderect(self.rect.x, self.rect.y + dy, self.width, self.height): - if abs((self.rect.top + dy) - bridge.rect.bottom) < col_threshold: - self.vel_y = 0 - dy = (bridge.rect.bottom - self.rect.top) - - # check if above platform - elif abs((self.rect.bottom + dy) - bridge.rect.bottom) < 8: - self.rect.bottom = bridge.rect.bottom - 12 - self.in_air = False - dy = 0 - - - - - # updating player position - self.rect.x += dx - self.rect.y += dy - # if self.rect.x == self.width: - # self.rect.x = self.width - if self.rect.x >= WIDTH - self.width: - self.rect.x = WIDTH - self.width - if self.rect.x <= 0: - self.rect.x = 0 - - - elif game_over: - self.image = dead_img - if self.rect.top > 0: - self.rect.y -= 5 - - self.win.blit(game_over_img, game_over_rect) - - # displaying player on window - self.win.blit(self.image, self.rect) - # pygame.draw.rect(self.win, (255, 255, 255), self.rect, 1) - - return game_over, level_won - - def reset(self, win, pos, world, groups): - x, y = pos - self.win = win - self.world = world - self.groups = groups - - self.img_right = [] - self.img_left = [] - self.index = 0 - self.counter = 0 - - for i in range(6): - img = pygame.image.load(f'player/walk{i+1}.png') - img_right = pygame.transform.scale(img, (45,70)) - img_left = pygame.transform.flip(img_right, True, False) - self.img_right.append(img_right) - self.img_left.append(img_left) - - self.image = self.img_right[self.index] - self.rect = self.image.get_rect() - self.rect.x = x - self.rect.y = y - self.width = self.image.get_width() - self.height = self.image.get_height() - self.direction = 1 - self.vel_y = 0 - self.jumping = False - self.in_air = True - -class MovingPlatform(pygame.sprite.Sprite): - def __init__(self, type_, x, y): - super(MovingPlatform, self).__init__() - - img = pygame.image.load('assets/moving.png') - self.image = pygame.transform.scale(img, (tile_size, tile_size // 2)) - self.rect = self.image.get_rect() - self.rect.x = x - self.rect.y = y - - direction = random.choice([-1,1]) - self.move_direction = direction - self.move_counter = 0 - self.move_x = 0 - self.move_y = 0 - - if type_ == 'side': - self.move_x = 1 - elif type_ == 'up': - self.move_y = 1 - - def update(self): - self.rect.x += self.move_direction * self.move_x - self.rect.y += self.move_direction * self.move_y - self.move_counter += 1 - if abs(self.move_counter) >= 50: - self.move_direction *= -1 - self.move_counter *= -1 - -class Bridge(pygame.sprite.Sprite): - def __init__(self, x, y): - super(Bridge, self).__init__() - - img = pygame.image.load('tiles/28.png') - self.image = pygame.transform.scale(img, (5*tile_size + 20, tile_size)) - self.rect = self.image.get_rect() - self.rect.x = x - self.rect.y = y - - -class Fluid(pygame.sprite.Sprite): - def __init__(self, type_, x, y): - super(Fluid, self).__init__() - - if type_ == 'water_flow': - img = pygame.image.load('tiles/19.png') - self.image = pygame.transform.scale(img, (tile_size, tile_size // 2 + tile_size // 4)) - if type_ == 'water_still': - img = pygame.image.load('tiles/20.png') - self.image = pygame.transform.scale(img, (tile_size, tile_size)) - elif type_ == 'lava_flow': - img = pygame.image.load('tiles/15.png') - self.image = pygame.transform.scale(img, (tile_size, tile_size // 2 + tile_size // 4)) - elif type_ == 'lava_still': - img = pygame.image.load('tiles/16.png') - self.image = pygame.transform.scale(img, (tile_size, tile_size)) - - - self.rect = self.image.get_rect() - self.rect.x = x - self.rect.y = y - -class ExitGate(pygame.sprite.Sprite): - def __init__(self, x, y): - super(ExitGate, self).__init__() - - img_list = [f'assets/gate{i+1}.png' for i in range(4)] - self.gate_open = pygame.image.load('assets/gate5.png') - self.image = pygame.image.load(random.choice(img_list)) - self.rect = self.image.get_rect() - self.rect.x = x - self.rect.y = y - self.width = self.image.get_width() - self.height = self.image.get_height() - - def update(self, player): - if player.rect.colliderect(self.rect.x , self.rect.y, self.width, self.height): - self.image = self.gate_open - - -class Forest(pygame.sprite.Sprite): - def __init__(self, type_, x, y): - super(Forest, self).__init__() - - if type_ == 'bush': - img = pygame.image.load('tiles/14.png') - self.image = pygame.transform.scale(img, (tile_size, int(tile_size * 0.50))) - - if type_ == 'tree': - img = pygame.image.load('tiles/21.png') - self.image = pygame.transform.scale(img, (3*tile_size, 3 * tile_size)) - - if type_ == 'mushroom': - img = pygame.image.load('tiles/22.png') - self.image = pygame.transform.scale(img, (int(tile_size * 0.80), int(tile_size * 0.80))) - - if type_ == 'flower': - img = pygame.image.load('tiles/27.png') - self.image = pygame.transform.scale(img, (2*tile_size, tile_size)) - - self.rect = self.image.get_rect() - self.rect.x = x - self.rect.y = y - -class Diamond(pygame.sprite.Sprite): - def __init__(self, x, y): - super(Diamond, self).__init__() - - img_list = [f'assets/d{i+1}.png' for i in range(4)] - img = pygame.image.load(random.choice(img_list)) - self.image = pygame.transform.scale(img, (tile_size, tile_size)) - self.rect = self.image.get_rect() - self.rect.x = x - self.rect.y = y - - -class Bee(pygame.sprite.Sprite): - def __init__(self, x, y): - super(Bee, self).__init__() - - img = pygame.image.load('tiles/23.png') - self.img_left = pygame.transform.scale(img, (48,48)) - self.img_right = pygame.transform.flip(self.img_left, True, False) - self.image = self.img_left - self.rect = self.image.get_rect() - self.rect.x = x - self.rect.y = y - - self.pos = self.rect.y - self.dx = 3 - - def update(self, player): - if self.rect.x >= player.rect.x: - self.image = self.img_left - else: - self.image = self.img_right - - if self.rect.y >= self.pos: - self.dx *= -1 - if self.rect.y <= self.pos - tile_size * 3: - self.dx *= -1 - - self.rect.y += self.dx - -class Slime(pygame.sprite.Sprite): - def __init__(self, x, y): - super(Slime, self).__init__() - - img = pygame.image.load('tiles/29.png') - self.img_left = pygame.transform.scale(img, (int(1.2*tile_size), tile_size//2 + tile_size//4)) - self.img_right = pygame.transform.flip(self.img_left, True, False) - self.imlist = [self.img_left, self.img_right] - self.index = 0 - - self.image = self.imlist[self.index] - self.rect = self.image.get_rect() - self.rect.x = x - self.rect.y = y - - self.move_direction = -1 - self.move_counter = 0 - - def update(self, player): - self.rect.x += self.move_direction - self.move_counter += 1 - if abs(self.move_counter) >= 50: - self.index = (self.index + 1) % 2 - self.image = self.imlist[self.index] - self.move_direction *= -1 - self.move_counter *= -1 - -class Button(pygame.sprite.Sprite): - def __init__(self, img, scale, x, y): - super(Button, self).__init__() - - self.image = pygame.transform.scale(img, scale) - self.rect = self.image.get_rect() - self.rect.x = x - self.rect.y = y - - self.clicked = False - - def draw(self, win): - action = False - pos = pygame.mouse.get_pos() - if self.rect.collidepoint(pos): - if pygame.mouse.get_pressed()[0] and not self.clicked: - action = True - self.clicked = True - - if not pygame.mouse.get_pressed()[0]: - self.clicked = False - - win.blit(self.image, self.rect) - return action - - -# ------------------------------------------------------------------------------------------------- -# Custom Functions -def draw_lines(win): - for row in range(HEIGHT // tile_size + 1): - pygame.draw.line(win, WHITE, (0, tile_size*row), (WIDTH, tile_size*row), 2) - for col in range(WIDTH // tile_size): - pygame.draw.line(win, WHITE, (tile_size*col, 0), (tile_size*col, HEIGHT), 2) - -def load_level(level): - game_level = f'levels/level{level}_data' - data = None - if os.path.exists(game_level): - f = open(game_level, 'rb') - data = pickle.load(f) - f.close() - - return data - -def draw_text(win, text, pos): - img = score_font.render(text, True, BLUE) - win.blit(img, pos) +import os +import random +import pickle +import pygame +from pygame.locals import * +from pygame import mixer +from pygame.locals import * +import asyncio + +class Adventurer: + def __init__(self, screen, pos, world, groups): + self.reset(screen, pos, world, groups) + + def update(self, pressed_keys, game_over, level_won, game_won): + dx = 0 + dy = 0 + walk_cooldown = 3 + col_threshold = 20 + + if not game_over and not game_won: + if (pressed_keys[K_UP] or pressed_keys[K_SPACE]) and not self.jumped and not self.in_air: + self.vel_y = -15 + jump_fx.play() + self.jumped = True + if (pressed_keys[K_UP] or pressed_keys[K_SPACE]) == False: + self.jumped = False + if pressed_keys[K_LEFT]: + dx -= 5 + self.counter += 1 + self.direction = -1 + if pressed_keys[K_RIGHT]: + dx += 5 + self.counter += 1 + self.direction = 1 + + if pressed_keys[K_LEFT] == False and pressed_keys[K_RIGHT] == False: + self.counter = 0 + self.index = 0 + self.image = self.img_right[self.index] + + if self.direction == 1: + self.image = self.img_right[self.index] + elif self.direction == -1: + self.image = self.img_left[self.index] + + if self.counter > walk_cooldown: + self.counter = 0 + self.index += 1 + if self.index >= len(self.img_right): + self.index = 0 + + if self.direction == 1: + self.image = self.img_right[self.index] + elif self.direction == -1: + self.image = self.img_left[self.index] + + # add gravity + self.vel_y += 1 + if self.vel_y > 10: + self.vel_y = 10 + dy += self.vel_y + + # check for colision + self.in_air = True + for tile in self.world.tile_list: + # check for collision in x direction + if tile[1].colliderect(self.rect.x + dx, self.rect.y, self.width, self.height): + dx = 0 + + # check for collision in y direction + if tile[1].colliderect(self.rect.x, self.rect.y + dy, self.width, self.height): + # check if below the ground + if self.vel_y < 0: + dy = tile[1].bottom - self.rect.top + self.vel_y = 0 + elif self.vel_y >= 0: + dy = tile[1].top - self.rect.bottom + self.vel_y = 0 + self.in_air = False + + if pygame.sprite.spritecollide(self, self.groups[0], False): + game_over = True + if pygame.sprite.spritecollide(self, self.groups[1], False): + game_over = True + if pygame.sprite.spritecollide(self, self.groups[4], False): + game_over = True + + # temp = self + # temp = temp.rect.x + 20 + # if pygame.sprite.spritecollide(temp, self.groups[5], False): + # level_won = True + for gate in self.groups[5]: + if gate.rect.colliderect(self.rect.x - tile_size // 2, self.rect.y, self.width, self.height): + level_won = True + + if game_over: + dead_fx.play() + + # check for collision with moving platform + for platform in self.groups[6]: + # collision in x direction + if platform.rect.colliderect(self.rect.x + dx, self.rect.y, self.width, self.height): + dx = 0 + + # collision in y direction + if platform.rect.colliderect(self.rect.x, self.rect.y + dy, self.width, self.height): + # check if below platform + if abs((self.rect.top + dy) - platform.rect.bottom) < col_threshold: + self.vel_y = 0 + dy = (platform.rect.bottom - self.rect.top) + + # check if above platform + elif abs((self.rect.bottom + dy) - platform.rect.top) < col_threshold: + self.rect.bottom = platform.rect.top - 1 + self.in_air = False + dy = 0 + # move sideways with the platform + if platform.move_x: + self.rect.x += platform.move_direction + + for bridge in self.groups[7]: + # collision in x direction + if (bridge.rect.colliderect(self.rect.x + dx, self.rect.y, self.width, self.height) and + (bridge.rect.bottom < self.rect.bottom + 5)): + dx = 0 + + # collision in y direction + if bridge.rect.colliderect(self.rect.x, self.rect.y + dy, self.width, self.height): + if abs((self.rect.top + dy) - bridge.rect.bottom) < col_threshold: + self.vel_y = 0 + dy = (bridge.rect.bottom - self.rect.top) + + # check if above platform + elif abs((self.rect.bottom + dy) - bridge.rect.bottom) < 8: + self.rect.bottom = bridge.rect.bottom - 12 + self.in_air = False + dy = 0 + + # updating player position + self.rect.x += dx + self.rect.y += dy + # if self.rect.x == self.width: + # self.rect.x = self.width + if self.rect.x >= WIDTH - self.width: + self.rect.x = WIDTH - self.width + if self.rect.x <= 0: + self.rect.x = 0 + + + elif game_over: + self.image = dead_img + if self.rect.top > 0: + self.rect.y -= 5 + + self.win.blit(game_over_img, game_over_rect) + + # displaying player on window + self.win.blit(self.image, self.rect) + # pygame.draw.rect(self.win, (255, 255, 255), self.rect, 1) + + return game_over, level_won + + def reset(self, win, pos, world, groups): + x, y = pos + self.win = win + self.world = world + self.groups = groups + + self.img_right = [] + self.img_left = [] + self.index = 0 + self.counter = 0 + + for i in range(6): + img = pygame.image.load(f'player/walk{i + 1}.png') + img_right = pygame.transform.scale(img, (45, 70)) + img_left = pygame.transform.flip(img_right, True, False) + self.img_right.append(img_right) + self.img_left.append(img_left) + + self.image = self.img_right[self.index] + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + self.width = self.image.get_width() + self.height = self.image.get_height() + self.direction = 1 + self.vel_y = 0 + self.jumping = False + self.in_air = True + + +class World: + def __init__(self, screen, data, groups): + self.tile_list = [] + self.win = screen + self.groups = groups + + tiles = [] + for t in sorted(os.listdir('tiles/'), key=lambda s: int(s[:-4])): + tile = pygame.image.load('tiles/' + t) + tiles.append(tile) + + row_count = 0 + for row in data: + col_count = 0 + for col in row: + if col > 0: + if col in range(1, 14) or col == 18: + # dirt blocks + img = pygame.transform.scale(tiles[col - 1], (tile_size, tile_size)) + rect = img.get_rect() + rect.x = col_count * tile_size + rect.y = row_count * tile_size + tile = (img, rect) + self.tile_list.append(tile) + + if col == 14: + # bush + bush = Forest('bush', col_count * tile_size, row_count * tile_size + tile_size // 2) + self.groups[2].add(bush) + + if col == 15: + # lava + lava = Fluid('lava_flow', col_count * tile_size, row_count * tile_size + tile_size // 2) + self.groups[1].add(lava) + if col == 16: + lava = Fluid('lava_still', col_count * tile_size, row_count * tile_size) + self.groups[1].add(lava) + + if col == 17: + # diamond + diamond = Diamond(col_count * tile_size, row_count * tile_size) + self.groups[3].add(diamond) + if col == 19: + # water block + water = Fluid('water_flow', col_count * tile_size, row_count * tile_size + tile_size // 2) + self.groups[1].add(water) + if col == 20: + # water block + water = Fluid('water_still', col_count * tile_size, row_count * tile_size) + self.groups[1].add(water) + if col == 21: + # tree + tree = Forest('tree', (col_count - 1) * tile_size + 10, (row_count - 2) * tile_size + 5) + self.groups[2].add(tree) + if col == 22: + # mushroom + mushroom = Forest('mushroom', col_count * tile_size, row_count * tile_size + tile_size // 4) + self.groups[2].add(mushroom) + if col == 23: + # bee + bee = Bee(col_count * tile_size, row_count * tile_size) + self.groups[4].add(bee) + if col == 24: + # Gate blocks + gate = ExitGate(col_count * tile_size - tile_size // 4, row_count * tile_size - tile_size // 4) + self.groups[5].add(gate) + if col == 25: + # Side moving platform + platform = MovingPlatform('side', col_count * tile_size, row_count * tile_size) + self.groups[6].add(platform) + if col == 26: + # top moving platform + platform = MovingPlatform('up', col_count * tile_size, row_count * tile_size) + self.groups[6].add(platform) + if col == 27: + # flower + flower = Forest('flower', (col_count) * tile_size, row_count * tile_size) + self.groups[2].add(flower) + if col == 28: + # bridge + bridge = Bridge((col_count - 2) * tile_size + 10, row_count * tile_size + tile_size // 4) + self.groups[7].add(bridge) + if col == 29: + # Slime + slime = Slime(col_count * tile_size - 10, row_count * tile_size + tile_size // 4) + self.groups[4].add(slime) + + col_count += 1 + row_count += 1 + + diamond = Diamond((WIDTH // tile_size - 3) * tile_size, tile_size // 2) + self.groups[3].add(diamond) + + def draw(self): + for tile in self.tile_list: + self.win.blit(tile[0], tile[1]) + + +class MovingPlatform(pygame.sprite.Sprite): + def __init__(self, type_, x, y): + super(MovingPlatform, self).__init__() + + img = pygame.image.load('assets/moving.png') + self.image = pygame.transform.scale(img, (tile_size, tile_size // 2)) + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + + direction = random.choice([-1, 1]) + self.move_direction = direction + self.move_counter = 0 + self.move_x = 0 + self.move_y = 0 + + if type_ == 'side': + self.move_x = 1 + elif type_ == 'up': + self.move_y = 1 + + def update(self): + self.rect.x += self.move_direction * self.move_x + self.rect.y += self.move_direction * self.move_y + self.move_counter += 1 + if abs(self.move_counter) >= 50: + self.move_direction *= -1 + self.move_counter *= -1 + + +class Bridge(pygame.sprite.Sprite): + def __init__(self, x, y): + super(Bridge, self).__init__() + + img = pygame.image.load('tiles/28.png') + self.image = pygame.transform.scale(img, (5 * tile_size + 20, tile_size)) + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + + +class Fluid(pygame.sprite.Sprite): + def __init__(self, type_, x, y): + super(Fluid, self).__init__() + + if type_ == 'water_flow': + img = pygame.image.load('tiles/19.png') + self.image = pygame.transform.scale(img, (tile_size, tile_size // 2 + tile_size // 4)) + if type_ == 'water_still': + img = pygame.image.load('tiles/20.png') + self.image = pygame.transform.scale(img, (tile_size, tile_size)) + elif type_ == 'lava_flow': + img = pygame.image.load('tiles/15.png') + self.image = pygame.transform.scale(img, (tile_size, tile_size // 2 + tile_size // 4)) + elif type_ == 'lava_still': + img = pygame.image.load('tiles/16.png') + self.image = pygame.transform.scale(img, (tile_size, tile_size)) + + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + + +class ExitGate(pygame.sprite.Sprite): + def __init__(self, x, y): + super(ExitGate, self).__init__() + + img_list = [f'assets/gate{i + 1}.png' for i in range(4)] + self.gate_open = pygame.image.load('assets/gate5.png') + self.image = pygame.image.load(random.choice(img_list)) + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + self.width = self.image.get_width() + self.height = self.image.get_height() + + def update(self, player): + if player.rect.colliderect(self.rect.x, self.rect.y, self.width, self.height): + self.image = self.gate_open + + +class Forest(pygame.sprite.Sprite): + def __init__(self, type_, x, y): + super(Forest, self).__init__() + + if type_ == 'bush': + img = pygame.image.load('tiles/14.png') + self.image = pygame.transform.scale(img, (tile_size, int(tile_size * 0.50))) + + if type_ == 'tree': + img = pygame.image.load('tiles/21.png') + self.image = pygame.transform.scale(img, (3 * tile_size, 3 * tile_size)) + + if type_ == 'mushroom': + img = pygame.image.load('tiles/22.png') + self.image = pygame.transform.scale(img, (int(tile_size * 0.80), int(tile_size * 0.80))) + + if type_ == 'flower': + img = pygame.image.load('tiles/27.png') + self.image = pygame.transform.scale(img, (2 * tile_size, tile_size)) + + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + + +class Diamond(pygame.sprite.Sprite): + def __init__(self, x, y): + super(Diamond, self).__init__() + + img_list = [f'assets/d{i + 1}.png' for i in range(4)] + img = pygame.image.load(random.choice(img_list)) + self.image = pygame.transform.scale(img, (tile_size, tile_size)) + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + + +class Bee(pygame.sprite.Sprite): + def __init__(self, x, y): + super(Bee, self).__init__() + + img = pygame.image.load('tiles/23.png') + self.img_left = pygame.transform.scale(img, (48, 48)) + self.img_right = pygame.transform.flip(self.img_left, True, False) + self.image = self.img_left + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + + self.pos = self.rect.y + self.dx = 3 + + def update(self, player): + if self.rect.x >= player.rect.x: + self.image = self.img_left + else: + self.image = self.img_right + + if self.rect.y >= self.pos: + self.dx *= -1 + if self.rect.y <= self.pos - tile_size * 3: + self.dx *= -1 + + self.rect.y += self.dx + + +class Slime(pygame.sprite.Sprite): + def __init__(self, x, y): + super(Slime, self).__init__() + + img = pygame.image.load('tiles/29.png') + self.img_left = pygame.transform.scale(img, (int(1.2 * tile_size), tile_size // 2 + tile_size // 4)) + self.img_right = pygame.transform.flip(self.img_left, True, False) + self.imlist = [self.img_left, self.img_right] + self.index = 0 + + self.image = self.imlist[self.index] + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + + self.move_direction = -1 + self.move_counter = 0 + + def update(self, player): + self.rect.x += self.move_direction + self.move_counter += 1 + if abs(self.move_counter) >= 50: + self.index = (self.index + 1) % 2 + self.image = self.imlist[self.index] + self.move_direction *= -1 + self.move_counter *= -1 + + +class Button(pygame.sprite.Sprite): + def __init__(self, img, scale, x, y): + super(Button, self).__init__() + + self.image = pygame.transform.scale(img, scale) + self.rect = self.image.get_rect() + self.rect.x = x + self.rect.y = y + + self.clicked = False + + def draw(self, win): + action = False + pos = pygame.mouse.get_pos() + if self.rect.collidepoint(pos): + if pygame.mouse.get_pressed()[0] and not self.clicked: + action = True + self.clicked = True + + if not pygame.mouse.get_pressed()[0]: + self.clicked = False + + win.blit(self.image, self.rect) + return action + + +# ------------------------------------------------------------------------------------------------- +# Custom Functions +def draw_lines(win): + for row in range(HEIGHT // tile_size + 1): + pygame.draw.line(win, WHITE, (0, tile_size * row), (WIDTH, tile_size * row), 2) + for col in range(WIDTH // tile_size): + pygame.draw.line(win, WHITE, (tile_size * col, 0), (tile_size * col, HEIGHT), 2) + + +def load_level(level): + game_level = f'levels/level{level}_data' + data = None + if os.path.exists(game_level): + f = open(game_level, 'rb') + data = pickle.load(f) + f.close() + + return data + + +def draw_text(win, text, pos): + img = score_font.render(text, True, BLUE) + win.blit(img, pos) + +def reset_level(level): + global cur_score + cur_score = 0 + + data = load_level(level) + if data: + for group in groups: + group.empty() + world = World(win, data, groups) + player.reset(win, player_pos, world, groups) +# 10, 340 + return world + +# Window setup +SIZE = WIDTH, HEIGHT = 1000, 650 +tile_size = 50 + +pygame.init() +win = pygame.display.set_mode(SIZE) +pygame.display.set_caption('Jungle Adventure') +clock = pygame.time.Clock() +FPS = 30 + +pygame.font.init() +score_font = pygame.font.SysFont('Bauhaus 93', 30) + +WHITE = (255, 255, 255) +BLUE = (30, 144, 255) + +# load sounds +mixer.init() + +pygame.mixer.music.load('sounds/Ballad for Olivia.mp3') +pygame.mixer.music.set_volume(0.3) +pygame.mixer.music.play(-1, 0.0, 5000) + +diamond_fx = pygame.mixer.Sound('sounds/341695__projectsu012__coins-1.wav') +diamond_fx.set_volume(0.5) +jump_fx = pygame.mixer.Sound('sounds/jump.wav') +jump_fx.set_volume(0.5) +dead_fx = pygame.mixer.Sound('sounds/406113__daleonfire__dead.wav') +dead_fx.set_volume(0.5) +sounds = [diamond_fx, ] + +# loading images +dead_img = pygame.image.load('assets/ghost.png') +game_over_img = pygame.image.load('assets/gover.png') +game_over_img = pygame.transform.scale(game_over_img, (300, 250)) +game_over_rect = game_over_img.get_rect(center=(WIDTH // 2, HEIGHT // 2 - HEIGHT // 6)) + +# background images +bg1 = pygame.image.load('assets/BG1.png') +bg2 = pygame.image.load('assets/BG2.png') +bg = bg1 +sun = pygame.image.load('assets/sun.png') +logo = pygame.image.load('assets/logo.png') +you_won = pygame.image.load('assets/won.png') + +# loading level 1 +level = 1 +max_level = len(os.listdir('levels/')) +data = load_level(level) + +player_pos = (10, 340) + +# creating world & objects +water_group = pygame.sprite.Group() +lava_group = pygame.sprite.Group() +forest_group = pygame.sprite.Group() +diamond_group = pygame.sprite.Group() +exit_group = pygame.sprite.Group() +enemies_group = pygame.sprite.Group() +platform_group = pygame.sprite.Group() +bridge_group = pygame.sprite.Group() +groups = [water_group, lava_group, forest_group, diamond_group, enemies_group, exit_group, platform_group, + bridge_group] +world = World(win, data, groups) +player = Adventurer(win, player_pos, world, groups) + +# creating buttons +play = pygame.image.load('assets/play.png') +replay = pygame.image.load('assets/replay.png') +home = pygame.image.load('assets/home.png') +exit = pygame.image.load('assets/exit.png') +setting = pygame.image.load('assets/setting.png') + +play_btn = Button(play, (128, 64), WIDTH // 2 - WIDTH // 16, HEIGHT // 2) +replay_btn = Button(replay, (45, 42), WIDTH // 2 - 110, HEIGHT // 2 + 20) +home_btn = Button(home, (45, 42), WIDTH // 2 - 20, HEIGHT // 2 + 20) +exit_btn = Button(exit, (45, 42), WIDTH // 2 + 70, HEIGHT // 2 + 20) + + +score = 0 +cur_score = 0 +main_menu = True +game_over = False +level_won = False +game_won = False +running = True +async def main(): + + # Use global variables inside the coroutine + global score, cur_score, main_menu, game_over, level_won, game_won, running, bg, level, world + + while running: + for event in pygame.event.get(): + if event.type == QUIT: + running = False + + + pressed_keys = pygame.key.get_pressed() + + # displaying background & sun image + win.blit(bg, (0, 0)) + win.blit(sun, (40, 40)) + world.draw() + for group in groups: + group.draw(win) + + # drawing grid + # draw_lines(win) + + if main_menu: + win.blit(logo, (WIDTH // 2 - WIDTH // 8, HEIGHT // 4)) + + play_game = play_btn.draw(win) + if play_game: + main_menu = False + game_over = False + game_won = False + score = 0 + + else: + + if not game_over and not game_won: + + enemies_group.update(player) + platform_group.update() + exit_group.update(player) + if pygame.sprite.spritecollide(player, diamond_group, True): + sounds[0].play() + cur_score += 1 + score += 1 + draw_text(win, f'{score}', ((WIDTH // tile_size - 2) * tile_size, tile_size // 2 + 10)) + + game_over, level_won = player.update(pressed_keys, game_over, level_won, game_won) + + if game_over and not game_won: + replay = replay_btn.draw(win) + home = home_btn.draw(win) + exit = exit_btn.draw(win) + + if replay: + score -= cur_score + world = reset_level(level) + game_over = False + if home: + game_over = True + main_menu = True + bg = bg1 + level = 1 + world = reset_level(level) + if exit: + running = False + + if level_won: + if level <= max_level: + level += 1 + game_level = f'levels/level{level}_data' + if os.path.exists(game_level): + data = [] + world = reset_level(level) + level_won = False + score += cur_score + + bg = random.choice([bg1, bg2]) + else: + game_won = True + bg = bg1 + win.blit(you_won, (WIDTH // 4, HEIGHT // 4)) + home = home_btn.draw(win) + + if home: + game_over = True + main_menu = True + level_won = False + level = 1 + world = reset_level(level) + + pygame.display.flip() + clock.tick(FPS) + await asyncio.sleep(0) + + pygame.quit() + + +if __name__ == "__main__": + asyncio.run(main()) + diff --git a/Jungle Dash/player/walk1.png b/Jungle Adventures/player/walk1.png similarity index 100% rename from Jungle Dash/player/walk1.png rename to Jungle Adventures/player/walk1.png diff --git a/Jungle Dash/player/walk2.png b/Jungle Adventures/player/walk2.png similarity index 100% rename from Jungle Dash/player/walk2.png rename to Jungle Adventures/player/walk2.png diff --git a/Jungle Dash/player/walk3.png b/Jungle Adventures/player/walk3.png similarity index 100% rename from Jungle Dash/player/walk3.png rename to Jungle Adventures/player/walk3.png diff --git a/Jungle Dash/player/walk4.png b/Jungle Adventures/player/walk4.png similarity index 100% rename from Jungle Dash/player/walk4.png rename to Jungle Adventures/player/walk4.png diff --git a/Jungle Dash/player/walk5.png b/Jungle Adventures/player/walk5.png similarity index 100% rename from Jungle Dash/player/walk5.png rename to Jungle Adventures/player/walk5.png diff --git a/Jungle Dash/player/walk6.png b/Jungle Adventures/player/walk6.png similarity index 100% rename from Jungle Dash/player/walk6.png rename to Jungle Adventures/player/walk6.png diff --git a/Jungle Adventures/screenshots/Screenshot_1.png b/Jungle Adventures/screenshots/Screenshot_1.png new file mode 100644 index 0000000..bd33e08 Binary files /dev/null and b/Jungle Adventures/screenshots/Screenshot_1.png differ diff --git a/Jungle Adventures/screenshots/Screenshot_2.png b/Jungle Adventures/screenshots/Screenshot_2.png new file mode 100644 index 0000000..881b427 Binary files /dev/null and b/Jungle Adventures/screenshots/Screenshot_2.png differ diff --git a/Jungle Adventures/screenshots/Screenshot_3.png b/Jungle Adventures/screenshots/Screenshot_3.png new file mode 100644 index 0000000..a5b3af4 Binary files /dev/null and b/Jungle Adventures/screenshots/Screenshot_3.png differ diff --git a/Jungle Adventures/screenshots/Screenshot_4.png b/Jungle Adventures/screenshots/Screenshot_4.png new file mode 100644 index 0000000..8b881bd Binary files /dev/null and b/Jungle Adventures/screenshots/Screenshot_4.png differ diff --git a/Jungle Adventures/screenshots/Screenshot_5.png b/Jungle Adventures/screenshots/Screenshot_5.png new file mode 100644 index 0000000..5caa1ad Binary files /dev/null and b/Jungle Adventures/screenshots/Screenshot_5.png differ diff --git a/Jungle Dash/sounds/341695__projectsu012__coins-1.wav b/Jungle Adventures/sounds/341695__projectsu012__coins-1.wav similarity index 100% rename from Jungle Dash/sounds/341695__projectsu012__coins-1.wav rename to Jungle Adventures/sounds/341695__projectsu012__coins-1.wav diff --git a/Jungle Dash/sounds/406113__daleonfire__dead.wav b/Jungle Adventures/sounds/406113__daleonfire__dead.wav similarity index 100% rename from Jungle Dash/sounds/406113__daleonfire__dead.wav rename to Jungle Adventures/sounds/406113__daleonfire__dead.wav diff --git a/Jungle Dash/sounds/Ballad for Olivia.mp3 b/Jungle Adventures/sounds/Ballad for Olivia.mp3 similarity index 100% rename from Jungle Dash/sounds/Ballad for Olivia.mp3 rename to Jungle Adventures/sounds/Ballad for Olivia.mp3 diff --git a/Jungle Dash/sounds/jump.wav b/Jungle Adventures/sounds/jump.wav similarity index 100% rename from Jungle Dash/sounds/jump.wav rename to Jungle Adventures/sounds/jump.wav diff --git a/Jungle Dash/tiles/1.png b/Jungle Adventures/tiles/1.png similarity index 100% rename from Jungle Dash/tiles/1.png rename to Jungle Adventures/tiles/1.png diff --git a/Jungle Dash/tiles/10.png b/Jungle Adventures/tiles/10.png similarity index 100% rename from Jungle Dash/tiles/10.png rename to Jungle Adventures/tiles/10.png diff --git a/Jungle Dash/tiles/11.png b/Jungle Adventures/tiles/11.png similarity index 100% rename from Jungle Dash/tiles/11.png rename to Jungle Adventures/tiles/11.png diff --git a/Jungle Dash/tiles/12.png b/Jungle Adventures/tiles/12.png similarity index 100% rename from Jungle Dash/tiles/12.png rename to Jungle Adventures/tiles/12.png diff --git a/Jungle Dash/tiles/13.png b/Jungle Adventures/tiles/13.png similarity index 100% rename from Jungle Dash/tiles/13.png rename to Jungle Adventures/tiles/13.png diff --git a/Jungle Dash/tiles/14.png b/Jungle Adventures/tiles/14.png similarity index 100% rename from Jungle Dash/tiles/14.png rename to Jungle Adventures/tiles/14.png diff --git a/Jungle Dash/tiles/15.png b/Jungle Adventures/tiles/15.png similarity index 100% rename from Jungle Dash/tiles/15.png rename to Jungle Adventures/tiles/15.png diff --git a/Jungle Dash/tiles/16.png b/Jungle Adventures/tiles/16.png similarity index 100% rename from Jungle Dash/tiles/16.png rename to Jungle Adventures/tiles/16.png diff --git a/Jungle Dash/tiles/17.png b/Jungle Adventures/tiles/17.png similarity index 100% rename from Jungle Dash/tiles/17.png rename to Jungle Adventures/tiles/17.png diff --git a/Jungle Dash/tiles/18.png b/Jungle Adventures/tiles/18.png similarity index 100% rename from Jungle Dash/tiles/18.png rename to Jungle Adventures/tiles/18.png diff --git a/Jungle Dash/tiles/19.png b/Jungle Adventures/tiles/19.png similarity index 100% rename from Jungle Dash/tiles/19.png rename to Jungle Adventures/tiles/19.png diff --git a/Jungle Dash/tiles/2.png b/Jungle Adventures/tiles/2.png similarity index 100% rename from Jungle Dash/tiles/2.png rename to Jungle Adventures/tiles/2.png diff --git a/Jungle Dash/tiles/20.png b/Jungle Adventures/tiles/20.png similarity index 100% rename from Jungle Dash/tiles/20.png rename to Jungle Adventures/tiles/20.png diff --git a/Jungle Dash/tiles/21.png b/Jungle Adventures/tiles/21.png similarity index 100% rename from Jungle Dash/tiles/21.png rename to Jungle Adventures/tiles/21.png diff --git a/Jungle Dash/tiles/22.png b/Jungle Adventures/tiles/22.png similarity index 100% rename from Jungle Dash/tiles/22.png rename to Jungle Adventures/tiles/22.png diff --git a/Jungle Dash/tiles/23.png b/Jungle Adventures/tiles/23.png similarity index 100% rename from Jungle Dash/tiles/23.png rename to Jungle Adventures/tiles/23.png diff --git a/Jungle Dash/tiles/24.png b/Jungle Adventures/tiles/24.png similarity index 100% rename from Jungle Dash/tiles/24.png rename to Jungle Adventures/tiles/24.png diff --git a/Jungle Dash/tiles/25.png b/Jungle Adventures/tiles/25.png similarity index 100% rename from Jungle Dash/tiles/25.png rename to Jungle Adventures/tiles/25.png diff --git a/Jungle Dash/tiles/26.png b/Jungle Adventures/tiles/26.png similarity index 100% rename from Jungle Dash/tiles/26.png rename to Jungle Adventures/tiles/26.png diff --git a/Jungle Dash/tiles/27.png b/Jungle Adventures/tiles/27.png similarity index 100% rename from Jungle Dash/tiles/27.png rename to Jungle Adventures/tiles/27.png diff --git a/Jungle Dash/tiles/28.png b/Jungle Adventures/tiles/28.png similarity index 100% rename from Jungle Dash/tiles/28.png rename to Jungle Adventures/tiles/28.png diff --git a/Jungle Dash/tiles/29.png b/Jungle Adventures/tiles/29.png similarity index 100% rename from Jungle Dash/tiles/29.png rename to Jungle Adventures/tiles/29.png diff --git a/Jungle Dash/tiles/3.png b/Jungle Adventures/tiles/3.png similarity index 100% rename from Jungle Dash/tiles/3.png rename to Jungle Adventures/tiles/3.png diff --git a/Jungle Dash/tiles/4.png b/Jungle Adventures/tiles/4.png similarity index 100% rename from Jungle Dash/tiles/4.png rename to Jungle Adventures/tiles/4.png diff --git a/Jungle Dash/tiles/5.png b/Jungle Adventures/tiles/5.png similarity index 100% rename from Jungle Dash/tiles/5.png rename to Jungle Adventures/tiles/5.png diff --git a/Jungle Dash/tiles/6.png b/Jungle Adventures/tiles/6.png similarity index 100% rename from Jungle Dash/tiles/6.png rename to Jungle Adventures/tiles/6.png diff --git a/Jungle Dash/tiles/7.png b/Jungle Adventures/tiles/7.png similarity index 100% rename from Jungle Dash/tiles/7.png rename to Jungle Adventures/tiles/7.png diff --git a/Jungle Dash/tiles/8.png b/Jungle Adventures/tiles/8.png similarity index 100% rename from Jungle Dash/tiles/8.png rename to Jungle Adventures/tiles/8.png diff --git a/Jungle Dash/tiles/9.png b/Jungle Adventures/tiles/9.png similarity index 100% rename from Jungle Dash/tiles/9.png rename to Jungle Adventures/tiles/9.png diff --git a/Jungle Dash/README.md b/Jungle Dash/README.md deleted file mode 100644 index 43da2dc..0000000 --- a/Jungle Dash/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Jungle Dash - -[![forthebadge](https://forthebadge.com/images/badges/built-with-love.svg)](https://forthebadge.com) -[![forthebadge](https://forthebadge.com/images/badges/built-with-swag.svg)](https://forthebadge.com) -[![forthebadge](https://forthebadge.com/images/badges/made-with-python.svg)](https://forthebadge.com) - -Jungle Dash is a simple 2D platformer game made with python and pygame. - -![Alt text](app.png?raw=true "Jungle Dash") - -## How to Download - -Download this project from here [Download Jungle Dash](https://downgit.github.io/#/home?url=https://github.com/pyGuru123/Python-Games/tree/master/Jungle%20Dash) - -## Requirements - -Use the package manager [pip](https://pip.pypa.io/en/stable/) to install following packages :- -* Pygame - -```bash -pip install pygame -``` - -## Usage - -Double click the game.py to open the game, Click start to start playing the game. The objective of the game is to clear all levels & collecting diamonds without getting hit by bees, slimes or without touching water & lava - -Controls: -* Use Space or Up arrow key to jump. -* Use Left & Right arrow key to move in left & right direction respectively - -## Contributing - -Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. - -Please make sure to update tests as appropriate. \ No newline at end of file diff --git a/Jungle Dash/main.py b/Jungle Dash/main.py deleted file mode 100644 index 4c2d0eb..0000000 --- a/Jungle Dash/main.py +++ /dev/null @@ -1,172 +0,0 @@ -import os -import random -import pygame -from pygame.locals import * - -from objects import World, Player, Button, draw_lines, load_level, draw_text, sounds - -# Window setup -SIZE = WIDTH , HEIGHT= 1000, 650 -tile_size = 50 - -pygame.init() -win = pygame.display.set_mode(SIZE) -pygame.display.set_caption('DASH') -clock = pygame.time.Clock() -FPS = 30 - - -# background images -bg1 = pygame.image.load('assets/BG1.png') -bg2 = pygame.image.load('assets/BG2.png') -bg = bg1 -sun = pygame.image.load('assets/sun.png') -jungle_dash = pygame.image.load('assets/jungle dash.png') -you_won = pygame.image.load('assets/won.png') - - -# loading level 1 -level = 1 -max_level = len(os.listdir('levels/')) -data = load_level(level) - -player_pos = (10, 340) - - -# creating world & objects -water_group = pygame.sprite.Group() -lava_group = pygame.sprite.Group() -forest_group = pygame.sprite.Group() -diamond_group = pygame.sprite.Group() -exit_group = pygame.sprite.Group() -enemies_group = pygame.sprite.Group() -platform_group = pygame.sprite.Group() -bridge_group = pygame.sprite.Group() -groups = [water_group, lava_group, forest_group, diamond_group, enemies_group, exit_group, platform_group, - bridge_group] -world = World(win, data, groups) -player = Player(win, player_pos, world, groups) - -# creating buttons -play= pygame.image.load('assets/play.png') -replay = pygame.image.load('assets/replay.png') -home = pygame.image.load('assets/home.png') -exit = pygame.image.load('assets/exit.png') -setting = pygame.image.load('assets/setting.png') - -play_btn = Button(play, (128, 64), WIDTH//2 - WIDTH // 16, HEIGHT//2) -replay_btn = Button(replay, (45,42), WIDTH//2 - 110, HEIGHT//2 + 20) -home_btn = Button(home, (45,42), WIDTH//2 - 20, HEIGHT//2 + 20) -exit_btn = Button(exit, (45,42), WIDTH//2 + 70, HEIGHT//2 + 20) - - -# function to reset a level -def reset_level(level): - global cur_score - cur_score = 0 - - data = load_level(level) - if data: - for group in groups: - group.empty() - world = World(win, data, groups) - player.reset(win, player_pos, world, groups) -# 10, 340 - return world - -score = 0 -cur_score = 0 - -main_menu = True -game_over = False -level_won = False -game_won = False -running = True -while running: - for event in pygame.event.get(): - if event.type == QUIT: - running = False - - pressed_keys = pygame.key.get_pressed() - - # displaying background & sun image - win.blit(bg, (0,0)) - win.blit(sun, (40,40)) - world.draw() - for group in groups: - group.draw(win) - - # drawing grid - # draw_lines(win) - - if main_menu: - win.blit(jungle_dash, (WIDTH//2 - WIDTH//8, HEIGHT//4)) - - play_game = play_btn.draw(win) - if play_game: - main_menu = False - game_over = False - game_won = False - score = 0 - - else: - - if not game_over and not game_won: - - enemies_group.update(player) - platform_group.update() - exit_group.update(player) - if pygame.sprite.spritecollide(player, diamond_group, True): - sounds[0].play() - cur_score += 1 - score += 1 - draw_text(win, f'{score}', ((WIDTH//tile_size - 2) * tile_size, tile_size//2 + 10)) - - game_over, level_won = player.update(pressed_keys, game_over, level_won, game_won) - - if game_over and not game_won: - replay = replay_btn.draw(win) - home = home_btn.draw(win) - exit = exit_btn.draw(win) - - if replay: - score -= cur_score - world = reset_level(level) - game_over = False - if home: - game_over = True - main_menu = True - bg = bg1 - level = 1 - world = reset_level(level) - if exit: - running = False - - if level_won: - if level <= max_level: - level += 1 - game_level = f'levels/level{level}_data' - if os.path.exists(game_level): - data = [] - world = reset_level(level) - level_won = False - score += cur_score - - bg = random.choice([bg1, bg2]) - else: - game_won = True - bg = bg1 - win.blit(you_won, (WIDTH//4, HEIGHT // 4)) - home = home_btn.draw(win) - - if home: - game_over = True - main_menu = True - level_won = False - level = 1 - world = reset_level(level) - - pygame.display.flip() - clock.tick(FPS) - -pygame.quit() \ No newline at end of file