#     x = random.randint(16,SCREEN_RES[0]-16)
#     y = random.randint(16,SCREEN_RES[1]-16)
#     tileSurf = pygame.Surface((32,32))
#     tileSurf.fill(pygame.color.THECOLORS['green'])
#     tileRect = pygame.Rect(0,0,32,32)
#     tileRect.center = (x,y)
#     newTile = Tile(tileSurf,tileRect)
#     collide2 = pygame.sprite.spritecollide(player,tiles,False)
#     while collide2:
#         x = random.randint(16, SCREEN_RES[0] - 16)
#         y = random.randint(16, SCREEN_RES[1] - 16)
#         newTile.rect.center = (x,y)
#         collide2 = pygame.sprite.spritecollide(player, tiles, False)
#     tiles.add(newTile)

manager.addGameObject(player)
manager.addGameObject(enemy)
screen_rect = window.get_rect()
clock = pygame.time.Clock()
running = True

while running:
    dt = clock.tick(60) / 1000

    #Get Player Input and Apply Physics
    running = manager.process_input(dt)

    #Move Player and Check for Collisions
    player.moveX(dt)
    enemy.moveX(dt)
    collisions = pygame.sprite.spritecollide(player, tiles, False)
Example #2
0
class Game:
    """ This class contains the main game loop."""
    def __init__(self):
        """Initialize game variables"""
        self.clock = pygame.time.Clock()
        self.current_map_name = "world"
        self.maps = {
            "world":Map('Maps/map0.txt', 'images/ProjectUtumno_full.png', screen_size),
            "shop": Map('Maps/map_shop.txt', 'images/ProjectUtumno_full.png', screen_size),
            "dungeon":Map('Maps/map_dungeon.txt', 'images/ProjectUtumno_full.png', screen_size),
        }

        self.current_map = self.maps[self.current_map_name]

        self.running = False
        self.window = pygame.display.set_mode(screen_size)
        self.player = Player('images/star.png')

        self.bg_color = (0,0,0)
        self.event_manager = EventManager()
        self.event_manager.addGameObject(self.player)
        self.camera = Camera(self.current_map)
        self.event_manager.addGameObject(self.camera)

        # feel free to move this to its own method or wherever, just using for testing
        for enemy in self.current_map.enemy_list.sprites():
            self.event_manager.addGameObject(enemy)

        self.warpCoordinates = {
            "world": [(self.player.position.x,self.player.position.y)],
            "shop": [(320,590),(1360,334)],
            "dungeon": [(2816,1600),(1440,1525)]
        }

    def startGame(self):
        """ Sets the running flag to True, signaling
            the game loop to start."""
        self.running = True

    def stopGame(self):
        """ Sets the running flag to False, signaling
            the game loop to stop."""
        self.running = False

    def collisionDetection(self):

        #boundary checking on world map
        self.player.boundsCheck(self.current_map.boundary)

        for enemy in self.current_map.enemy_list.sprites():
            if enemy.aggro_rect.colliderect(self.player.rect):
                enemy.activateAggro()
                enemy.chasePlayer(self.player)
                if enemy.rect.colliderect(self.player.rect):
                    self.player.take_damage()
                    enemy.reverseVelocity(self.player)
            else:
                enemy.deactivateAggro()

        for wall in self.camera.focusedWalls.sprites():
            if self.player.rect.colliderect(wall.world_rect):
                self.player.handleCollision(wall.world_rect)

        for wall in self.camera.focusedWalls.sprites():
            for enemy in self.current_map.enemy_list.sprites():
                if enemy.rect.colliderect(wall.world_rect):
                    enemy.handleCollision(wall.world_rect)

        for warpTile in self.camera.warpTiles.sprites():
            if self.player.rect.colliderect(warpTile.world_rect):
                if self.current_map_name == "world":
                    coords = self.warpCoordinates[warpTile.mapName][0]  # Warp To
                else:
                    coords = self.warpCoordinates[self.current_map_name][1]  # Warp From
                self.player.setPos(coords)

                for enemy in self.current_map.enemy_list:
                    self.event_manager.removeGameObject(enemy)

                self.camera.setMap(self.maps[warpTile.mapName])
                self.current_map = self.maps[warpTile.mapName]
                self.current_map_name = warpTile.mapName

                for enemy in self.current_map.enemy_list:
                    self.event_manager.addGameObject(enemy)

        for interactable in self.camera.interactiveTiles.sprites():
            if self.player.rect.colliderect(interactable.world_rect):
                self.player.interact(interactable)
                interactable.updateMap(self.camera.map)


    def runGameLoop(self):
        """ This method handles the main game loop."""
        while self.running:
            # UPDATES
            dt = self.clock.tick(60) / 1000.0

            # USER INPUT
            self.running = self.event_manager.process_menu_input()

            if self.running:
                #GAME UPDATE

                # Game Input
                self.event_manager.process_input(dt)
                if not self.running:
                    break

                #Collision Detection
                self.collisionDetection()

                if self.player.inventory['gold'] >= 100 or self.player.cur_hp <= 0:
                    self.running = False

                #Make Camera Follow the Player
                self.camera.setCameraPosition(self.player.getPos())

                # DRAWING
                self.window.fill(self.bg_color)
                self.camera.draw(self.window)
                self.player.draw(self.window,self.camera.pos)
                for enemy in self.current_map.enemy_list:
                    enemy.draw(self.window, self.camera.pos)
                pygame.display.flip()