Esempio n. 1
0
    def __init__(self, theApp):
        ''' theApp: refernecja do obiektu aplikacji. Potrzebne przy dodawaniu obiektu nasłuchującego wejścia. '''

        self.__theApp = theApp                                              # obiekt zarządzający aplikacją
        self.__objects = []                                                 # lista obiektów w świecie

        self.__spriteManager     = SpriteManager()                           # menadżer sprite'ów
        self.__collisionManager  = CollisionManager(self.__spriteManager)    # menadżer kolizji
        self.__objectFactory     = self.__create_object_factory(self.__spriteManager) # fabryka obiektów
        self.__levelManager      = LevelManager(self.__objectFactory,self.__spriteManager)  # menadżer poziomów
        self.__backgroundManager = BackgroundManager( levelManager = self.__levelManager )
        self.__backgroundManager.set_window_coords( self.__theApp.get_window_coords() )
        self.__backgroundManager.set_window_draw_dim( self.__theApp.get_window_draw_dim() )
        self.__levelManager.set_window_coords( self.__theApp.get_window_coords() )
        self.__levelManager.set_window_draw_dim( self.__theApp.get_window_draw_dim() )

        if not self.__levelManager.load_level("demo_level"):
            assert True, "Tworzenie świata nie powiodło się. Nie można wczytać poziomu."

        const.renderTextureSize = (512,256)                # rozmiary tekstury, do której będziemy renderować
        self.__renderTexture = image.create( *const.renderTextureSize ).get_texture()

        # Dodaj obiekt helikoptera i jeepa do gry
        #
        # FIXME: jeep?
        #
        self.add_object( self.__create_heli() )
Esempio n. 2
0
class Artifact(pygame.sprite.Sprite):
    def __init__(self, file, level, flag=False):
        """ Artifact represent a constant block on the map """
        super().__init__()
        self.flag = flag
        self.level = level
        self.collisionManager = CollisionManager(self)
        # Grab the image for this platform
        self.image = pygame.image.load(file).convert_alpha()
        self.rect = self.image.get_rect()

    def update(self):
        coll = False
        if self.flag:
            if not coll:
                coll = self.collisionManager.block_vs_object(
                    self.level.walls_list)
            if not coll:
                coll = self.collisionManager.block_vs_object(
                    self.level.door_list)
            if not coll:
                coll = self.collisionManager.block_vs_object(
                    self.level.artifact_list)
            if not coll:
                coll = self.collisionManager.block_vs_object(
                    self.level.water_list)
            #coll = self.collisionManager.block_vs_object(self.level.block_list)
            if not coll:
                coll = self.collisionManager.block_vs_object(
                    self.level.chest_list)
        return coll
Esempio n. 3
0
class Enemy(pygame.sprite.Sprite):
    def __init__(self, player, level):
        super().__init__()
        self.player = player
        self.level = level
        self.direction = None
        self.status = constants.ENEMY_INIT
        self.change_status_time = 0

        self.collisionManager = CollisionManager(self)

        # Grab the images for the snake
        self.sprite_sheet0 = None
        self.sprite_sheet1 = None

        # Egg images
        self.sprite_sheet1 = SpriteSheet("Assets/Egg.png")
        self.egg_images = [
            self.sprite_sheet1.get_image(0, 0, 58, 58),
            self.sprite_sheet1.get_image(58, 0, 116, 58)
        ]

        self.image = None
        self.rect = None

        self.change_x = 0
        self.change_y = 0

    def update(self):
        self.collisionManager.fixed_objects(self.level.walls_list)
        self.collisionManager.fixed_objects(self.level.door_list)
        self.collisionManager.fixed_objects(self.level.artifact_list)
        self.collisionManager.fixed_objects(self.level.water_list)
        self.collisionManager.fixed_objects(self.level.block_list)
        self.collisionManager.fixed_objects(self.level.chest_list)

    def set_egg(self):
        """ Called when the player shots the enemy. """
        self.image = self.egg_images[0]
        self.status = constants.ENEMY_EGG
        self.change_status_time = pygame.time.get_ticks()
        pygame.time.set_timer(constants.BROKE_EGG, constants.EGG_TIME)

    def broke_egg(self):
        """ Called when broke egg event is throwed. """
        self.image = self.egg_images[1]
        self.status = constants.ENEMY_BREAKING_EGG
        self.change_status_time = pygame.time.get_ticks()
        pygame.time.set_timer(constants.BROKE_EGG, 0)
        pygame.time.set_timer(constants.REMOVE_EGG, constants.EGG_TIME)

    def remove_egg(self):
        """ Called when remove egg event is throwed. """
        self.image = self.egg_images[1]
        self.status = constants.ENEMY_INIT
        self.change_status_time = 0
        pygame.time.set_timer(constants.REMOVE_EGG, 0)

    def get_status(self):
        return self.status
Esempio n. 4
0
    def __init__(self, player, level):
        super().__init__()
        self.player = player
        self.level = level
        self.direction = None
        self.status = constants.ENEMY_INIT
        self.change_status_time = 0

        self.collisionManager = CollisionManager(self)

        # Grab the images for the snake
        self.sprite_sheet0 = None
        self.sprite_sheet1 = None

        # Egg images
        self.sprite_sheet1 = SpriteSheet("Assets/Egg.png")
        self.egg_images = [
            self.sprite_sheet1.get_image(0, 0, 58, 58),
            self.sprite_sheet1.get_image(58, 0, 116, 58)
        ]

        self.image = None
        self.rect = None

        self.change_x = 0
        self.change_y = 0
