barsunduk

renpy variative parallax old

Aug 1st, 2018 (edited)
997
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.37 KB | None | 0 0
  1. # пример использования параллакса:
  2.  
  3. # label start:
  4.     # $ mouse_parallax.set((-20, -5, "l0"), (-40, -10, "l1"), (-60, -15, "l2"))
  5.     # $ showp("city0", "city1", "city2", "bg room")
  6.     # with dissolve
  7.     # "Подвигайте мышкой.\nОбычный параллакс. Сильнее двигаются ближние к камере слои."
  8.     # $ scenep()
  9.     # with dissolve
  10.     # $ mouse_parallax.set((-60, -15, "l0"), (-40, -10, "l1"), (-20, -5, "l2"))
  11.     # $ showp("city0", "city1", "city2", "bg room")
  12.     # with dissolve
  13.     # "Подвигайте мышкой.\nЗеркальный параллакс. Значения для смещения слоёв переустановлены. Теперь сильнее двигаются дальние слои. Словно мы смотрим в зеркало."
  14.     # $ scenep()
  15.     # with dissolve
  16.     # return
  17.  
  18. init 1111 python:
  19.     # класс для параллакса
  20.     class MouseParallax(renpy.Displayable):
  21.         def set(self, *args):
  22.             self.xoffset, self.yoffset = 0.0, 0.0
  23.             self.layer_info = args
  24.             for i in self.layers():
  25.                 if i in config.layers + ["master2"]:
  26.                     config.layers.remove(i)
  27.             index = config.layers.index("master") + 1
  28.             for xdist, ydist, layer in args:
  29.                 if not layer in config.layers:
  30.                     config.layers.insert(index, layer)
  31.                     index += 1
  32.             config.layers.insert(index, "master2")
  33.  
  34.         def __init__(self, *args):
  35.             super(renpy.Displayable, self).__init__()
  36.             self.set(*args)
  37.             config.overlay_functions.append(self.overlay)
  38.             return
  39.  
  40.         def layers(self):
  41.             layers = []
  42.             for dx, dy, layer in self.layer_info:
  43.                 layers.insert(0, layer)
  44.             return layers
  45.  
  46.         def render(self, width, height, st, at):
  47.             return renpy.Render(width, height)
  48.  
  49.         def parallax(self, xdist, ydist):
  50.             func = renpy.curry(trans)(xdist=xdist, ydist=ydist, disp=self)
  51.             return Transform(function=func)
  52.  
  53.         def overlay(self):
  54.             ui.add(self)
  55.             for xdist, ydist, layer in self.layer_info:
  56.                 renpy.layer_at_list([self.parallax(xdist, ydist)], layer)
  57.             return
  58.  
  59.         def event(self, ev, x, y, st):
  60.             import pygame
  61.             if ev.type == pygame.MOUSEMOTION:
  62.                 self.xoffset, self.yoffset = ((float)(x) / (config.screen_width)) - 0.5, ((float)(y) / (config.screen_height)) - 0.5
  63.             return
  64.  
  65.     def trans(d, st, at, xdist=None, ydist=None, disp=None):
  66.         d.xoffset, d.yoffset = int(round(xdist * disp.xoffset)), int(round(ydist * disp.yoffset))
  67.         if xdist != 0 or ydist != 0:
  68.             xzoom = (config.screen_width + abs(xdist + xdist)) / float(config.screen_width)
  69.             yzoom = (config.screen_height + abs(ydist + ydist)) / float(config.screen_height)
  70.             if yzoom > xzoom:
  71.                 d.zoom = yzoom
  72.             else:
  73.                 d.zoom = xzoom
  74.             d.anchor = (.5, 1.0)
  75.             d.align = (.5, 1.0)
  76.         return 0
  77.  
  78.     # список для хранения изображений с указанием слоев
  79.     parallax_images = []
  80.  
  81.     # показать несколько изображений, каждое на своем слое параллакса
  82.     # можно с эффектом transform или даже с несколькими
  83.     # количество изображений не должно превышать количество слоев
  84.     # иначе лишние будут выведены на слой master2 поверх остальных
  85.     # $ showp("city1", ("city2", truecenter), ("city3", [truecenter, woo]))
  86.     def showp(*args):
  87.         global parallax_images
  88.         layers = mouse_parallax.layers()
  89.         for i in args:
  90.             at = []
  91.             image = i
  92.             if isinstance(image, tuple):
  93.                 image, at = image
  94.                 if not isinstance(at, list):
  95.                     at = [at]
  96.             l = "master2"
  97.             if len(layers) > 0:
  98.                 l = layers.pop()
  99.             renpy.show(image, at_list=at, layer=l)
  100.             i = (image, l)
  101.             if not i in parallax_images:
  102.                 parallax_images.append(i)
  103.  
  104.     # убрать одно изображение с указанного (или с любого) слоя
  105.     def hidep(image, layer=None):
  106.         global parallax_images
  107.         if not layer:
  108.             layer = "master2"
  109.             for ii, ll in parallax_images:
  110.                 if ii == image:
  111.                     layer = ll
  112.         i = (image, layer)
  113.         renpy.hide(image, layer=layer)
  114.         if i in parallax_images:
  115.             parallax_images.remove(i)
  116.  
  117.     # очистить все слои параллакса
  118.     # и при необходимости добавить новые изображения
  119.     def scenep(*args):
  120.         global parallax_images
  121.         for i in parallax_images:
  122.             image, layer = i
  123.             renpy.hide(image, layer=layer)
  124.         parallax_images = []
  125.         if args:
  126.             showp(*args)
  127.  
  128.     mouse_parallax = MouseParallax((-60, -15, "l0"), (-40, -10, "l1"), (-20, -5, "l2"))
Add Comment
Please, Sign In to add comment