Python Forum
Adding persistent multiple levels to game
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Adding persistent multiple levels to game
#3
Thank you. Here is the complete code so far. I changed out my graphics for simple squares, and it will run as-is. Find the red key and take it to the white exit.

import pygame
import random
import time
import sys


pygame.init()

blue = (5, 5, 200)
green = (4, 80, 4)
red = (250, 0, 0)
grey = (30, 30, 30)
lightgrey = (150, 150, 150)
black = (0, 0, 0)
brown = (100, 100, 5)
white = (255, 255, 255)
width = 600
height = 600
tile_size = 30
mapheight = 2400
mapwidth = 2400

floor_locations = []

#wallimage = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/wall1.png")
#heroimage = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/hero_1.png")
#upstair = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/upstairs.png")
#keyimage = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/key.png")
#downstair = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/downstairs.png")



diggers = pygame.sprite.Group()
players = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
base_tiles = pygame.sprite.Group()
floor_tiles = pygame.sprite.Group()        
walls = pygame.sprite.Group()
keys = pygame.sprite.Group()
exits = pygame.sprite.Group()

key_collected = False

class Player(pygame.sprite.Sprite):
    def __init__(self, game, x, y):
        
        pygame.sprite.Sprite.__init__(self)
        self.game = game
        self.image = pygame.Surface((tile_size, tile_size))
        self.image.fill(blue)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

    def move(self, dx=0, dy=0):
        global key_collected
        if not self.collide_with_walls(dx, dy):
            self.rect.x += dx 
            self.rect.y += dy
        
        collect = pygame.sprite.spritecollide(game.player, keys, True)
        if collect:
            key_collected = True
        
        exiting = pygame.sprite.spritecollide(game.player, exits, False)
        if exiting and key_collected == True:
            print("win!!")
        
    def collide_with_walls(self, dx=0, dy=0):
        
        for wall in walls:
            
            if wall.rect.x==self.rect.x + dx and wall.rect.y == self.rect.y + dy:
                
                return True
        return False
    
   
    
    def update(self):
        
        self.rect.x = self.x 
        self.rect.y = self.y 