Esempio n. 5
0
    def __init__(self):
        '# Initialize game window and settings etc.'
        self.screen = pygame.display.set_mode((1000, 1000))

        pygame.display.set_caption("Asteroids")
        pygame.font.init()
        self.myfont = pygame.font.SysFont('Comic Sans MS', 30)
        self.debug_text_surface = self.myfont.render('Hello', False,
                                                     (255, 255, 255))

        self.render_pace: float = 1 / 60
        self.game_active = True
        asteroid_list = []
        bullet_list = []

        ship = Ship(self.screen, Point(400, 500), Point(0, 0), -math.pi / 2, 1)
        enemy_ship = Ship(self.screen, Point(600, 500), Point(0, 0),
                          -math.pi / 2, 1)
        self.game_state = GameState(ship, enemy_ship, bullet_list,
                                    asteroid_list)

        for count in range(0, 8):
            asteroids = Asteroid(self.screen,
                                 Point(randint(0, 900), randint(0, 900)),
                                 Point(randint(-20, 20), randint(-20, 20)),
                                 randint(120, 170))
            list.append(asteroid_list, asteroids)

        self.movement_manager = MovementManager(self.render_pace, 1000, 1000)
        self.collision_manager = CollisionManager()
Esempio n. 6
0
 def __init__(self, file, level, flag=False):
     """ Artifact represent a constant block on the map """
     super().__init__()
     self.flag = flag
     self.level = level
     self.collisionManager = CollisionManager(self)
     # Grab the image for this platform
     self.image = pygame.image.load(file).convert_alpha()
     self.rect = self.image.get_rect()
Esempio n. 7
0
    def __init__(self, player, level):
        super().__init__()

        self.collisionManager = CollisionManager(self)

        # Set bullet speed vector
        self.change_x = 0
        self.change_y = 0
        self.direction = None

        # Grab the images for the bullet
        sprite_sheet = SpriteSheet("Assets/Bullet.png")
        self.images = [
            sprite_sheet.get_image(0, 0, 58, 58),  # Closed door
            sprite_sheet.get_image(58, 0, 116, 58)
        ]  # Opened door

        self.player = player
        if self.player.direction == "D":
            self.image = self.images[0]
            self.direction = "D"
        elif self.player.direction == "U":
            self.image = self.images[0]
            self.direction = "U"
        elif self.player.direction == "L":
            self.image = self.images[1]
            self.direction = "L"
        else:
            self.image = self.images[1]
            self.direction = "R"
        self.rect = self.image.get_rect()

        self.level = level
        block = self
        block.rect.x = self.player.rect.x
        block.rect.y = self.player.rect.y
        block.player = self.player
        self.level.shot_list.add(block)
Esempio n. 8
0
    def __init__(self, conffile):
        pygame.init()
        self.config = GameConfig(conffile)
        self.clock = pygame.time.Clock()

        self.layer_manager = LayerManager(self.config, self.clock)
        self.story_manager = StoryManager(self, self.layer_manager)
        self.collision_manager = CollisionManager(self.layer_manager)

        #list pour le joueur et monstre
        self.perso = None
        self.monstres = []

        self.layer_manager.set_map(self, self.config.get_start_map())
        self.layer_manager.new_layer('player', tmx.SpriteLayer)
        self.layer_manager.new_layer('npcs', tmx.SpriteLayer)
        self.layer_manager.new_layer('monster', tmx.SpriteLayer)

        self.FPS = 30
        self.clocks = {"playerHud": 0}
        self.userInput = None
