Пример #1
0
    def start_next_stage(self):
        # Se generan las posiciones al azar de los enemigos en "enemies_bucket"
        enemies_sd = GameConfig.get_enemies(self.stage)
        enemies_bucket = []
        for (enemy_type, enemy_quantity) in enemies_sd:
            for x in range(0, enemy_quantity):
                enemies_bucket.append(enemy_type)
        random.shuffle(enemies_bucket)
        total_enemies = len(enemies_bucket)

        #Se calculan los objetos especiales
        items_sd = GameConfig.get_items(self.stage)
        items_bucket = []
        for (item_type, item_quantity) in items_sd:
            for x in range(0, item_quantity):
                items_bucket.append(item_type)
        while len(items_bucket) < total_enemies:
            items_bucket.append(0)
        random.shuffle(items_bucket)

        # Creando los sprites de los enemigos
        great_rect = None
        enemy_shoots = pygame.sprite.RenderPlain()
        enemies = pygame.sprite.RenderPlain()
        x = -1
        for etype in enemies_bucket:
            x += 1
            start_position = self.get_start_position_for_enemy(x, total_enemies)
            enemy = Enemy((etype - 1), items_bucket[x], start_position, enemy_shoots)
            enemy.add(enemies)
            if great_rect is None:
                great_rect = enemy.get_rect().copy()
            else:
                great_rect.union_ip(enemy.get_rect())
        enemy_box = EnemyBox(great_rect, GameConfig.get_move(self.stage))
        for e in enemies:
            e.set_enemy_box(enemy_box)

        # Se generan los prisioneros
        prisoners = pygame.sprite.RenderPlain()
        nprisoners = GameConfig.get_prisoners(self.stage)
        screen = pygame.display.get_surface()
        gap = (screen.get_width() - (self.PRISONER_SPRITE_WIDTH * nprisoners)) / (nprisoners + 1)
        for p in range(0, nprisoners):
            start_position = (self.PRISONER_SPRITE_WIDTH * p) + (gap * (p + 1)), 3
            prisoner = Prisoner(start_position)
            prisoner.add(prisoners)

        # Comienza el juego!
        pygame.time.set_timer(USEREVENT+2, 0)       # Ready screen
        pygame.time.set_timer(USEREVENT+1, 1000)    # Game's time
        return enemies, prisoners, enemy_shoots, enemy_box
Пример #2
0
    def show_rules_stage(self):
        self.render_menu_basics()
        self.render_title("Rules", 2)
        options = pygame.sprite.RenderPlain()
        option = self.place_button_in_screen("back", 60, 120)
        option.add(options)

        fontsubtitle = pygame.font.Font(None, 40)
        #Enemigos
        text = fontsubtitle.render("Enemies", 1, (180, 180, 180))
        self.background.blit(text, (180, 150))
        font = pygame.font.Font(None, 32)
        y_offset = 200
        index = 0
        for e in GameConfig.get_enemy_types():
            image = Enemy.get_image(index)
            self.background.blit(image, (180, y_offset))
            data = font.render(str(e['score']) + " pts", 1, self.subtitle_font_color)
            self.background.blit(data, (250, y_offset + 20))
            y_offset += 80
            index += 1

        #Friends
        text = fontsubtitle.render("Friends", 1, (180, 180, 180))
        self.background.blit(text, (500, 150))
        image = Prisoner.get_image()
        self.background.blit(image, (500, 200))
        text = GameConfig.get_text('prisoner')
        y_offset = 200
        for line in text:
            data = font.render(line, 1, self.subtitle_font_color)
            self.background.blit(data, (550, y_offset))
            y_offset += 30

        image = SpecialItem.get_image('extra_life')
        self.background.blit(image, (430, 420))
        data = font.render("Extra life", 1, self.subtitle_font_color)
        self.background.blit(data, (470, 420))

        image = SpecialItem.get_image('invincible')
        self.background.blit(image, (570, 420))
        data = font.render("Invincible", 1, self.subtitle_font_color)
        self.background.blit(data, (610, 420))

        image = SpecialItem.get_image('super_shoot')
        self.background.blit(image, (500, 470))
        data = font.render("Super shoot", 1, self.subtitle_font_color)
        self.background.blit(data, (540, 470))

        return options
