barsunduk

renpy parallax old

Feb 7th, 2022 (edited)
1,204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.09 KB | None | 0 0
  1. # пример использования
  2. # image test = Par("bg", "layer1", "layer2")
  3. # или
  4. # show expression Par("bg", "layer1", "layer2") as room
  5.  
  6. # картинки должны быть разного размера, например,
  7. # 3130х1760, 2614х1470, 2099х1180
  8.  
  9. # либо одинакового размера, но тогда их нужно увеличивать программно:
  10. # Par(("bg", 1.5), ("layer1", 1.3), ("layer2",1.15))
  11.  
  12. init python:
  13.     import math
  14.  
  15.     # класс для параллакса
  16.     class Par(renpy.Displayable):
  17.         # инициализация класса
  18.         def __init__(self, *args):
  19.             super(Par, self).__init__()
  20.             self.mouse_x, self.mouse_y = renpy.get_mouse_pos()
  21.             self.actual_x = 0
  22.             self.actual_y = 0
  23.             self.last_st = 0
  24.  
  25.             # заполнение данных слоёв
  26.             self.images = []
  27.             for i in args:
  28.                 image, zoom = i, 1
  29.                 if isinstance(i, (tuple, list)):
  30.                     image, zoom = i[0], i[1]
  31.                 self.images.append((renpy.displayable(image), zoom))
  32.             return
  33.  
  34.         # отрисовка displayable
  35.         def render(self, width, height, st, at):
  36.             render = renpy.Render(width, height)
  37.             # перебираем слои
  38.             for image, zoom in self.images:
  39.                 # рендерим и узнаем размеры
  40.                 cr = renpy.render(image, width, height, st, at)
  41.                 w, h = cr.get_size()
  42.                 w *= zoom
  43.                 h *= zoom
  44.  
  45.  
  46.                 minimum_speed = 0.5
  47.                 maximum_speed = 3
  48.                 speed = 1 + minimum_speed
  49.                 dx = min(maximum_speed, max(minimum_speed, self.mouse_x - self.actual_x))
  50.                 dy = min(maximum_speed, max(minimum_speed, self.mouse_y - self.actual_y))
  51.                 st_change = st - self.last_st
  52.                 self.last_st = st
  53.                 self.actual_x = math.floor(self.actual_x + (self.mouse_x - self.actual_x) * speed * st_change)
  54.                 self.actual_y = math.floor(self.actual_y + (self.mouse_y - self.actual_y) * speed * st_change)
  55.  
  56.  
  57.                 x = self.actual_x - self.actual_x * w * 1. / width
  58.                 y = self.actual_y - self.actual_y * h * 1. / height
  59.                 # выводим слой на общую картинку
  60.                 r = renpy.render(image, int(w), int(h), st, at)
  61.                 render.blit(r, (x, y))
  62.             # перерисовываем экран
  63.             renpy.redraw(self, 0)
  64.             return render
  65.  
  66.         # считывание позиции мышки
  67.         def event(self, ev, x, y, st):
  68.             import pygame
  69.             hover = ev.type == pygame.MOUSEMOTION
  70.             # click = ev.type == pygame.MOUSEBUTTONDOWN
  71.             # mousefocus = pygame.mouse.get_focused()
  72.             if hover:
  73.                 if (x != self.mouse_x) or (y != self.mouse_y):
  74.                     self.mouse_x, self.mouse_y = x, y
  75.             return
  76.  
Add Comment
Please, Sign In to add comment