Форум Anivisual закрыт. Вы не можете создавать новые темы или писать ответы. Форум будет работать в режиме архива.
Пользователи · Поиск по форуму · · · Регистрация

  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Форум о визуальных новеллах » Записи участника » AxelK [52]
Результаты поиска

AxelK

#1 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Здравствуйте.
Однако, сразу к делу.
Испытываю острую потребность хранить данные в массивах (лист). Потенциально массивов несколько, и данные в них разного типа. Объекты такие объявить легко и просто, пользоваться ещё проще, но сохраняться силами 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
да уж больно некрасиво...

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

AxelK

#2 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
СОНЦЕ,
И это всё? Объявить после метки старт?
Код
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/Янв/2020, 07:59

AxelK

#3 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ()
К сожалению у ATL нет (известных мне) адекватных инструментов для реализации данной задачи. Вот решение на реликте доATLовской эпохи.

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

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

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

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

AxelK

#4 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ()
вот этот код создает имиджи на лету и прекрасно работает. есть конечно и ограничения, но есть и всевозможные обходы ограничений ^^. В общем -- главное поставить задачу, а метод внедрения какнибудь найдется
Я пробовал создавать сцены из animation() на лету. Ругалось, что надо картинки объявлять в init, а меня такое не устраивает. Попробую, конечно. еще раз.

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

AxelK

#5 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ()
палитра и состоит из 3х цветов - красный зеленый и синий. каждый из этих цветов можно "погасить" например если гасить синий, то синий стает черным, а фиолетовый - темно-красным. таким образом получается "органичное" выцветание.Если же нужно "гасить" определенную область рисунка, возможно стоит рисовать ее отдельным слоем, и проводить манипуляции отдельно
Нет-нет, я не имею в виду тру колор. Есть, например, фон с индексированными цветами 4bpp и к нему, само собой палитра.
И вот над ней операции и надо провести. Старая добрая палитровая анимация
Понятно, что не напрямую, но если я знаю, что надо погасить строго цвет #112233 а остальные оставить как есть, то без подготовки предварительно альфа-маски для этого цвета задача довольно любопытная.

AxelK

#6 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ()
вот этот код создает имиджи на лету и прекрасно работает. есть конечно и ограничения, но есть и всевозможные обходы ограничений ^^



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


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

AxelK

#7 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ()
Ничего про индексированные цвета в доках не припоминаю, потому таки да, это не про ренпай и вероятно там все крутится через ргб
Так я и не прошу индексированные цвета. Просто заменить один конкретный rgba цвет на другой не менее конкретный

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

AxelK

#8 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Просто чтобы добить вопрос об операциях над палитрой.
Если цветов действительно мало (как в моём случае), то, заранее позаботившись об их полной уникальности, можно воспользоваться функцией 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)

AxelK

#9 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ()
костылем
А можно такой вопрос. Решил воспользоваться редактирование рендера, но не понял, что тут не так.
Вклиниваюсь
   
Код
import pygame_sdl2 as pygame
    import threading
    blit_lock = threading.Condition()

        def render(self, width, height, st, at):
            ...
            render.blit(child_render, (0, 0))
            
            c = render.canvas().get_surface()
            try:            
                blit_lock.acquire()
                pygame.draw.rect(d,.....)
            ...
            return render


Такое работает и рисует поверх картинки всё что надо.
А как взять пиксели с самой картинки? Что-то не то я делаю, по всей видимости.

Код

  try:            
                for i in range(width):
                    for j in range(height):
                        pixel = d.get_at((i, j))

pixel всегда пуст, если я сам предварительно ничего не рисовал, то есть какая-то другая новая канва.

AxelK

#10 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ()
а можно рабочий пример без троеточий? тогда возможно быстрее разберусь

Можно, конечно. Вырезал всякие лишние переменные, размеры, списки цветов.


Код
init python:
    import pygame_sdl2 as pygame
    import threading
    blit_lock = threading.Condition()
    
    class MyBlit(renpy.Displayable):

        def __init__(self, child, **kwargs):
            super(MyBlit, self).__init__(**kwargs)
            self.child = child
        
        def render(self, width, height, st, at):
            # это всё стандартная часть
            displayable_child = renpy.displayable(self.child)
            child_render = renpy.render(displayable_child, width, height, st, at)
            self.width, self.height = child_render.get_size()
            render = renpy.Render(self.width, self.height)
            render.blit(child_render, (0, 0))
            
            c = child_render.canvas().get_surface()
            try:
                blit_lock.acquire()

                # теста ради рисую прямоугольную рамку. такой цвет есть и на картинке
                pygame.draw.rect(c,
                             renpy.easy.color((191, 143, 127, 255)),
                             (1, 2, 100, 200),
                             2)

                rx, ry = 200, 200
                c.lock()
                for i in range(rx):
                    for j in range(ry):
                        pix = c.get_at((i, j))
                        if pix == (191, 143, 127, 255):   # перекрашивает только нарисованную рамку
                            c.set_at((i, j), (255,255,255,255))
                c.unlock()
                
            finally:
                blit_lock.release()
                 
            return render