Пример #3
0
    def kill_enemy(self):
        self.time_to_shoot = -1
        self.time_to_death = 25

        data = GameConfig.get_others('fire')
        (sprite_x, sprite_y) = data[0]
        (width, heigth) = data[1]
        self.image = SpriteManager.load(sprite_x, sprite_y, width, heigth)
Пример #4
0
    def set_sprite(self, typesprite, time=None):
        if time is not None:
            self.time_to_back2normal = time
        data = GameConfig.get_player(typesprite)
        (sprite_x, sprite_y) = data[0]
        (width, height) = data[1]

        #Loads sprite
        self.image = SpriteManager.load(sprite_x, sprite_y, width, height)
Пример #5
0
 def show_main_stage(self):
     self.render_menu_basics()
     options = pygame.sprite.RenderPlain()
     xcoord = 120
     ycoord = 120
     menu_items = GameConfig.get_ordered_menu_items()
     for index in menu_items:
         option = self.place_button_in_screen(index, xcoord, ycoord)
         option.add(options)
         xcoord += 150
     return options
Пример #6
0
    def __init__(self, index, xpos, ypos):
        pygame.sprite.Sprite.__init__(self)

        self.type_id = index
        data = GameConfig.get_menu_items(index)
        (sprite_x, sprite_y) = data[0]
        (width, height) = data[1]

        #Loads sprite
        self.image, self.rect = SpriteManager.load_all(sprite_x, sprite_y, width, height)
        self.rect.topleft = xpos, ypos
Пример #7
0
    def __init__(self, coord):
        shoot_xcoord = coord[0]
        shoot_ycoord = coord[1]
        pygame.sprite.Sprite.__init__(self)

        data = GameConfig.get_others('enemy_shoot')
        (sprite_x, sprite_y) = data[0]
        (width, height) = data[1]
        self.image, self.rect = SpriteManager.load_all(sprite_x, sprite_y, width, height)

        self.rect.topleft = (shoot_xcoord + 30), shoot_ycoord + 30
        self.move = 10
Пример #8
0
    def refresh_background(self):
        wdata = GameConfig.get_wallpaper(self.stage)
        backgrounds = pygame.image.load("backgrounds.data")
        (x, y) = wdata[1]
        (width, height) = wdata[2]

        rect = pygame.Rect((x, y, width, height))
        self.background = pygame.Surface(rect.size)
        self.background.blit(backgrounds, (0, 0), rect)

        screen = pygame.display.get_surface()
        font = pygame.font.Font(None, 22)
        text = font.render(wdata[0], 1, (40, 40, 40))
        self.background.blit(text, (screen.get_width() - (5 + text.get_width()), 3))
Пример #9
0
    def __init__(self, shoot_xcoord, shoottype):
        pygame.sprite.Sprite.__init__(self)

        data = GameConfig.get_others(shoottype)
        (sprite_x, sprite_y) = data[0]
        (width, height) = data[1]
        self.image, self.rect = SpriteManager.load_all(sprite_x, sprite_y, width, height)

        if shoottype == 'shoot':
            # Ojos, disparo normal, velocidad normal
            self.rect.topleft = (shoot_xcoord + 30), 530
            self.move = -10
        elif shoottype == 'super_shoot':
            self.rect.topleft = (shoot_xcoord + 10), 530
            self.move = -15
Пример #10
0
    def __init__(self, etype, drop_item, start_position, enemy_shoots):
        self.enemy_shoots = enemy_shoots
        self.drop_item = drop_item
        self.time_to_death = -1
        pygame.sprite.Sprite.__init__(self)

        self.image = self.get_image(etype)
        self.rect = self.image.get_rect()

        self.data = GameConfig.get_enemy_type(etype)

        self.rect.topleft = start_position
        self.enemy_box = None
        self.time_to_shoot = None
        self.reset_time_to_shoot()
