Пример Drag-and-Drop из документации RenPy с парой доработок


init python:
    # время на перемещение
    move_t = .25

    # Функция, которую назначим для обработки результатов перемещений
    def drag_to(drags, drop):
        # Не попали в пределы города
        if not drop:
            return

        # Запоминаем, что куда переместили
        store.detective = drags[0].drag_name
        store.city = drop.drag_name

        # выравниваем положения детектива и города
        drags[0].snap(drop.x, drop.y, move_t)

        # устанавливаем флаг конца действия,
        # чтобы таймер сработал
        store.drag_ok = True

        # чтобы таймер вообще запустился
        renpy.restart_interaction()

    # превратить в action для кнопок
    DragTo = renpy.curry(drag_to)

screen choose_city:
    # Карта в качестве фона.
    add "EUROPE"

    # Группа drag гарантирует, что детективов и города можно перетащить друг на друга.
    # (в нашем случае только детективов на города, у городов draggable False)
    draggroup:

        # Наши детективы
        drag:
            drag_name "Еву"
            child "ivy"
            droppable False
            dragged drag_to
            xpos 100 ypos 100

        drag:
            drag_name "Зака"
            child "zack"
            droppable False
            dragged drag_to
            xpos 150 ypos 200

        # Города, куда можно направить детективов.
        drag:
            as london
            drag_name "Лондон"
            child "LONDON"
            draggable False
            xpos 500 ypos 150
            # В этот квадрат можно перетаскивать
            xysize(300, 300)

        drag:
            as paris
            drag_name "Париж"
            draggable False
            child "PARIS"
            xpos 200 ypos 500
            # В этот квадрат можно перетаскивать
            xysize(300, 300)

        # Этот персонаж может перемещаться и сам по нажатию кнопки,
        # если установить ему и городам идентификаторы с помощью as
        drag:
            as carmen # идентификатор
            droppable False
            dragged drag_to
            drag_name "Кармэн"
            xpos 600 ypos 600
            frame:
                style "empty"
                vbox:
                    text "\nКАРМЭН" style "names" color "#8af"
                    # кнопки имитируют перетаскивание в нужный город
                    textbutton "Лондон" action DragTo([carmen], london)
                    textbutton "Париж" action  DragTo([carmen], paris)

    # если выбор сделан, то ждем окончания перемещения,
    # затем ещё немного на осознание игроком происходящего
    # и выходим из экрана
    if drag_ok:
        timer move_t + .75 action Return()

label start:
    # сбрасываем флаг конца действия
    $ drag_ok = False

    centered "Кого нам отправить и куда? Перетащите Кармэн, Еву или Зака в нужный город."

    # вызываем экран с выбором города
    call screen choose_city

    centered "Хорошо, мы пошлём [detective] в [city]."
    return

# Чтобы обойтись без картинок, раскрасим квадратики:
init:
    # стиль для имён
    style names is text:
        size 60
        bold True
        color "#fff"


    image EUROPE = "#002"

    image LONDON:
        contains:
            "#004"
            xysize(300, 300)
        contains:
            Text("ЛОНДОН", style="names")

    image PARIS:
        contains:
            "#053"
            xysize(300, 300)
        contains:
            Text("ПАРИЖ", style="names")

    image ivy = Text("\nЕВА", style="names", color="#0f8")

    image zack = Text("\nЗАК", style="names", color="#ff0")

Комментарии