Esempio n. 9
0
class GameWorld(object):

    def __init__(self, theApp):
        ''' theApp: refernecja do obiektu aplikacji. Potrzebne przy dodawaniu obiektu nasłuchującego wejścia. '''

        self.__theApp = theApp                                              # obiekt zarządzający aplikacją
        self.__objects = []                                                 # lista obiektów w świecie

        self.__spriteManager     = SpriteManager()                           # menadżer sprite'ów
        self.__collisionManager  = CollisionManager(self.__spriteManager)    # menadżer kolizji
        self.__objectFactory     = self.__create_object_factory(self.__spriteManager) # fabryka obiektów
        self.__levelManager      = LevelManager(self.__objectFactory,self.__spriteManager)  # menadżer poziomów
        self.__backgroundManager = BackgroundManager( levelManager = self.__levelManager )
        self.__backgroundManager.set_window_coords( self.__theApp.get_window_coords() )
        self.__backgroundManager.set_window_draw_dim( self.__theApp.get_window_draw_dim() )
        self.__levelManager.set_window_coords( self.__theApp.get_window_coords() )
        self.__levelManager.set_window_draw_dim( self.__theApp.get_window_draw_dim() )

        if not self.__levelManager.load_level("demo_level"):
            assert True, "Tworzenie świata nie powiodło się. Nie można wczytać poziomu."

        const.renderTextureSize = (512,256)                # rozmiary tekstury, do której będziemy renderować
        self.__renderTexture = image.create( *const.renderTextureSize ).get_texture()

        # Dodaj obiekt helikoptera i jeepa do gry
        #
        # FIXME: jeep?
        #
        self.add_object( self.__create_heli() )


    def add_object(self, gameObject):
        ''' Dodaje obiekt do świata. Sprawdza typ dodawanego obiektu. '''
        try: isinstance(gameObject, GameObject),
        except TypeError, msg: print msg, "Dodawany obiekt nie jest typu GameObject."

        self.__objects.append( gameObject )
        self.__collisionManager.add_object( gameObject )


    def remove_object(self, gameObject):
        ''' Usuwa wszystkie wystąpienia obiektu w świecie. '''
        for i in range(self.__objects.count(gameObject)):
            self.__objects.remove( gameObject )
            self.collisionManager.remove_object( gameObject )

    def create_object(self, objName):
        ''' Tworzy obiekt o zadanej nazwie korzystając z fabryki obiektów. '''
        return self.__objectFactory.create_object( objName )


    def get_background_manager(self):
        assert self.__backgroundManager, "Obiekt menedżera tła nie istnieje."
        return self.__backgroundManager


    def update(self, dt):
        ''' Aktualizuje obiekty ze świata. '''

        # aktualizacja menedżera poziomu (np. stworzenie nowych jednostek)
        self.__levelManager.update( dt, self )

        # usuń obiekty, które są za lewą krawędzią planszy
        for obj in self.__objects:
            animName    = obj.get_current_animation_name()
            frame       = self.__spriteManager.get_frame( obj.spriteName, animName, 0 )
            (ww,wh)     = self.__theApp.get_window_draw_dim()
            objectWidth = frame.width / float(ww)
            if obj.position[0]+objectWidth < -0.5:
                print "DELETED:",obj.spriteName
                obj.destroy()

        # odfiltruj obiekty, które są zniszczone
        for o in self.__objects:
            if o.isDestroyed():
                self.__collisionManager.remove_object(o)
        self.__objects = filter(lambda o: not o.isDestroyed() , self.__objects)

        # sprawdź kolizje
        self.check_collisions()

        # aktualizuj stan obiektów
        for obj in self.__objects:
            obj.update( dt )

        # aktualizuj tło
        self.get_background_manager().update( dt )


    def __draw_object( self, obj ):
        ''' Rysuje obiekt przekazany jako argument. '''
        glPushMatrix()

        # przygotuj mieszanie kolorów
        glEnable( GL_BLEND )
        glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA )

        # zbierz informacje o reprezentacji obiektu
        spriteName  = obj.spriteName
        animName    = obj.get_current_animation_name()
        frameNum    = obj.get_current_frame_num()
        frame     = self.__spriteManager.get_frame( spriteName, animName, frameNum )
        (ww,wh)   = self.__theApp.get_window_draw_dim()
        (tc,vs)   = compute_tex_vertex_coords( obj, frame, ww, wh )
        textureId = frame.textureId

        # narysuj tło pod sprite'em (do celów testowych)
        if( obj.display_pad() ):
            glDisable( GL_TEXTURE_2D )
            glColor3f( .3, .3, .4 )     # ew. kolor może być skądś pobierany
            glBegin( GL_QUADS )
            for v in vs:
                glVertex2f( *v )
            glEnd()

        # narysuj sprite'a
        draw_textured_quad( tc, vs, textureId )
        glColor3f( 1, 1, 1 )

        glPopMatrix()


    def draw(self):
        ''' Rysuje wszystkie obiekty w świecie. '''
        glClearColor( 0.4, 0.4, 0.4, 0.5 )
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
        glMatrixMode( GL_MODELVIEW )
        glLoadIdentity()

        # zmień viewport, będziemy renderować do tekstury
        if config.IS_RENDER_TO_TEXTURE:
            tw,th = const.renderTextureSize
            glViewport( 0, 0, tw, th )

        glTranslatef( 0, 0, -10 )

        # narysuj tło
        self.get_background_manager().draw_background()

        # narysuj scenerię
        glTranslatef( 0, 0, 1 )
        for obj in filter(lambda o:isinstance(o,SceneryObject),self.__objects):
            self.__draw_object( obj )

        # narysuj jednostki, etc.
        glTranslatef( 0, 0, 1 )
        for obj in self.__objects:
            if not (isinstance(obj,SceneryObject) or isinstance(obj,GroundObject)):
                self.__draw_object( obj )

        # narysuj podłoże
        glTranslatef( 0, 0, 1 )
        for obj in filter(lambda o:isinstance(o,GroundObject) and o.position[0]<1.1,self.__objects):
            self.__draw_object( obj )

        # zapisz bufor do tekstury
        if config.IS_RENDER_TO_TEXTURE:
            assert glIsTexture( self.__renderTexture.id ), "Próba narysowania czegoś, co nie jest teksturą"
            glBindTexture( GL_TEXTURE_2D, self.__renderTexture.id )
            glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 0, 0, tw, th, 0 )
#             glCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, tw, th )

        # przywróć viewport, wyczyść bufor i narysuj czworokąt z zapisaną teksturą
        winSize = map( lambda x:int(x), self.__theApp.get_window_dim() )
        glViewport( 0, 0, winSize[0], winSize[1] )
        if config.IS_RENDER_TO_TEXTURE:
            glClearColor( 0.5, 0.5, 0.5, 0.5 )
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
            glLoadIdentity()
            glEnable( GL_TEXTURE_2D )
            glColor3f( 1, 1, 1 )

            # renderuj czworokąt na cały ekran
            coords = self.__theApp.get_window_coords()
            x0,x1,y0,y1 = coords[0], coords[1], coords[2], coords[3]
            tc = [ (  0,  0), (  1,  0), (  1,  1), (  0,  1) ]
            vs = [ ( x0, y0), ( x1, y0), ( x1, y1), ( x0, y1) ]
            draw_textured_quad( tc, vs, self.__renderTexture.id )

        # zrzuć wszystko
        glFlush()
        

    def check_collisions(self):
        ''' Pobiera pary kolidujących obiektów i nakazuje obsługę któremuś z nich. '''

        collPairs = self.__collisionManager.get_colliding_objects()
        for a,b in collPairs:
            if a != b:
                a.collide(b)


    def __create_object_factory(self, spriteManager):
        ''' Tworzy instancję fabryki obiektów. '''

        objFactory = GameObjectFactory()
        add_supported_objects_to_factory(objFactory, spriteManager)
        return objFactory


    def __create_heli(self):
        ''' Tworzy helikopter gracza. '''

        creator = PlayerHeliCreator( self.__theApp, self, self.__spriteManager, self.__objectFactory )
        heli = creator.create( 'heli' )
        heli.position = (0.1, 0.5)
        return heli
