예제 #1
0
def main():
    window = sf.RenderWindow(sf.VideoMode(640, 480),
                             'SFML RenderTexture example')
    window.framerate_limit = 60
    running = True

    rect0 = sf.RectangleShape((5, 5))
    rect0.position = (90, 50)
    rect0.fill_color = sf.Color.GREEN
    rect0.outline_color = sf.Color.BLUE
    rect0.outline_thickness = 2.0

    rect1 = sf.RectangleShape((20, 30))
    rect1.position = (50, 50)
    rect1.fill_color = sf.Color.CYAN

    rt = sf.RenderTexture(110, 110)
    rt.clear(sf.Color(0, 0, 0, 0))
    rt.draw(rect0)
    rt.draw(rect1)
    rt.display()
    s = sf.Sprite(rt.texture)
    s.origin = (55, 55)
    s.position = (320, 240)

    while running:
        for event in window.iter_events():
            if event.type == sf.Event.CLOSED:
                running = False

        window.clear(sf.Color.WHITE)
        s.rotate(5)
        window.draw(s)
        window.display()
    window.close()
예제 #2
0
    def prerender(self, map_):
        # create textures for pre-rendering
        self.top_layers = sf.RenderTexture(self.mapwidth, self.mapheight)
        self.bottom_layers = sf.RenderTexture(self.mapwidth, self.mapheight)

        # render map tiles on the textures
        for z, layer in enumerate(map_):
            for col in layer:
                for tile in col:
                    if z > self.piece_layer:
                        self.top_layers.draw(tile)
                    else:
                        self.bottom_layers.draw(tile)

        # update textures
        self.top_layers.display()
        self.bottom_layers.display()

        # set sprites
        self.map_top = sf.Sprite(self.top_layers.texture)
        self.map_bottom = sf.Sprite(self.bottom_layers.texture)
예제 #3
0
    def __init__(self, input, client, ships):
        self.input = input
        self.client = client

        client.add_handler(self)

        # Enemy render window
        self.lock_window = sf.RenderTexture(500, 500)
        self.lock_window_sprite = sf.Sprite(self.lock_window.texture)
        self.lock_window_sprite.position = (500, 50)

        # Ships
        self.ships = ships
        self.player_ship = self.ships[self.client.client_id]
        self.enemy_ship = None
        self.losers = []

        # Create the systems interface
        self.systems_interface = SystemsInterface(self.player_ship)
        self.input.add_mouse_handler(self.systems_interface)

        # Create the weapons interface
        self.weapons_interface = WeaponsInterface(self.lock_window,
                                                  self.lock_window_sprite,
                                                  self.player_ship)
        for client_id, ship in self.ships.items():
            if client_id != self.client.client_id:
                self.weapons_interface.add_enemy_ship(ship)
                print("added enemy ship: " + str(ship))
                self.enemy_ship = ship  # TODO
        self.input.add_mouse_handler(self.weapons_interface)
        self.input.add_text_handler(self.weapons_interface)

        # Turn stuff
        self.mode = const.plan
        self.turn_timer = 0
        self.turn_number = 0

        # Timer text
        self.turn_mode_text = sf.Text("0", res.font_8bit, 20)
        self.turn_mode_text.position = sf.Vector2(400, 30)

        # Room index
        self.room_index = {}
        for ship in ships.values():
            for room in ship.rooms:
                self.room_index[room.id] = room

        # System index
        self.system_index = {}
        for ship in ships.values():
            ship.engine_system.id = ship.id + ":engine_sys"
            ship.weapon_system.id = ship.id + ":weapon_sys"
            ship.shield_system.id = ship.id + ":shield_sys"
            self.system_index[ship.engine_system.id] = ship.engine_system
            self.system_index[ship.weapon_system.id] = ship.weapon_system
            self.system_index[ship.shield_system.id] = ship.shield_system

        # Weapon index and projectiles
        self.weapon_index = {}
        self.projectiles = []
        for ship in ships.values():
            if not ship.weapon_system:
                continue
            for weapon in ship.weapon_system.weapons:
                self.weapon_index[weapon.id] = weapon
                self.projectiles.extend(weapon.projectiles)

        # Client ship's projectiles
        if self.player_ship.weapon_system:
            for weapon in self.player_ship.weapon_system.weapons:
                for projectile in weapon.projectiles:
                    projectile.is_mine = True
