Форум о визуальных новеллах » Для разработчиков » Ren'Py » Помощь по Rep'Py (Вопрос\Ответ)
Помощь по Rep'Py (Вопрос\Ответ)

Ternox
Дата: Вторник, 30.09.2014, 21:50 | Сообщение # 1
Администратор
Сообщений: 720
Награды: 50
Сюда пользователи сайта могут писать вопросы о тех или иных функциях движка Ren'Py, а мы попытаемся на них ответить:)


Прежде чем писать мне в ЛС, загляните в FAQ, возможно там уже есть ответ на ваш вопрос.


AxelK
Дата: Пятница, 17.01.2020, 00:54 | Сообщение # 646
Пользователь
Сообщений: 42
Награды: 0
Здравствуйте.
Однако, сразу к делу.
Испытываю острую потребность хранить данные в массивах (лист). Потенциально массивов несколько, и данные в них разного типа. Объекты такие объявить легко и просто, пользоваться ещё проще, но сохраняться силами ren'py они не хотят ни в какую.
По какой-то причине, нагуглить решение тоже не выходит. Питоном доселе не пользовался, если вопрос покажется глупым, просьба не пинать строго.

Прямо на официальной странице проекта рассказано, цитирую
Цитата
In this example:
Код
define a = 1
define o = object()

label start:
    $ b = 1     
    $ o.value = 42


only b will be saved. A will not be saved because it does not change once
the game begins. O is not saved because it does not change – the object it
refers to changes, but the variable itself does not.

Так работает и picke, и cPickle.
То есть, я могу объявить такого рода объект, прекрасно пользоваться им, но при загрузке сохраненной игры это всё будет утеряно.
В чем смысл вообще иметь данные, которые нельзя хранить?
Неужели нет изящного и давно запатентованного способа обойти такую несправедливость?
Или нужно как-то писать свой класс, который будет как-то перехватывать сохранение и сам себя сериализовывать или что-то в этом роде?

Можно, конечно хранить в глобальных переменных что-то вроде
A_1, A_15 = x, y
вместо
A[1], A[15] = x, y
да уж больно некрасиво...

Знатоки, подскажите, пожалуйста, в какую сторону копать.

СОНЦЕ
Дата: Пятница, 17.01.2020, 02:26 | Сообщение # 647
Разработчик
Сообщений: 197
Награды: 29
AxelK
собственно, как и подметили в мануале, чтоб сохранилось, после лабела старт переменную надо пошелевлить
вот в примере как ниже...

Код


label start:
    python:
        A=[]
label main:
    python:
        A.append(renpy.random.randint(1,10))
    'your numbers can be saved. please save-load to check'
    '[A]'
    jump main
    return



...у меня все работает

AxelK
Дата: Пятница, 17.01.2020, 08:52 | Сообщение # 648
Пользователь
Сообщений: 42
Награды: 0
СОНЦЕ,
И это всё? Объявить после метки старт?
Код
label start:
    $ A = [0xff] * 256
    jump game_start
.............

label chapter_x:
     $ A[0] = 1

Спасибо, вроде и правда работает. Двойной фэйспалм -_-
Почему же это в мануалах не вынесено жирными буквами где-нибудь в рамке?

Вопрос второй. Как создать ATL переменной длины?
Банальная задача - анимация глаз, но кадров может быть 3 или больше
Код
transform _position (x, y):
    xoffset 80+x
    yoffset 16+y

transform _eyes (w, h, t):
    crop (0, 0, w, h)
    pause t[0]
    crop (0, h, w, h)
    pause t[1]
    crop (0, h * 2, w, h)
    pause t[2]
    repeat

    _timings = [5.0, 0.1, 0.1]
    _at = [ _position (pos_x, pos_y)]
    _at.append(_eyes (frame_width, frame_height, _timings))
    renpy.show (filename, at_list=_at, layer='master', what=None, zorder=3, tag='eyes', behind=['background','character'])


Можно ли написать трансформацию для заранее неизвестного количества кадров? Или надо сделать трансформацию 1 кадра и в цикле запихивать её с нужными параметрами в _at лист?


Сообщение отредактировал AxelK - Пятница, 17.01.2020, 08:59

Idealist
Дата: Понедельник, 20.01.2020, 22:27 | Сообщение # 649
Проверенный
Сообщений: 10
Награды: 1
создал текстовую новеллу с одной картинкой в виде фона( делал в ренпае). Портировал на андроид. При запуске - error dlopen failed: cannot locate symbol "atof" referenced by "libpng16.so"... Походу картинка слишком большая?

dmit
Дата: Среда, 22.01.2020, 13:29 | Сообщение # 650
Проверенный
Сообщений: 191
Награды: 1
трудно сказать, но зачем фон в png? сделайте jpg

планета FOREVER!!!      Unkenbro team

СОНЦЕ
Дата: Среда, 22.01.2020, 18:53 | Сообщение # 651
Разработчик
Сообщений: 197
Награды: 29
AxelK
Цитата AxelK ()
Как создать ATL переменной длины?Банальная задача - анимация глаз, но кадров может быть 3 или больше
К сожалению у ATL нет (известных мне) адекватных инструментов для реализации данной задачи. Вот решение на реликте доATLовской эпохи.