class Floor(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.game = game
        self.image = pygame.Surface((tile_size, tile_size))
        self.image.fill(brown)
        self.rect = self.image.get_rect()   
        self.rect.x = x
        self.rect.y = y
        
class Key(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.game = game
        self.image = pygame.Surface((tile_size, tile_size))
        self.image.fill(red)
        self.rect = self.image.get_rect()  
        self.rect.x = x
        self.rect.y = y
        
class Entrance(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.game = game
        self.image = pygame.Surface((tile_size, tile_size))
        self.image.fill(green)
        self.rect = self.image.get_rect()    
        self.rect.x = x
        self.rect.y = y
        
class Exit(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.game = game
        self.image = pygame.Surface((tile_size, tile_size))
        self.image.fill(white)
        self.rect = self.image.get_rect()    
        self.rect.x = x
        self.rect.y = y
              
class Base(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.game = game
        self.colour = grey
        self.image = pygame.draw.rect(game.window, (self.colour), (x, y, tile_size, tile_size), 0)
        self.rect = pygame.Rect(x, y, tile_size, tile_size)
        self.x = x
        self.y = y
        pygame.display.flip()
        
class Wall(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.game = game
        self.image = pygame.Surface((tile_size, tile_size))
        self.image.fill(lightgrey)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        pygame.display.flip()

class Digger(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((tile_size, tile_size))
        self.image.fill(red)
        self.rect = self.image.get_rect()   #pygame.Rect(self.rect.x, self.recty, tile_size, tile_size)
        self.rect.x = x
        self.rect.y = y
        
def Make_map():
    
    for x in range(0, mapwidth, tile_size):
        for y in range(0, mapheight, tile_size):
            
            base = Base(x, y)
            base_tiles.add(base)
     
    
    digger = Digger((mapwidth / 2), (mapheight / 2))
    diggers.add(digger)
    all_sprites.add(digger)
    
    for i in range(2400): 
        
        (dx, dy) = random.choice([(0, tile_size), (0, -tile_size), (-tile_size, 0), (tile_size, 0)])
   
   
        if digger.rect.x + dx <= tile_size:
            dx = 0
        if digger.rect.x + dx >= mapwidth  - (2 * tile_size):
            dx = 0
        if digger.rect.y + dy <= tile_size:
            dy = 0
        if digger.rect.y + dy >= mapheight - (2 * tile_size):
            dy = 0
            
        digger.rect.x = digger.rect.x + dx
        digger.rect.y = digger.rect.y + dy
        floor_locations.append((digger.rect.x, digger.rect.y))
        pygame.sprite.spritecollide(digger, floor_tiles, True)
        floor = Floor(digger.rect.x, digger.rect.y)
        all_sprites.add(floor)
        floor_tiles.add(floor)
        pygame.sprite.spritecollide(digger, base_tiles, True)
    
    key_location = random.choice(floor_locations)
    x, y = key_location
    key1 = Key(x, y)
    all_sprites.add(key1)
    keys.add(key1)
    
    for floor in floor_tiles:
         
        for delta_x, delta_y in ((tile_size, 0), (0, tile_size), (-tile_size, 0), (0, -tile_size), (-tile_size, tile_size), (tile_size, -tile_size), (-tile_size, -tile_size), (tile_size, tile_size)):
      
            floor.rect.x = floor.rect.x + delta_x
            floor.rect.y = floor.rect.y + delta_y
            hits = pygame.sprite.spritecollide(floor, base_tiles, False)
            
            floor.rect.x = floor.rect.x - delta_x
            floor.rect.y = floor.rect.y - delta_y
            
            for hit in hits:
               
                wall = Wall(hit.rect.x, hit.rect.y)       
                all_sprites.add(wall)
                walls.add(wall)
                   
    entrance = Entrance((mapwidth / 2), (mapheight / 2))
    eXit = Exit(digger.rect.x, digger.rect.y)
    all_sprites.add(floor, entrance, eXit)
    floor_tiles.add(floor)
    exits.add(eXit)
                
class Game():
    def __init__(self):
        pygame.init()
        self.window = pygame.display.set_mode((width, height))
        pygame.display.set_caption("Dungeon")
        self.clock = pygame.time.Clock()
        pygame.key.set_repeat(500, 100)
        
    def New(self):
        
        Make_map()
       
        self.player = Player(game, (mapwidth / 2), (mapheight / 2))
        all_sprites.add(self.player)
        players.add(self.player)
        self.camera = Camera(mapwidth, mapheight)
        self.run()
        all_sprites.draw(window)
        pygame.display.flip()
            
        
    def run(self):
        playing = True
        while playing:
               
            self.update()
            self.draw()
            self.events()
            

    def quit(self):
        pygame.quit()
        sys.exit()

    def update(self):
        
        self.camera.update(self.player)
        all_sprites.draw(game.window)    

    def draw(self):
       
        self.window.fill(black)
        for sprite in all_sprites:
            self.window.blit(sprite.image, self.camera.apply(sprite))
        pygame.display.flip()
  

    def events(self):
        # catch all events here
        
        check = True
        while check:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.quit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        self.quit()
                    if event.key == pygame.K_LEFT:
                        self.player.move(dx=-tile_size)
                        check = False
                    if event.key == pygame.K_RIGHT:
                        self.player.move(dx=tile_size)
                        check = False
                    if event.key == pygame.K_UP:
                        self.player.move(dy=-tile_size)
                        check = False
                    if event.key == pygame.K_DOWN:
                        self.player.move(dy=tile_size)
                        check = False

class Camera:
    def __init__(self, width, height):
        self.camera = pygame.Rect(0, 0, width, height)
        self.width = width
        self.height = height
        
    def apply(self, entity):
        return entity.rect.move(self.camera.topleft)
    
    def update(self, target):
        x = -target.rect.x + int(width / 2)
        y = -target.rect.y + int(height / 2)
        
        x = min(0, x)
        y = min(0, y)
        x = max(-(mapwidth - width), x)
        y = max(-(mapheight - height), y)
        
        self.camera = pygame.Rect(x, y, self.width, self.height)

game = Game()
game.New()
I was really just looking for some general guidance on how it is normally done (eg. make 10 of these levels and link the entrances and exits). Then I would at least have a starting point.
Reply


Messages In This Thread
RE: Adding persistent multiple levels to game - by michael1789 - Nov-16-2019, 01:15 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  [PyGame] adding mouse control to game flash77 2 303 Apr-08-2024, 06:52 PM
Last Post: flash77
  [PyGame] Snake game: how to get an instance for my snake's body multiple times? hajebazil 2 2,187 Jan-30-2022, 04:58 AM
Last Post: hajebazil
  Adding an inventory and a combat system to a text based adventure game detkitten 2 6,930 Dec-17-2019, 03:40 AM
Last Post: detkitten
  Adding a single player mode to my wxOthello game keames 29 12,200 May-01-2019, 02:56 AM
Last Post: SheeppOSU

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020