예제 #4
0
def main():
    if not sf.Shader.IS_AVAILABLE:
        display_error()

    # Create the main window
    window = sf.RenderWindow(sf.VideoMode(800, 600), 'SFML shader example')

    clock = sf.Clock()

    # Create the render texture
    texture = sf.RenderTexture(window.width, window.height)

    # Load a background texture to display
    background_texture = sf.Texture.load_from_file('resources/background.jpg')
    background = sf.Sprite(background_texture)

    # Load a sprite which we'll move into the scene
    entity_texture = sf.Texture.load_from_file('resources/sprite.png')
    entity = sf.Sprite(entity_texture)

    # Load the text font
    font = sf.Font.load_from_file('resources/sansation.ttf')

    # Load the texture needed for the wave shader
    wave_texture = sf.Texture.load_from_file('resources/wave.jpg')

    # Load all shaders
    shaders = [None] * 7
    shaders[NOTHING] = sf.Shader.load_from_file('resources/nothing.sfx',
                                                sf.Shader.FRAGMENT)
    shaders[BLUR] = sf.Shader.load_from_file('resources/blur.sfx',
                                             sf.Shader.FRAGMENT)
    shaders[COLORIZE] = sf.Shader.load_from_file('resources/colorize.sfx',
                                                 sf.Shader.FRAGMENT)
    shaders[EDGE] = sf.Shader.load_from_file('resources/edge.sfx',
                                             sf.Shader.FRAGMENT)
    shaders[FISHEYE] = sf.Shader.load_from_file('resources/fisheye.sfx',
                                                sf.Shader.FRAGMENT)
    shaders[WAVE] = sf.Shader.load_from_file('resources/wave.sfx',
                                             sf.Shader.FRAGMENT)
    shaders[PIXELATE] = sf.Shader.load_from_file('resources/pixelate.sfx',
                                                 sf.Shader.FRAGMENT)

    background_shader = ShaderSelector(shaders)
    entity_shader = ShaderSelector(shaders)
    global_shader = ShaderSelector(shaders)

    # Do specific initializations
    shaders[NOTHING].set_parameter('texture', sf.Shader.CURRENT_TEXTURE)
    shaders[BLUR].set_parameter('texture', sf.Shader.CURRENT_TEXTURE)
    shaders[BLUR].set_parameter('offset', 0.0)
    shaders[COLORIZE].set_parameter('texture', sf.Shader.CURRENT_TEXTURE)
    shaders[COLORIZE].set_parameter('color', 1.0, 1.0, 1.0)
    shaders[EDGE].set_parameter('texture', sf.Shader.CURRENT_TEXTURE)
    shaders[FISHEYE].set_parameter('texture', sf.Shader.CURRENT_TEXTURE)
    shaders[WAVE].set_parameter('texture', sf.Shader.CURRENT_TEXTURE)
    shaders[WAVE].set_parameter('wave', wave_texture)
    shaders[PIXELATE].set_parameter('texture', sf.Shader.CURRENT_TEXTURE)

    # Define a string for displaying the description of the current shader
    shader_str = sf.Text()
    shader_str.font = font
    shader_str.character_size = 20
    shader_str.position = (5.0, 0.0)
    shader_str.color = sf.Color(250, 100, 30)
    shader_str.string = ("Background shader: \"{0}\"\n"
                         "Flower shader: \"{1}\"\n"
                         "Global shader: \"{2}\"\n".format(
                             background_shader.get_name(),
                             entity_shader.get_name(),
                             global_shader.get_name()))

    # Define a string for displaying help
    info_str = sf.Text()
    info_str.font = font
    info_str.character_size = 20
    info_str.position = (5.0, 500.0)
    info_str.color = sf.Color(250, 100, 30)
    info_str.string = ("Move your mouse to change the shaders' parameters\n"
                       "Press numpad 1/4 to change the background shader\n"
                       "Press numpad 2/5 to change the flower shader\n"
                       "Press numpad 3/6 to change the global shader")

    # Create a clock to measure the total time elapsed
    clock = sf.Clock()

    # Start the game loop
    while window.open:
        # Process events
        for event in window.iter_events():
            # Close window : exit
            if event.type == sf.Event.CLOSED:
                window.close()

            if event.type == sf.Event.KEY_PRESSED:
                # Escape key : exit
                if event.code == sf.Keyboard.ESCAPE:
                    window.close()

                # Numpad : switch effect
                if event.code == sf.Keyboard.NUMPAD1:
                    background_shader.go_to_previous()
                elif event.code == sf.Keyboard.NUMPAD4:
                    background_shader.go_to_next()
                elif event.code == sf.Keyboard.NUMPAD2:
                    entity_shader.go_to_previous()
                elif event.code == sf.Keyboard.NUMPAD5:
                    entity_shader.go_to_next()
                elif event.code == sf.Keyboard.NUMPAD3:
                    global_shader.go_to_previous()
                elif event.code == sf.Keyboard.NUMPAD6:
                    global_shader.go_to_next()

                # Update the text
                shader_str.string = ("Background shader: \"{0}\"\n"
                                     "Entity shader: \"{1}\"\n"
                                     "Global shader: \"{2}\"\n".format(
                                         background_shader.get_name(),
                                         entity_shader.get_name(),
                                         global_shader.get_name()))

        frame_time = clock.restart().as_milliseconds()

        # Get the mouse position in the range [0, 1]
        if window.width and window.height:
            mouse_x = sf.Mouse.get_position(window)[0] / float(window.width)
            mouse_y = sf.Mouse.get_position(window)[1] / float(window.height)

        # Update the shaders
        background_shader.update(mouse_x, mouse_y)
        entity_shader.update(mouse_x, mouse_y)
        global_shader.update(mouse_x, mouse_y)

        # Animate the entity
        entity_x = (
            (math.cos(clock.elapsed_time.as_milliseconds() * 0.0013) + 1.2) *
            300)
        entity_y = (
            (math.cos(clock.elapsed_time.as_milliseconds() * 0.0008) + 1.2) *
            200)
        entity.position = (entity_x, entity_y)
        entity.rotate(frame_time * 0.1)

        # Draw the background and the moving entity to the render texture
        texture.clear()
        texture.draw(background, background_shader.get_shader())
        texture.draw(entity, entity_shader.get_shader())
        texture.display()

        # Draw the contents of the render texture to the window
        screen = sf.Sprite(texture.texture)
        window.draw(screen, global_shader.get_shader())

        # Draw the interface texts
        window.draw(shader_str)
        window.draw(info_str)

        # Finally, display the rendered frame on screen
        window.display()