Esempio n. 10
0
class Engine(object):
    def __init__(self, mapSizeX, mapSizeY, collisionHandler=None):
        self._objectList = {}
        self._objectIdCount = 9999
        self._map = Map(mapSizeX, mapSizeY)
        self._collisionManager = CollisionManager(collisionHandler)

    def engineStep(self):
        # ipdb.set_trace()
        # self._drawBounds()
        self._collisionManager.reinitializeLists()
        i = 0
        for key in self._objectList:
            obj = self._objectList[key]
            if type(obj) is dynamicObject:
                obj.save()
                obj.updatePosition()
                collisionList = self._collisionManager.collisionDetection(obj, self._objectList, i)
                # for collision in collisionList :
                # ipdb.set_trace()
                # self._objectList[key] = obj.getBackup()
                # 	ipdb.set_trace(frame=None)
            i += 1

    def showCollisions(self):
        newColList = self._collisionManager.newCollisionList
        endedColList = self._collisionManager.getEndOfCollisions()
        if newColList:
            print "New Collisions : "
            print newColList
        if endedColList:
            print "End Of Collisions : "
            print endedColList

    def _drawBounds(self):
        newBounds = []
        for key in self._objectList:
            obj = self._objectList[key]
            if obj.name.split(":")[0] != "bounds":
                name = "bounds:%d" % obj.id
                bounds = obj.shape.bounds()
                shape = Rectangle(bounds.minX, bounds.minY, bounds.maxX - bounds.minX, bounds.maxY - bounds.minY)
                if self.getObjectbyName(name) is not None:
                    self.getObjectbyName(name).shape = shape
                else:
                    newbound = {}
                    newbound["name"] = name
                    newbound["shape"] = shape
                    newBounds.append(newbound)
        for bounds in newBounds:
            self._objectIdCount += 1
            self.addNewObject(bounds["name"], True, bounds["shape"], "bounds")

    def addNewObject(self, objectName, isStatic, shape, objectId=None, objectType=None):
        if objectId is None:
            self._objectIdCount += 1
            objectId = self._objectIdCount
        if isStatic:
            newObject = staticObject(objectName, objectId, shape, objectType)
        else:
            newObject = dynamicObject(objectName, objectId, shape, objectType)
        self._objectList[objectId] = newObject
        return newObject

    def deleteObjectById(self, objectId):
        for key in self._objectList:
            if self._objectList[key]._id == objectId:
                toDel = key
                break
        del self._objectList[toDel]

    def deleteObject(self, objectId):
        try:
            del self._objectList[objectId]
            # ipdb.set_trace(frame=None)
            boundObjId = self.getObjectbyName(("bounds:%d" % int(float(objectId)))).id
            del self._objectList[boundObjId]
        except KeyError:
            pass

    def getObjectbyId(self, objectId):
        for key in self._objectList:
            if self._objectList[key]._id == objectId:
                return self._objectList[key]
        return None

    def getObjectbyName(self, objectName):
        for key in self._objectList:
            if self._objectList[key]._name == objectName:
                return self._objectList[key]
        return None

    def objectList():
        doc = "The objectList property."

        def fget(self):
            objList = []
            for key in self._objectList:
                objList.append(self._objectList[key])
            return objList

        return locals()

    objectList = property(**objectList())

    def objectDict():
        doc = "The objectDict property."

        def fget(self):
            return self._objectList

        return locals()

    objectDict = property(**objectDict())

    def map():
        doc = "The map property."

        def fget(self):
            return self._map

        return locals()

    map = property(**map())
Esempio n. 11
0
class GameLoop:
    def __init__(self):
        '# Initialize game window and settings etc.'
        self.screen = pygame.display.set_mode((1000, 1000))

        pygame.display.set_caption("Asteroids")
        pygame.font.init()
        self.myfont = pygame.font.SysFont('Comic Sans MS', 30)
        self.debug_text_surface = self.myfont.render('Hello', False,
                                                     (255, 255, 255))

        self.render_pace: float = 1 / 60
        self.game_active = True
        asteroid_list = []
        bullet_list = []

        ship = Ship(self.screen, Point(400, 500), Point(0, 0), -math.pi / 2, 1)
        enemy_ship = Ship(self.screen, Point(600, 500), Point(0, 0),
                          -math.pi / 2, 1)
        self.game_state = GameState(ship, enemy_ship, bullet_list,
                                    asteroid_list)

        for count in range(0, 8):
            asteroids = Asteroid(self.screen,
                                 Point(randint(0, 900), randint(0, 900)),
                                 Point(randint(-20, 20), randint(-20, 20)),
                                 randint(120, 170))
            list.append(asteroid_list, asteroids)

        self.movement_manager = MovementManager(self.render_pace, 1000, 1000)
        self.collision_manager = CollisionManager()

    def handle_events(self):
        for event in pygame.event.get():
            '# When x button pushed quit game'
            if event.type == pygame.KEYDOWN:
                '#process ship one key down presses'
                if event.key == pygame.K_w:
                    self.movement_manager.command_ship1.accel = True
                elif event.key == pygame.K_a:
                    self.movement_manager.command_ship1.right = True
                elif event.key == pygame.K_d:
                    self.movement_manager.command_ship1.left = True
                elif event.key == pygame.K_SPACE:
                    self.movement_manager.command_ship1.shoot = True
                elif event.key == pygame.K_8:
                    '#process ship two key down presses'
                    self.movement_manager.command_ship2.accel = True
                elif event.key == pygame.K_4:
                    self.movement_manager.command_ship2.left = True
                elif event.key == pygame.K_6:
                    self.movement_manager.command_ship2.right = True
                elif event.key == pygame.K_0:
                    self.movement_manager.command_ship2.shoot = True
            elif event.type == pygame.KEYUP:
                '#process ship one key up presses'
                if event.key == pygame.K_w:
                    self.movement_manager.command_ship1.accel = False
                elif event.key == pygame.K_a:
                    self.movement_manager.command_ship1.right = False
                elif event.key == pygame.K_d:
                    self.movement_manager.command_ship1.left = False
                elif event.key == pygame.K_SPACE:
                    self.movement_manager.command_ship1.shoot = False
                elif event.key == pygame.K_8:
                    '#process ship two key up presses'
                    self.movement_manager.command_ship2.accel = False
                elif event.key == pygame.K_4:
                    self.movement_manager.command_ship2.left = False
                elif event.key == pygame.K_6:
                    self.movement_manager.command_ship2.right = False
                elif event.key == pygame.K_0:
                    self.movement_manager.command_ship2.shoot = False
            elif event.type == pygame.QUIT:
                self.game_active = False
                pygame.quit()

    def update_game(self):
        self.game_state = self.movement_manager.calculate_rotation(
            self.game_state)
        self.game_state = self.movement_manager.calculate_pos_delta(
            self.game_state)
        self.game_state = self.movement_manager.calculate_movement(
            self.game_state)
        self.game_state = self.movement_manager.calculate_shoot(
            self.game_state, self.screen)
        self.game_state = self.collision_manager.if_intersect(self.game_state)

        for i in self.game_state.bullets:
            i.ttl -= 1

        for i in self.game_state.bullets:
            if i.ttl <= 0:
                self.game_state.bullets.remove(i)

    def render_game(self):
        '#render new asteroids at new locations every call'
        "#render new ship locations and heading directions"
        '#render bullets as they are created and travel until they die'

        self.game_state.my_ship.blitme()
        self.game_state.enemy_ship.blitme()

        for i in self.game_state.asteroids:
            i.blitme()
        for i in self.game_state.bullets:
            i.blitme()

        self.debug_text_surface = self.myfont.render(
            str(self.game_state.my_ship.pos_delta.x), False, (255, 255, 255))
        self.screen.blit(self.debug_text_surface, (0, 0))

        pygame.display.flip()
        self.screen.fill(000000)

    """Main game loop"""

    def run_game(self):
        pygame.init()

        while self.game_active:
            self.handle_events()
            self.update_game()
            self.render_game()
