Пользователи · Поиск по форуму · · Вход в аккаунт · Регистрация |
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Помощь по Ren'Py (Вопрос\Ответ) |
Помощь по Ren'Py (Вопрос\Ответ) |
СОНЦЕ#663Co4ek, на сколько я знаю напрямую такой команды в ATL не существует. Но можно пихнуть ее туда UDD костылем
Код init python: class BlitWithSound(renpy.Displayable): def __init__(self,child,input_sound): super(BlitWithSound,self).__init__() self.child = child self.snd = input_sound 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) renpy.play(self.snd) render.blit(child_render, (0, 0)) return render и таким образом код в примере будет выглядить.. Код image bg primer: 'primer' pause(0.5) BlitWithSound('primer','sound.mp3') pause(0.5) #И т.д Если кто знает как это сделать проще\надежнее плз напишите мне тоже интересно :3 Сообщение отредактировал СОНЦЕ - Среда, 29/Янв/2020, 21:31
|
AxelK#665А можно такой вопрос. Решил воспользоваться редактирование рендера, но не понял, что тут не так.
Вклиниваюсь Код 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 всегда пуст, если я сам предварительно ничего не рисовал, то есть какая-то другая новая канва. |
KripWorland#666Всем доброго времени суток. Помогите пожалуйста решить такую задачку:
в ренпи есть весьма удобная штука - экран уведомлений, вызываемый функцией renpy.notify() проблема в том, что при повторном вызове функции предыдущее уведомление скрывается. Вот и хотелось бы сделать функцию, которая бы помещала уведомления в некую очередь и показывала их последовательно. Т.е. если в данный момент нет экрана notify, то сразу выводим его, если же такой экран есть, ставим уведомление в очередь и показываем только тогда, когда предыдущее уведомление будет скрыто. |
BenjaminFR#667Как в ren'py использовать язык как переменную? Т.е., нужно, чтобы при определенном языке вызывалась определенная картинка. Занимаюсь переводом готовой новеллы через renpy translate, был язык по умолчанию - английский, и русский, соответственно. Подскажите, пожалуйста, как это сделать.
|
KripWorland#668Как в ren'py использовать язык как переменную? Т.е., нужно, чтобы при определенном языке вызывалась определенная картинка. Занимаюсь переводом готовой новеллы через renpy translate, был язык по умолчанию - английский, и русский, соответственно. Подскажите, пожалуйста, как это сделать. Например, в игре есть картинка "game\images\img1.png" содержащая английский текст. Для того, чтобы при игре на русском выводилась соответствующая картинка с русским текстом, она должна иметь путь "game\tl\russian\image\img1.png" Если же нужно именно в скрипте узнать, какой язык установлен, можно использовать переменную _preferences.language Код if _preferences.language is None: # здесь язык оригинала, т.е. английский elif _preferences.language == 'russian': # здесь русский язык else: # здесь какой-то еще язык Сообщение отредактировал KripWorland - Воскресенье, 02/Фев/2020, 14:21
|
BenjaminFR#669Если перевод делался через tl, то нужно в папку второго языка положить картинку с тем же путем, который был для основного языка.Например, в игре есть картинка "game\images\img1.png" содержащая английский текст. Для того, чтобы при игре на русском выводилась соответствующая картинка с русским текстом, она должна иметь путь "game\tl\russian\image\img1.png" Если же нужно именно в скрипте узнать, какой язык установлен, можно использовать переменную _preferences.language |
СОНЦЕ#670Всем доброго времени суток. Помогите пожалуйста решить такую задачку:в ренпи есть весьма удобная штука - экран уведомлений, вызываемый функцией renpy.notify() проблема в том, что при повторном вызове функции предыдущее уведомление скрывается. Вот и хотелось бы сделать функцию, которая бы помещала уведомления в некую очередь и показывала их последовательно. Т.е. если в данный момент нет экрана notify, то сразу выводим его, если же такой экран есть, ставим уведомление в очередь и показываем только тогда, когда предыдущее уведомление будет скрыто. Код init python: _notify_list = [] def notify_queue(): global _notify_list if all((not renpy.get_screen('notify'), _notify_list)): renpy.notify(_notify_list.pop(0)); screen notify_check(): timer .5 repeat True action Function(notify_queue) label main_menu: return label start: show screen notify_check 'foo' python: for i in range(50): _notify_list.append(str(i)) 'bar' return мой вариант; косее некуда, но, думаю, можно вычленить функцианал и сделать по-нормальному а можно рабочий пример без троеточий? тогда возможно быстрее разберусь |
AxelK#671Можно, конечно. Вырезал всякие лишние переменные, размеры, списки цветов. Код 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 |
СОНЦЕ#673AxelK,
Код init python: import pygame_sdl2 as pygame import threading class MyBlit(renpy.Displayable): def __init__(self, child,cf,ct, **kwargs): super(MyBlit, self).__init__(**kwargs) self.child = child self.child_surf = renpy.load_surface(child) self.cf = cf self.ct = ct 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() c = self.child_surf rx, ry = self.width, self.height c.lock() for i in range(int(rx)): for j in range(int(ry)): pix = self.child_surf.get_at((i, j)) if pix == self.cf: self.child_surf.set_at((i, j), self.ct) c.unlock() render = renpy.Render(self.width, self.height) render.blit(c, (0, 0)) return render label main_menu: return label start: label test_blit: python: renpy.scene() test_image = MyBlit('test.png',(0,0,255,255),(255,0,0,255)) renpy.show('_', at_list=[truecenter], layer='master', what=test_image, zorder=1, tag='bg', behind=[]) ' blah blah' return вот в таком виде пиксели перекрашиваются непосредственно на картинке. если дорисованный квадратик тоже надо перекрасить: это очевидно можно сделать отдельно. Код c = child_render.canvas().get_surface() похоже эта строчка не подтягивает пиксели из скормленной рендеру картинки, а лишь дает пространство для квадратика. Почему? пока не знаю Сообщение отредактировал СОНЦЕ - Среда, 05/Фев/2020, 23:45
|
AxelK#674Так вот куда надо было это пихать... Интересно, ушёл думать. Спасибо. Чуть подправил, в том числе для нескольких цветов по списку. Делает то что нужно, вопрос только не слишком ли это медленно :-) Код 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#675Новый день, новые проблемы.
Решил сделать экран со статами с помощью 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 ? |
| |||