예제 #5
0
    def creer_sprites_str(self, chaine):
        """
            Fonction qui créer les sprites du bouton à partir d'une chaine de
            caractères.
        """

        try:
            assert isinstance(chaine, str)
        except AssertionError:
            raise ValueError(chaine, " n'est pas une chaine de caractère.")

        # Créer les images
        self.sprites["normal"] = sf.Image.create(
            len(chaine) * 32, 64, sf.Color(255, 255, 255))
        self.sprites["selection"] = sf.Image.create(
            len(chaine) * 32, 64, sf.Color(255, 255, 255))

        # Dessiner le message sur les images
        for l, lettre in enumerate(chaine):
            coord_lettre = ((ord(lettre) % 10) * 32, (ord(lettre) // 10) * 64,
                            32, 64)
            self.sprites["normal"].blit(ASCII, (l * 32, 0), coord_lettre)
            self.sprites["selection"].blit(ASCII_SELECTION, (l * 32, 0),
                                           coord_lettre)

        # Créer le dessin de la zone de saisie
        largeur_bouton = len(chaine) * 32 if len(
            chaine) * 32 > self.maxlength * 32 + 8 else self.maxlength * 32 + 8
        zone_saisie = sf.RectangleShape()
        zone_saisie.size = (self.maxlength * 32 + 4, 68)
        zone_saisie.fill_color = sf.Color(255, 255, 255)
        zone_saisie.outline_thickness = 2
        zone_saisie.position = ((largeur_bouton - self.maxlength * 32 - 4) //
                                2, 68)

        # Créer des sf.RenderTexture pour y dessiner le sprite final
        render_texture_normal = sf.RenderTexture(largeur_bouton, 138)
        render_texture_selection = sf.RenderTexture(largeur_bouton, 138)

        # Dessiner les sprites
        zone_saisie.outline_color = sf.Color(255, 242, 0)
        render_texture_normal.draw(
            sf.Sprite(sf.Texture.from_image(self.sprites["normal"])))
        render_texture_normal.draw(zone_saisie)

        zone_saisie.outline_color = sf.Color(63, 72, 204)
        render_texture_selection.draw(
            sf.Sprite(sf.Texture.from_image(self.sprites["selection"])))
        render_texture_selection.draw(zone_saisie)

        # Obtenir les images finales
        self.sprites["normal"] = render_texture_normal.texture.to_image()
        self.sprites["selection"] = render_texture_selection.texture.to_image()

        self.sprites["normal"].flip_vertically()
        self.sprites["selection"].flip_vertically()

        self.sprites["normal"].create_mask_from_color(sf.Color(255, 255, 255))
        self.sprites["selection"].create_mask_from_color(
            sf.Color(255, 255, 255))

        # Convertir les images finales en textures
        self.sprites["normal"] = sf.Texture.from_image(self.sprites["normal"])
        self.sprites["selection"] = sf.Texture.from_image(
            self.sprites["selection"])