Esempio n. 12
0
class Engine(object):
	def __init__(self, mapSizeX, mapSizeY, collisionHandler = None):
		self._objectList = {}
		self._objectIdCount = 9999
		self._map = Map(mapSizeX,mapSizeY)
		self._collisionManager = CollisionManager(collisionHandler)

	def engineStep(self):
		# ipdb.set_trace()
		# self._drawBounds()
		self._collisionManager.reinitializeLists()
		i = 0
		for key in self._objectList:
			obj = self._objectList[key]
			if type(obj) is dynamicObject :
				obj.save()
				obj.updatePosition()
				collisionList = self._collisionManager.collisionDetection(obj, self._objectList, i)
				# for collision in collisionList :
					# ipdb.set_trace()
				# self._objectList[key] = obj.getBackup()
				# 	ipdb.set_trace(frame=None)
			i += 1


	def showCollisions(self):
		newColList = self._collisionManager.newCollisionList
		endedColList = self._collisionManager.getEndOfCollisions()
		if newColList :
			print 'New Collisions : '
			print newColList
		if endedColList :
			print 'End Of Collisions : '
			print endedColList

	def _drawBounds(self):
		newBounds = []
		for key in self._objectList:
			obj = self._objectList[key]
			if obj.name.split(':')[0] != 'bounds' : 
				name = "bounds:%d" % obj.id
				bounds = obj.shape.bounds()
				shape = Rectangle(bounds.minX, bounds.minY, bounds.maxX - bounds.minX, bounds.maxY - bounds.minY)
				if self.getObjectbyName(name) is not None :
					self.getObjectbyName(name).shape = shape
				else :
					newbound = {}
					newbound['name'] = name
					newbound['shape'] = shape
					newBounds.append(newbound)
		for bounds in newBounds :
			self._objectIdCount += 1
			self.addNewObject(bounds['name'], True, bounds['shape'], "bounds")

	def addNewObject(self, objectName, isStatic, shape, objectId=None, objectType=None):
		if objectId is None :
			self._objectIdCount += 1
			objectId = self._objectIdCount
		if isStatic :
			newObject = staticObject(objectName, objectId, shape, objectType)
		else : 
			newObject = dynamicObject(objectName, objectId, shape, objectType)
		self._objectList[objectId] = (newObject)
		return newObject

	def deleteObjectById(self, objectId):
		for key in self._objectList:
			if self._objectList[key]._id == objectId :
				toDel = key
				break
		del self._objectList[toDel]

	def deleteObject(self, objectId):
		try:
			del self._objectList[objectId]
			# ipdb.set_trace(frame=None)
			boundObjId = self.getObjectbyName(('bounds:%d' % int(float(objectId)))).id
			del self._objectList[boundObjId]
		except KeyError:
			pass

	def getObjectbyId(self, objectId):
		for key in self._objectList:
			if self._objectList[key]._id == objectId :
				return self._objectList[key]
		return None

	def getObjectbyName(self, objectName):
		for key in self._objectList:
			if self._objectList[key]._name == objectName :
				return self._objectList[key]
		return None


	def objectList():
	    doc = "The objectList property."
	    def fget(self):
	    	objList = []
	    	for key in self._objectList:
	    		objList.append(self._objectList[key])
	        return objList
	    return locals()
	objectList = property(**objectList())

	def objectDict():
	    doc = "The objectDict property."
	    def fget(self):
	        return self._objectList
	    return locals()
	objectDict = property(**objectDict())

	def map():
	    doc = "The map property."
	    def fget(self):
	        return self._map
	    return locals()
	map = property(**map())
Esempio n. 13
0
 def __init__(self, mapSizeX, mapSizeY, collisionHandler=None):
     self._objectList = {}
     self._objectIdCount = 9999
     self._map = Map(mapSizeX, mapSizeY)
     self._collisionManager = CollisionManager(collisionHandler)
Esempio n. 14
0
class Bullet(pygame.sprite.Sprite):
    def __init__(self, player, level):
        super().__init__()

        self.collisionManager = CollisionManager(self)

        # Set bullet speed vector
        self.change_x = 0
        self.change_y = 0
        self.direction = None

        # Grab the images for the bullet
        sprite_sheet = SpriteSheet("Assets/Bullet.png")
        self.images = [
            sprite_sheet.get_image(0, 0, 58, 58),  # Closed door
            sprite_sheet.get_image(58, 0, 116, 58)
        ]  # Opened door

        self.player = player
        if self.player.direction == "D":
            self.image = self.images[0]
            self.direction = "D"
        elif self.player.direction == "U":
            self.image = self.images[0]
            self.direction = "U"
        elif self.player.direction == "L":
            self.image = self.images[1]
            self.direction = "L"
        else:
            self.image = self.images[1]
            self.direction = "R"
        self.rect = self.image.get_rect()

        self.level = level
        block = self
        block.rect.x = self.player.rect.x
        block.rect.y = self.player.rect.y
        block.player = self.player
        self.level.shot_list.add(block)

    def update(self):
        # Move the bullet
        if self.direction == "R":
            self.go_right()
        elif self.direction == "L":
            self.go_left()
        if self.direction == "U":
            self.go_up()
        elif self.direction == "D":
            self.go_down()
        self.rect.x += self.change_x
        self.rect.y += self.change_y

        # Walls, artifacts & door collisions
        if self.collisionManager.fixed_objects(
                self.level.walls_list) or self.collisionManager.fixed_objects(
                    self.level.door_list
                ) or self.collisionManager.fixed_objects(
                    self.level.artifact_list):
            self.level.shot_list.empty()
        self.change_x = 0
        self.change_y = 0

        # Enemies collisions
        block_hit_list = pygame.sprite.spritecollide(self,
                                                     self.level.enemy_list,
                                                     False)
        b = None
        flag = False
        for block in block_hit_list:
            self.level.shot_list.remove(self)
            flag = True
            b = block
        if flag:
            if b.get_status() == 0 or b.get_status() == 4:
                b.set_egg()
            elif b.get_status() == 1 or b.get_status() == 2:
                self.level.enemy_list.remove(b)
                b.status = 3

    def go_left(self):
        """ Called when the user hits the left arrow. """
        self.image = self.images[1]
        self.change_x = -29
        self.change_y = 0

    def go_right(self):
        """ Called when the user hits the right arrow. """
        self.image = self.images[1]
        self.change_x = 29
        self.change_y = 0

    def go_up(self):
        """ Called when the user hits the up arrow. """
        self.image = self.images[0]
        self.change_y = -29
        self.change_x = 0

    def go_down(self):
        """ Called when the user hits the down arrow. """
        self.image = self.images[0]
        self.change_y = 29
        self.change_x = 0
Esempio n. 15
0
    def __init__(self):
        # Call the parent's constructor
        super().__init__()

        # -- Attributes
        # Set speed vector of player
        self.change_x = 0
        self.change_y = 0

        self.lives = 5
        self.shots = 0

        self.collisionManager = CollisionManager(self)

        # This holds all the images for the animated walk of manolito
        self.walking_frames_l = []
        self.walking_frames_r = []
        self.walking_frames_u = []
        self.walking_frames_d = []

        # What direction is manolito facing?
        self.direction = "D"

        self.level = None
        self.level_end = False
        self.hearts_collected = 0
        self.gem = False

        sprite_sheet = SpriteSheet("Assets/manolito.png")
        # Load all the down facing images into a list
        image = sprite_sheet.get_image(0, 0, 58, 58)
        self.walking_frames_d.append(image)
        image = sprite_sheet.get_image(58, 0, 58, 58)
        self.walking_frames_d.append(image)
        image = sprite_sheet.get_image(116, 0, 58, 58)
        self.walking_frames_d.append(image)
        image = sprite_sheet.get_image(174, 0, 58, 58)
        self.walking_frames_d.append(image)
        image = sprite_sheet.get_image(232, 0, 58, 58)
        self.walking_frames_d.append(image)

        # Load all the left facing images into a list
        image = sprite_sheet.get_image(0, 58, 58, 58)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(58, 58, 58, 58)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(116, 58, 58, 58)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(174, 58, 58, 58)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(232, 58, 58, 58)
        self.walking_frames_l.append(image)

        # Load all the right facing images into a list
        image = sprite_sheet.get_image(0, 116, 58, 58)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(58, 116, 58, 58)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(116, 116, 58, 58)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(174, 116, 58, 58)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(232, 116, 58, 58)
        self.walking_frames_r.append(image)

        # Load all the up facing images into a list
        image = sprite_sheet.get_image(0, 174, 58, 58)
        self.walking_frames_u.append(image)
        image = sprite_sheet.get_image(58, 174, 58, 58)
        self.walking_frames_u.append(image)
        image = sprite_sheet.get_image(116, 174, 58, 58)
        self.walking_frames_u.append(image)
        image = sprite_sheet.get_image(174, 174, 58, 58)
        self.walking_frames_u.append(image)
        image = sprite_sheet.get_image(232, 174, 58, 58)
        self.walking_frames_u.append(image)

        # Set the image the player starts with
        self.image = self.walking_frames_d[0]

        # Set a reference to the image rect.
        self.rect = self.image.get_rect()
        self.rect.x = 58
        self.rect.y = 58