Пример #11
0
    def show_about_stage(self):
        self.render_menu_basics()
        self.render_title("About this game", 2)
        options = pygame.sprite.RenderPlain()
        option = self.place_button_in_screen("back", 60, 120)
        option.add(options)

        y_offset = 160
        font = pygame.font.Font(None, 32)
        text = GameConfig.get_text('about')
        for line in text:
            data = font.render(line, 1, self.subtitle_font_color)
            self.background.blit(data, (155, y_offset))
            y_offset += 30

        return options
Пример #12
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
Пример #13
0
 def template_Run(self, n, svr_do_sync, user_do_sync):
     assert svr_do_sync == user_do_sync
     k = MockKeyboard()
     k.inputs = [1]*30+[0]*100
     r = NullRenderer()
     conf = GameConfig()
     conf.player_size = n
     conf.frames_per_sec = 32767
     conf.game_length = 0.05
     conf.post_game_time = 0
     conf.do_sync = svr_do_sync
     conf.sync_timeout = 0.1
     conf.sync_rate = 100
     conf.buffer_size = 64
     # Try to avoid clients dying at the end of handshake.
     test_tries = 40
     status = 0
     for i in range(0, test_tries):
         s = UDPSocket()
         s.Open()
         s.Bind(('', 0))
         svraddr = s.sock.getsockname()
         ps = []
         qs = []
         clients = []
         # Try only once here. In case of server failure and client success,
         # we must re-run the test as a whole.
         server_tries = 1
         server_timeout = 0.5
         client_tries = 1
         # Send only once. To keep tests short, games run only briefly.
         # If the resend happens after the game is ended, the test fails.
         client_resend = 1
         client_timeout = 0.5
         user_conf = GameConfig()
         user_conf.do_sync = user_do_sync
         user_conf.sync_timeout = conf.sync_timeout * n
         for i in range(0, n):
             q = multiprocessing.Queue()
             c = UDPClient()
             p = multiprocessing.Process(target=\
                     UDPServerTestPickleJar_Run,
                     args=(client_tries, client_resend, client_timeout, 
                         c, svraddr, r, k, user_conf, q))
             p.start()
             ps.append(p)
             qs.append(q)
         svr = UDPServer()
         svr.buffer_time = 0
         try:
             status = svr.Run(s, False, conf, server_tries, server_timeout)
         except Exception as ex:
             logger.exception(ex)
             status = 100 # Error in the server, stop the test
         results = []
         for i in range(0, n):
             results.append(qs[i].get())
             ps[i].join()
         s.Close()
         self.assertTrue(status != 100)
         if status == 0:
             break
     self.assertTrue(status == 0)
     for i in range(0, n):
         self.assertTrue(results[i])
Пример #14
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
Пример #15
0
 def test_ne_1(self):
     conf = GameConfig()
     conf.game_length = 413
     conf2 = GameConfig()
     conf2.game_length = 32
     self.assertTrue(conf != conf2)
Пример #16
0
 def test_SerializeAndDeserialize(self):
     conf = GameConfig()
     conf.player_size = 5
     conf.game_length = 40
     conf.frames_per_sec = 130
     conf.screen_width = 1024
     conf.screen_height = 756
     conf.buffer_region = 89
     conf.ball_wall_offset_x = 9357
     conf.ball_wall_offset_y = 932
     conf.paddle_width = 32
     conf.paddle_height = 50
     conf.ball_vel = 3
     conf.ball_size = 100
     conf.rounds = 8
     conf.buffer_delay = 1
     conf.player_id = 2
     # Ignore the event type bytes.
     b = conf.Serialize()[4:]
     test = GameConfig()
     test.Deserialize(b)
     self.assertTrue(conf == test, msg='{0} != {1}'.format(conf, test))