label test_blit:
    python:
        renpy.scene()
        test_image = MyBlit('test.png')
        renpy.show('_', at_list=[], layer='master', what=test_image, zorder=1, tag='bg', behind=[])

    ' blah blah '
    return

AxelK

#11 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ()
.load_surface

Так вот куда надо было это пихать... Интересно, ушёл думать.
Спасибо.

Чуть подправил, в том числе для нескольких цветов по списку.
Делает то что нужно, вопрос только не слишком ли это медленно :-)

Код
init python:
    import pygame_sdl2 as pygame
    import threading

    class MyBlit(renpy.Displayable):

        def __init__(self, child, colors, **kwargs):
            super(MyBlit, self).__init__(**kwargs)
            self.child = child
            self.child_surf = renpy.load_surface(child)
            self.colors = colors
        
        def render(self, width, height, st, at):
            displayable_child = renpy.displayable(self.child)
            child_render = renpy.render(displayable_child, width, height, st, at)
            self.width, self.height = child_render.get_size()
            surf = self.child_surf

            rx, ry = self.width, self.height
            surf.lock()
            for i in range(int(rx)):
                for j in range(int(ry)):
                    pix = surf.get_at((i, j))
                    for cf, ct in self.colors:
                        if pix == cf:
                            surf.set_at((i, j), ct)
            surf.unlock()
            
            render = renpy.Render(self.width, self.height)
            render.blit(surf, (0, 0))
                 
            return render

label start:
    python:
        renpy.scene()
        file_name = 'images/__test.png'
        test_image = Image(file_name)
        renpy.show('_', at_list=[truecenter], layer='master', what=test_image, zorder=1, tag='bg', behind=[])
        renpy.with_statement(None)
    ' day '

    python:
        colors = (
            ((137,103,69,255), (2,2,69,255)),
            ((186,152,103,255), (3,3,103,255)),
            ((239,220,152,255), (4,4,152,255))
        )
        test_image = MyBlit(file_name, colors)
        renpy.show('_', at_list=[truecenter], layer='master', what=test_image, zorder=1, tag='bg', behind=[])
        renpy.with_statement(Dissolve(0.7))
        renpy.pause(0.7, hard=True)
    ' night '

    return


Цитата СОНЦЕ ()
лишь дает пространство для квадратика

Дык да, по всей видимости, это новая канва.
Цитата СОНЦЕ ()
если дорисованный квадратик тоже надо перекрасить

не надо :-) это было просто чтоб убедиться в подгрузке модуля

AxelK

#12 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Новый день, новые проблемы.
Решил сделать экран со статами с помощью layeredimage
предположим, деньги отображаются картинками и нужно для каждого разряда отобразить свою цифру-картинку
digits.png = все цифры в ряд через 16 пикселей

Код

  layeredimage Stats:
        always:
            "frame.png"

        if money >= 100:
            pos (0, 0)
            crop (0, 0, 16, 16)   # 0 в первую позицию
            "digits.png"

        if money >= 10:
            pos (16 , 0)
            crop (0, 0, 16, 16)   # 0 во вторую позицию
            "digits.png"

        if money >= 0:
            pos (32 , 0)
            crop (0, 0, 16, 16)   # и 0 в третью позицию
            "digits.png"


Это всё работает и копирует нули как надо.
А можно как-то использовать Money внутри pos или crop ?

AxelK

#13 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
dmit , СОНЦЕ : спасибо за подсказки
.

Свой шрифт в данном месте, пожалуй, ни к чему.
Хочу отобразить автоматом весь экран вообще (по идее)
Кроме денег надо несколько других параметров "градусниками" и числами, время суток, день недели и т.д.

Через Layeredimage не выходит.
Попробовал сделать экран. Не знаю, можно проще или нет

Код
## Generic frames.
define gui.frame_borders = Borders(0, 0, 0, 0)
~~~

python:

    # создание картинок
    for i in range(10):
        renpy.image('money_%d' % i, Crop((i*16, 0, 8, 16), "util.png"))
    renpy.image('money_a', Crop((160, 0, 8, 16), "util.png")) # это графическое изображение точки

    # вспомогательная функция
    # добавляю точку для тысяч
    def format_money (a):
        if a < 1000:
            return str(a)
        return '%da%d' % (int(a/1000), int(a%1000))

    screen money (nn=""):
        frame style "money_frame":
            has hbox
            for cfr in nn:
                add 'money_%s'%cfr

    screen Stats:
        modal False
        zorder 0
        style_prefix "stats"
        window:
            add "frame.png"
            use money (format_money (money))

    style money_frame:
        xpos 600
        ypos 20
        xanchor 1.0 # чтоб прижималось к правому краю

    style stats_window is empty
    style stats_window:
        xpos 0
        ypos 0
        xsize 640
        ysize 400


    $ money = 0
    show screen Stats

    pause
    $ money = 10
    pause
    $ money = 200
    pause
    $ money = 304050
    pause
Форум о визуальных новеллах » Записи участника » AxelK [52]
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Поиск: