Результаты поиска
|
|
#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 да уж больно некрасиво...
Знатоки, подскажите, пожалуйста, в какую сторону копать.
|
#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
|
#3 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ( ) К сожалению у ATL нет (известных мне) адекватных инструментов для реализации данной задачи. Вот решение на реликте доATLовской эпохи. Спасибо за ответы. Я примерно этого и боялся.
>> Мне кажется, если моргающих героев не 50 и они не процедурно генерируемые то лучше не выпендриваться, а ручками прописать каждую ресничку отдельно
В том и дело, что они процедурно-генерируемые. Получается, способ не подходит? Я ведь не могу создавать image на лету, правильно? Остановился на 2 ATL вариантах всё таки: один для 2-кадровой, другой для 3. Если попадется больше, придется добавлять больше :D
Итак, с массивами понятно, с анимацией понятно. Ещё вопрос, на который ответ, кажется, уже знаю. Анимация палитры это совсем не про рэнпай, да? Я не питаю надежд перекрашивать целиком displayable объект, но взять картинку и заменить несколько цветов, после чего подсунуть в renpy.show, конечно, было бы сказочно.
|
#4 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ( ) вот этот код создает имиджи на лету и прекрасно работает. есть конечно и ограничения, но есть и всевозможные обходы ограничений ^^. В общем -- главное поставить задачу, а метод внедрения какнибудь найдется Я пробовал создавать сцены из animation() на лету. Ругалось, что надо картинки объявлять в init, а меня такое не устраивает. Попробую, конечно. еще раз.
Цитата СОНЦЕ ( ) кажется, то, что тебе нужно, называется im.MatrixColor Хм, Так а мне не ко всем цветам надо операции делать, а к строго определенным. Например, "погасить" 2-3 цвета из палитры.
|
#5 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ( ) палитра и состоит из 3х цветов - красный зеленый и синий. каждый из этих цветов можно "погасить" например если гасить синий, то синий стает черным, а фиолетовый - темно-красным. таким образом получается "органичное" выцветание.Если же нужно "гасить" определенную область рисунка, возможно стоит рисовать ее отдельным слоем, и проводить манипуляции отдельно Нет-нет, я не имею в виду тру колор. Есть, например, фон с индексированными цветами 4bpp и к нему, само собой палитра. И вот над ней операции и надо провести. Старая добрая палитровая анимация Понятно, что не напрямую, но если я знаю, что надо погасить строго цвет #112233 а остальные оставить как есть, то без подготовки предварительно альфа-маски для этого цвета задача довольно любопытная.
|
#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. Разве это можно обойти?
|
#7 | Тема: Помощь по Ren'Py (Вопрос\Ответ)
Цитата СОНЦЕ ( ) Ничего про индексированные цвета в доках не припоминаю, потому таки да, это не про ренпай и вероятно там все крутится через ргб Так я и не прошу индексированные цвета. Просто заменить один конкретный rgba цвет на другой не менее конкретный
> show expression Text Это действительно работает. Чтобы программно сделать то же прямо из моей готовой функции пришлось догадаться до renpy.show ('blah', ... , what = Text() ) А строку текста запихнул прямо сюда же в функцию. Спасибо :)
|
#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(No ne) # 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]
Естественно, тут надо всё причёсывать, но меня интересовала сама возможность подобной операции. Впрочем, не уверен, что такую штуку можно таскать по всей игре. Обдумать надо.
|
#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 всегда пуст, если я сам предварительно ничего не рисовал, то есть какая-то другая новая канва.
|
#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
|
#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
Цитата СОНЦЕ ( ) лишь дает пространство для квадратика Дык да, по всей видимости, это новая канва.Цитата СОНЦЕ ( ) если дорисованный квадратик тоже надо перекрасить не надо :-) это было просто чтоб убедиться в подгрузке модуля
|
#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 ?
|
#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
|
|
|