Пример #17
0
    parser.add_argument('--port', type=int, default=8090, help='The port.')
    parser.add_argument('-i', '--interpolate', action='store_true',
            default=False, help='Enable interpolation')
    parser.add_argument('-b', '--buffersize', type=int, default=64,
            help='Number of records to keep.')
    parser.add_argument('--tries', type=int, default=60,
            help='The number of attempts to connect to the server.')
    parser.add_argument('--resend', type=int, default=9,
            help='The number of duplicate messages to send during handshake.')
    parser.add_argument('--timeout', type=int, default=10,
            help='The time allowed for each connection and handshake.')
    parser.add_argument('--nosync', default=False, action='store_true',
            help='Allow server to measure latency and clock.')
    parser.add_argument('--synctimeout', type=int, default=3,
            help='The timeout for RecvSync.')
    args = parser.parse_args()
    conf = GameConfig()
    conf.do_interpolate = args.interpolate
    conf.buffer_size = args.buffersize
    conf.do_sync = not args.nosync
    conf.sync_timeout = args.synctimeout
    c = UDPClient()
    from renderer import Renderer
    r = Renderer()
    # For now, nothing in server's conf affects renderer.
    r.Init()
    conf.ApplyRenderer(r)
    if not c.Run((args.ip, args.port), r, r, conf, args.tries, args.resend,
            args.timeout):
        print('Timed out.')
Пример #18
0
 def get_image(etype):
     data = GameConfig.get_enemy_type(etype)
     (sprite_x, sprite_y) = data['image'][0]
     (width, height) = data['image'][1]
     return SpriteManager.load(sprite_x, sprite_y, width, height)
Пример #19
0
 def test_Apply(self):
     conf = GameConfig()
     conf.frames_per_sec = 120
     conf.game_length = 60
     conf.rounds = 2
     conf.screen_width = 1024
     conf.screen_height = 756
     conf.paddle_width = 32
     conf.paddle_height = 50
     conf.ball_size = 100
     conf.player_id = 2
     conf.cool_down = 5
     e = UDPGameEngine()
     conf.Apply(e)
     self.assertTrue(e.player_id == conf.player_id)
     self.assertTrue(e.key_cool_down_time == conf.cool_down)
     s = e.state
     self.assertTrue(s.frames_per_sec == conf.frames_per_sec)
     self.assertTrue(s.game_length == conf.game_length)
     self.assertTrue(s.rounds == conf.rounds)
     self.assertTrue(s.rotation_length == conf.frames_per_sec * 10)
     self.assertTrue(s.round_length == conf.frames_per_sec * 30)
     self.assertTrue(s.screen.half_width == conf.screen_width // 2)
     self.assertTrue(s.screen.half_height == conf.screen_height // 2)
     self.assertTrue(s.paddle_left.half_width == conf.paddle_width // 2)
     self.assertTrue(s.paddle_right.half_height == \
             conf.paddle_height // 2)
     self.assertTrue(s.ball.half_width == conf.ball_size // 2)
Пример #20
0
        ''' 
        For testing.
        '''
        self.renderer.Render(s, s, 0, 0)
        time.sleep(5)

    def PrintStats(self):
        pass

if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser(description='The triplepong game \
            engine. Use the command line interface for testing.')
    parser.add_argument('-i', '--interpolate', action='store_true',
            default=False, help='Turn on renderer interpolation.')
    args = parser.parse_args()
    e = UDPGameEngine()
    e.is_client = True
    e.is_server = False
    conf = GameConfig()
    conf.do_interpolate = args.interpolate
    conf.Apply(e)
    from renderer import Renderer
    r = Renderer()
    r.Init()
    conf.ApplyRenderer(r)
    e.renderer = r
    e.keyboard = r
    e.PlayAs(e.state, e, 0)
    
Пример #21
0
 def test_eq_3(self):
     conf = GameConfig()
     conf.game_length = 51
     conf2 = GameConfig()
     conf2.game_length = 51
     self.assertTrue(conf == conf2)