Код

init python:
    def AnimVar(child,w,h,t,vertical = False):
        return Animation(*list(item for sublist in [(Crop((w*i*(not vertical),h*i*vertical,w,h),'grant2'),fx) for i,fx in enumerate(t)] for item in sublist))

image animated_image = AnimVar('animation_sheet.png',165,230,[.1,.1,.1,.1,.1,.1])
#это пример объявления анимации поставляемой горизонтальной полоской 6 кадров 165 на 230 пикселей каждый
#если полоска вертикальная выставить vertical = True

Видно что решение страшненькое, но другое вряд ли получится. Мне кажется, если моргающих героев не 50 и они не процедурно генерируемые то лучше не выпендриваться, а ручками прописать каждую ресничку отдельно

AxelK
Дата: Среда, 22.01.2020, 22:15 | Сообщение # 652
Пользователь
Сообщений: 42
Награды: 0
Цитата СОНЦЕ ()
К сожалению у ATL нет (известных мне) адекватных инструментов для реализации данной задачи. Вот решение на реликте доATLовской эпохи.

Спасибо за ответы. Я примерно этого и боялся.

>> Мне кажется, если моргающих героев не 50 и они не процедурно генерируемые
то лучше не выпендриваться, а ручками прописать каждую ресничку отдельно

В том и дело, что они процедурно-генерируемые. Получается, способ не подходит? Я ведь не могу создавать image на лету, правильно? Остановился на 2 ATL вариантах всё таки: один для 2-кадровой, другой для 3. Если попадется больше, придется добавлять больше :D

Итак, с массивами понятно, с анимацией понятно. Ещё вопрос, на который ответ, кажется, уже знаю.
Анимация палитры это совсем не про рэнпай, да?
Я не питаю надежд перекрашивать целиком displayable объект, но взять картинку и заменить несколько цветов, после чего подсунуть в renpy.show, конечно, было бы сказочно.

СОНЦЕ
Дата: Среда, 22.01.2020, 23:48 | Сообщение # 653
Разработчик
Сообщений: 197
Награды: 29
Цитата AxelK ()
Я ведь не могу создавать image на лету, правильно?

Вообще-то можешь

Код

label start:
    image black = '#000'
    scene black
    'foo'
    image white = '#aaa'
    scene white
    'bar'
    return

вот этот код создает имиджи на лету и прекрасно работает. есть конечно и ограничения, но есть и всевозможные обходы ограничений ^^. В общем -- главное поставить задачу, а метод внедрения какнибудь найдется

Цитата AxelK ()
Анимация палитры это совсем не про рэнпай, да?

кажется, то, что тебе нужно, называется im.MatrixColor
функция которая работает с цветовой обработкой картинок. очень мудреная, но в ней есть пресеты, вчастности можно сдвинуть цвета по hue палитре. возможно это сойдет.

AxelK
Дата: Четверг, 23.01.2020, 00:11 | Сообщение # 654
Пользователь
Сообщений: 42
Награды: 0
Цитата СОНЦЕ ()
вот этот код создает имиджи на лету и прекрасно работает. есть конечно и ограничения, но есть и всевозможные обходы ограничений ^^. В общем -- главное поставить задачу, а метод внедрения какнибудь найдется
Я пробовал создавать сцены из animation() на лету. Ругалось, что надо картинки объявлять в init, а меня такое не устраивает. Попробую, конечно. еще раз.

Цитата СОНЦЕ ()
кажется, то, что тебе нужно, называется im.MatrixColor
Хм, Так а мне не ко всем цветам надо операции делать, а к строго определенным. Например, "погасить" 2-3 цвета из палитры.

СОНЦЕ
Дата: Четверг, 23.01.2020, 01:12 | Сообщение # 655
Разработчик
Сообщений: 197
Награды: 29
Цитата AxelK ()
. Например, "погасить" 2-3 цвета из палитры.

палитра и состоит из 3х цветов - красный зеленый и синий. каждый из этих цветов можно "погасить" например если гасить синий, то синий стает черным, а фиолетовый - темно-красным. таким образом получается "органичное" выцветание.
Если же нужно "гасить" определенную область рисунка, возможно стоит рисовать ее отдельным слоем, и проводить манипуляции отдельно

AxelK
Дата: Четверг, 23.01.2020, 08:02 | Сообщение # 656
Пользователь
Сообщений: 42
Награды: 0
Цитата СОНЦЕ ()
палитра и состоит из 3х цветов - красный зеленый и синий. каждый из этих цветов можно "погасить" например если гасить синий, то синий стает черным, а фиолетовый - темно-красным. таким образом получается "органичное" выцветание.Если же нужно "гасить" определенную область рисунка, возможно стоит рисовать ее отдельным слоем, и проводить манипуляции отдельно
Нет-нет, я не имею в виду тру колор. Есть, например, фон с индексированными цветами 4bpp и к нему, само собой палитра.
И вот над ней операции и надо провести. Старая добрая палитровая анимация
Понятно, что не напрямую, но если я знаю, что надо погасить строго цвет #112233 а остальные оставить как есть, то без подготовки предварительно альфа-маски для этого цвета задача довольно любопытная.