Esempio n. 16
0
class Manolito(pygame.sprite.Sprite):
    def __init__(self):
        # Call the parent's constructor
        super().__init__()

        # -- Attributes
        # Set speed vector of player
        self.change_x = 0
        self.change_y = 0

        self.lives = 5
        self.shots = 0

        self.collisionManager = CollisionManager(self)

        # This holds all the images for the animated walk of manolito
        self.walking_frames_l = []
        self.walking_frames_r = []
        self.walking_frames_u = []
        self.walking_frames_d = []

        # What direction is manolito facing?
        self.direction = "D"

        self.level = None
        self.level_end = False
        self.hearts_collected = 0
        self.gem = False

        sprite_sheet = SpriteSheet("Assets/manolito.png")
        # Load all the down facing images into a list
        image = sprite_sheet.get_image(0, 0, 58, 58)
        self.walking_frames_d.append(image)
        image = sprite_sheet.get_image(58, 0, 58, 58)
        self.walking_frames_d.append(image)
        image = sprite_sheet.get_image(116, 0, 58, 58)
        self.walking_frames_d.append(image)
        image = sprite_sheet.get_image(174, 0, 58, 58)
        self.walking_frames_d.append(image)
        image = sprite_sheet.get_image(232, 0, 58, 58)
        self.walking_frames_d.append(image)

        # Load all the left facing images into a list
        image = sprite_sheet.get_image(0, 58, 58, 58)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(58, 58, 58, 58)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(116, 58, 58, 58)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(174, 58, 58, 58)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(232, 58, 58, 58)
        self.walking_frames_l.append(image)

        # Load all the right facing images into a list
        image = sprite_sheet.get_image(0, 116, 58, 58)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(58, 116, 58, 58)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(116, 116, 58, 58)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(174, 116, 58, 58)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(232, 116, 58, 58)
        self.walking_frames_r.append(image)

        # Load all the up facing images into a list
        image = sprite_sheet.get_image(0, 174, 58, 58)
        self.walking_frames_u.append(image)
        image = sprite_sheet.get_image(58, 174, 58, 58)
        self.walking_frames_u.append(image)
        image = sprite_sheet.get_image(116, 174, 58, 58)
        self.walking_frames_u.append(image)
        image = sprite_sheet.get_image(174, 174, 58, 58)
        self.walking_frames_u.append(image)
        image = sprite_sheet.get_image(232, 174, 58, 58)
        self.walking_frames_u.append(image)

        # Set the image the player starts with
        self.image = self.walking_frames_d[0]

        # Set a reference to the image rect.
        self.rect = self.image.get_rect()
        self.rect.x = 58
        self.rect.y = 58

    def update(self):
        # Move the player
        self.rect.x += self.change_x
        pos = self.rect.x
        if self.direction == "R":
            frame = (pos // 29) % len(self.walking_frames_r)
            self.image = self.walking_frames_r[frame]
        elif self.direction == "L":
            frame = (pos // 29) % len(self.walking_frames_l)
            self.image = self.walking_frames_l[frame]
        self.rect.y += self.change_y
        pos = self.rect.y
        if self.direction == "U":
            frame = (pos // 29) % len(self.walking_frames_u)
            self.image = self.walking_frames_u[frame]
        elif self.direction == "D":
            frame = (pos // 29) % len(self.walking_frames_d)
            self.image = self.walking_frames_d[frame]

        # Wall & door collisions
        if not self.gem:
            self.collisionManager.fixed_objects(self.level.walls_list)
            self.collisionManager.fixed_objects(self.level.door_list)
        else:
            block_hit_list = pygame.sprite.spritecollide(
                self, self.level.door_list, False,
                pygame.sprite.collide_rect_ratio(0.1))
            if block_hit_list != []:
                self.level_end = True

        # Artifact collisions
        self.collisionManager.fixed_objects(self.level.artifact_list)

        # Water
        self.collisionManager.fixed_objects(self.level.water_list)

        # Green blocks
        self.collisionManager.green_blocks(self.level.block_list)

        # Collect hearts
        block_hit_list = pygame.sprite.spritecollide(
            self, self.level.hearts_list, True,
            pygame.sprite.collide_rect_ratio(0.1))
        for block in block_hit_list:
            self.hearts_collected += 1
            if block.bonus > 0:
                self.shots = block.bonus
            # When all hearts are collected, change the status of the enemies
            if self.hearts_collected == self.level.hearts_needed:
                for enemy in self.level.enemy_list:
                    if enemy.status == 0:
                        enemy.status = constants.ENEMY_ATTACK

        # Chest collisions
        if self.hearts_collected < self.level.hearts_needed:
            self.collisionManager.fixed_objects(self.level.chest_list)
        elif self.gem == False:
            block_hit_list = pygame.sprite.spritecollide(
                self, self.level.chest_list, False,
                pygame.sprite.collide_rect_ratio(0.1))
            for block in block_hit_list:
                self.gem = True
                self.level.enemy_list.empty()  # Remove enemies

        # Snake collisions
        self.collisionManager.snakes(self.level.enemy_list)

        self.change_x = 0
        self.change_y = 0

    def go_left(self):
        """ Called when the user hits the left arrow. """
        self.change_x = -29
        self.change_y = 0
        self.direction = "L"

    def go_right(self):
        """ Called when the user hits the right arrow. """
        self.change_x = 29
        self.change_y = 0
        self.direction = "R"

    def go_up(self):
        """ Called when the user hits the up arrow. """
        self.change_y = -29
        self.change_x = 0
        self.direction = "U"

    def go_down(self):
        """ Called when the user hits the down arrow. """
        self.change_y = 29
        self.change_x = 0
        self.direction = "D"

    def shot(self, sound):
        """ Called when the user hits space. """
        if self.shots > 0 and self.level.shot_list.sprites() == []:
            self.shots -= 1
            sound.play()
            bullet.Bullet(self, self.level)

    def end_level(self):
        self.shots = 0
        self.gem = False
        self.hearts_collected = 0
        self.level_end = False
Esempio n. 17
0
	def __init__(self, mapSizeX, mapSizeY, collisionHandler = None):
		self._objectList = {}
		self._objectIdCount = 9999
		self._map = Map(mapSizeX,mapSizeY)
		self._collisionManager = CollisionManager(collisionHandler)
Esempio n. 18
0
class Game(object):

    def __init__(self, conffile):
        pygame.init()
        self.config = GameConfig(conffile)
        self.clock = pygame.time.Clock()

        self.layer_manager = LayerManager(self.config, self.clock)
        self.story_manager = StoryManager(self, self.layer_manager)
        self.collision_manager = CollisionManager(self.layer_manager)

        #list pour le joueur et monstre
        self.perso = None
        self.monstres = []

        self.layer_manager.set_map(self, self.config.get_start_map())
        self.layer_manager.new_layer('player', tmx.SpriteLayer)
        self.layer_manager.new_layer('npcs', tmx.SpriteLayer)
        self.layer_manager.new_layer('monster', tmx.SpriteLayer)

        self.FPS = 30
        self.clocks = {"playerHud": 0}
        self.userInput = None

    def start(self):
        #Trouve l'emplacement du héro
        source = self.layer_manager['boundaries'].find_source("start")

        self.layer_manager.set_focus(source.px, source.py, True)

        self.perso = self.charge_player()
        self.collision_manager.set_player(self.perso)
        self.perso.definir_position(source.px, source.py)

        self.monstres = self.charge_monstres()

        self.userInput = userInput.Keyboard(self)


        epe = weapon.Weapon(self.layer_manager, self.perso, 'clavier', 20, 50, 10)
        self.perso.ajoute_outils(epe, self.layer_manager)


        #hub
        self.createHuds()
        self.story_manager.read_stories(self.config.get_start_map())
        self.mainloop()

    def mainloop(self):
        while True:
            dt = self.clock.tick(self.FPS)

            quitter = EventManager.update(self)
            if quitter:
                return

            if not self.story_manager.blocking:
                self.userInput.updateKey(dt)

            for key, value in self.clocks.iteritems():
                if value >= 0:
                    if value == 0:
                        if key == "playerHud":
                            self.hideHud(key)
                            pass
                    else:
                        self.clocks[key] = value - 1

            #Récupère les collisions
            self.collision_manager.tmx_stackCollisionEvents()

            #stack les collision de monstre
            self.collision_manager.player_stackEvents()

            self.collision_manager.monster_stackEvents()

            #gère les évenement crée par le joureur
            self.collision_manager.player_manageCollisionEvents()

            #Gère les colisions selon leur nature
            self.collision_manager.tmx_manageCollisionEvents()

            self.collision_manager.monster_manageCollisionEvents()

            if self.perso.alive():
                self.layer_manager.update(self.story_manager.blocking)
            else:
                self.story_manager.display_speech(["GAME OVER"], "bottom")
                self.story_manager.set_unblockable(False)

            self.layer_manager.draw()

            pygame.display.update()
            #pygame.display.flip()

    #factory pour monstre
    def charge_monstres(self):
        monstres = []

        try:
            for cell in self.layer_manager['pnjs'].find('monstre'):
                monster_layer = []
                if "visible" not in cell.properties or cell.properties['visible']:
                    monster_layer = self.layer_manager['monster']
                m = monster.Monster(cell.name,
                                    os.path.join(self.config.get_sprite_dir(),
                                                 "sprite-Ennemi.png"),
                                    (cell.px, cell.py), monster_layer)
                m.definir_position(cell.px, cell.py)
                monstres.append(m)
        except KeyError:
            pass

        return monstres

    def charge_player(self):
        return player.Player("player",
                             os.path.join(self.config.get_sprite_dir(),
                                          "sprite-Hero.png"),
                             (0, 0), self.layer_manager['player'])

    def do_trigger(self, trigger):
        self.story_manager.read_story(trigger)

    def effectuer_transition(self, limite):
        if not isinstance(limite, tmx.Object):
            pass

        try:
            if limite.properties['barree']:
                clef_requise = limite.properties['clef']
                if not clef_requise in self.perso.tools:
                    self.story_manager.display_speech([u"La porte est barrée... Il serait certainement possible de", u"l'ouvrir si tu avais une clé."], "top")
                    return
        except KeyError:
            # la porte n'est probablement pas barrée...
            pass

        self.deleteHuds()

        source_name = self.layer_manager.get_current_filename()
        if 'destination' in limite.properties:
            self.layer_manager.set_map(self, limite.properties['destination'])
            if 'dest_transition' in limite.properties:
                source = \
                    self.layer_manager['boundaries'].find_source(limite.properties['dest_transition'])
            else:
                source = \
                    self.layer_manager['boundaries'].find_source(source_name)
            self.createHuds()
            self.perso.definir_position(source.px, source.py)
            self.charge_monstres()
            self.layer_manager.set_focus(source.px, source.py, True)
            self.story_manager.read_stories(limite.properties['destination'])

    def createHuds(self):
        hud = playerHud.PlayerHud("playerHud",
                                  self.perso,
                                  self.layer_manager)
        self.layer_manager.add_layer(hud.name, hud)

    def showHud(self, name):
        layer = self.layer_manager[name]
        layer.setVisible(True)

    def hideHud(self, name):
        layer = self.layer_manager[name]
        layer.setVisible(False)

    def deleteHuds(self):
        if "playerHud" in self.layer_manager.layers:
            layer = self.layer_manager["playerHud"]
            self.layer_manager.remove(layer)
    def addClockSec(self, name, second):
        self.clocks[name] += second * self.FPS