AxelK
Дата: Четверг, 23.01.2020, 12:41 | Сообщение # 657
Пользователь
Сообщений: 42
Награды: 0
Цитата СОНЦЕ ()
вот этот код создает имиджи на лету и прекрасно работает. есть конечно и ограничения, но есть и всевозможные обходы ограничений ^^



Мне бы хотелось создать прокручивающийся текст, но если объявить его в начале, то он не подставляется в другой локализации. пытаюсь создать текст на лету через image (чтобы анимировать его перелет снизу-вверх)
  
Код
def my_text_scroll (time, font):
     renpy.image ('credits', Text('[__credits!t]', font=font)
     renpy.show('credits', at_list=[__scroll(time)])


Естественно ругается на объявление image вне блока init. Разве это можно обойти?

СОНЦЕ
Дата: Четверг, 23.01.2020, 14:17 | Сообщение # 658
Разработчик
Сообщений: 197
Награды: 29
AxelK

Код

transform __scroll(time):
    subpixel True
    xanchor 0.0
    xpos 1.0
    linear time xanchor 1.0 xpos 0.0

label main_menu:
    return
label start:
    $__creditslt = 'Билл Гейтс, Тим Кук, Илон Муск'
    $time = 10
    scene expression '#777'
    show expression Text(__creditslt) at __scroll(time)
    'foo'
    'bar'
    return



Ну и да.
Цитата AxelK ()
например, фон с индексированными цветами 4bpp и к нему, само собой палитра.

Ничего про индексированные цвета в доках не припоминаю, потому таки да, это не про ренпай и вероятно там все крутится через ргб

AxelK
Дата: Четверг, 23.01.2020, 15:19 | Сообщение # 659
Пользователь
Сообщений: 42
Награды: 0
Цитата СОНЦЕ ()
Ничего про индексированные цвета в доках не припоминаю, потому таки да, это не про ренпай и вероятно там все крутится через ргб
Так я и не прошу индексированные цвета. Просто заменить один конкретный rgba цвет на другой не менее конкретный

> show expression Text
Это действительно работает. Чтобы программно сделать то же прямо из моей готовой функции пришлось догадаться до
renpy.show ('blah', ... , what = Text() )
А строку текста запихнул прямо сюда же в функцию.
Спасибо :)

AxelK
Дата: Вторник, 28.01.2020, 11:03 | Сообщение # 660
Пользователь
Сообщений: 42
Награды: 0
Просто чтобы добить вопрос об операциях над палитрой.
Если цветов действительно мало (как в моём случае), то, заранее позаботившись об их полной уникальности, можно воспользоваться функцией im.Map().
(то есть если было два цвета #123, лучше сделать, например, #102132 и #112233)

Чтоб не быть голословным, тестовый код, кому интересно
   
Код
python:
        renpy.scene()

        amap=im.ramp(0, 255) # default ramp for alpha channel
        __r, __g, __b = [0]*256, [0]*256, [0]*256 # all other channels are set to 0

        # test palette with a single image
        PAL = {
             '____test': [(0,0,0),(137,103,69),(186,152,103),(239,220,152),(254,254,254)]
        }
        
        img_name = '____test'
        file_name = img_name + '.png'

        # setting up the initial palette
        __pal = PAL[img_name]
        for pixel in __pal:
            r, g, b = pixel
            __r[r],__g[g],__b [b]= r, g, b

        __img = im.Map(file_name, rmap=''.join(map(chr, __r)), gmap=''.join(map(chr, __g)), bmap=''.join(map(chr, __b)), amap=amap, force_alpha=False)
        renpy.show('_', at_list=[], layer='master', what=__img, zorder=1, tag='bg1', behind=[])
        renpy.with_statement(None)

        # now fading to blue channel all colors except black and white (night simulation)
        r, g, b = __pal[1]
        __r,__g[g],__b = 1, 1, b
        r, g, b = __pal[2]
        __r,__g[g],__b = 2, 2, b
        r, g, b = __pal[3]
        __r,__g[g],__b = 3, 3, b

        __img = im.Map(file_name, rmap=''.join(map(chr, __r)), gmap=''.join(map(chr, __g)), bmap=''.join(map(chr, __b)), amap=amap, force_alpha=False)
        renpy.show('_', at_list=[], layer='master', what=__img, zorder=2, tag='bg2', behind=[])
        renpy.with_statement(Dissolve(1.0))[/b][/r]


Естественно, тут надо всё причёсывать, но меня интересовала сама возможность подобной операции.
Впрочем, не уверен, что такую штуку можно таскать по всей игре. Обдумать надо.
Прикрепления: 4856996.png(1.8 Kb)
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Помощь по Rep'Py (Вопрос\Ответ)
Поиск: