렌파이에서는 여러 개의 이미지를 한 번에 표시할 때 사용할 수 있는 스프라이트 시스템을 지원합니다. 스프라이트 시스템으로 저마다 디스플레이어블을 하나씩 포함하고 있는 스프라이트를 대량생산할 수 있습니다. 그렇게 만들어진 스프라이트에는 화면 상에 표시될 위치값과 화면에 그려지는 순서값을 입력할 수 있습니다.
스프라이트 시스템은 Transform()
를 래핑한 Fixed()
와
비슷하다고 볼 수 있지만 두 디스플레이어블은 성능이 다릅니다. 우선 스프라이트는 트랜스폼보다
디스플레이어블 처리 속도가 빠릅니다. 스프라이트에 사용된 디스플레이어블은
사용된 스프라이트 갯수에 상관 없이 프레임 당 한 번만 렌더링되기 때문입니다. 그러나 스프라이트는 유연성이 부족합니다.
Transform 에는 다양한 속성 사용할 수 있는 반면에 스프라이트에는
xoffset이나 yoffset 속성만 사용할 수 있습니다.
스프라이트 시스템을 사용하려면 우선 스프라이트매니저 객체를 생성한 다음, 생성 메소드를 호출해서 새 파티클을 만들어야 합니다. 필요에 따라 화면에서 어른거리는 스프라이트를 만드려면 각 스프라이트의 xoffset, yoffset, zorder 필드를 업데이트합시다. update 와 event 인수를 스프라이트매니저에 입력하면 시시각각 변하거나 사용자의 입력에 반응하는 스프라이트를 만들 수 있습니다.
Sprite
¶이 클래스는 스프라이트매니저가 관리하는 하나의 스프라이트를 나타낸다. 화면에 있는
스프라이트의 위치를 제어하는 필드를 포함한다. 스프라이트는
직접 생성하는 것이 아니라
SpriteManager.create()
를 호출해 생성해야 한다.
스프라이트 객체의 필드는 다음과 같다:
Sprite 객체에 사용할 수 있는 메소드는 다음과 같다.
destrody
(self)¶스프라이트를 제거한다. 화면에 표시되지 않도록 하며, SpriteManager에서 해당 스프라이트를 제거한다.
SpriteManager
(update=None, event=None, predict=None, ignore_time=False, **properties)¶스프라이트 묶음을 제어하며, 가능한 가장 빠른 속도로 표시하는 디스플레이어블이다.
(update 함수가 호출되기 전에) 스프라이트매니저가 한 번 렌더링 되면 스프라이트매니저 클래스는 다음과 같은 필드를 갖게 된다.
width, height
스프라이트매니저의 너비와 높이. 픽셀 단위.
스프라이트매니저 객체에 사용할 수 있는 메소드는 다음과 같다.
redraw
(delay=0)¶스프라이트매니저를 delay 초가 경과한 뒤에 다시 그리도록 한다.
SnowBlossom
(d, count=10, border=50, xspeed=(20, 50), yspeed=(100, 200), start=0, fast=False, horizontal=False)¶스노블러섬 이펙트는 다수의 스프라이트 객체를 화면의 위, 아래, 좌, 우로 움직인다. 스프라이트가 화면에서 사라지면 스프라이트는 다시 이펙트의 시작지점으로 돌아간다.
SnowBlossom 클래스를 사용해 화면 상단에서 무언가 떨어지는 이펙트를 쉽게 만들 수 있습니다.
image snow = SnowBlossom("snow.png", count=100)
아래 예제에서는 복잡한 동작을 만들 때 스프라이트매니저를 사용하는 방법을 확인할 수 있습니다. 이 스크립트는 마우스를 피해 움직이는 400개의 파티클을 생성하는 스크립트입니다.
init python:
import math
def repulsor_update(st):
# 마우스 위치를 알아내지 못한다면 포기한다.
if repulsor_pos is None:
return .01
px, py = repulsor_pos
# 스프라이트...
for i in repulsor_sprites:
# 스프라이트와 마우스 간의 벡터를 계산한다.
vx = i.x - px
vy = i.y - py
# 벡터 길이를 얻어서 그 벡터를 정상화한다.
vl = math.hypot(vx, vy)
if vl >= 150:
continue
# 이동할 거리를 계산.
distance = 3.0 * (150 - vl) / 150
# 이동한다.
i.x += distance * vx / vl
i.y += distance * vy / vl
# 화면 밖으로 벗어나지 않도록 한다.
if i.x < 2:
i.x = 2
if i.x > repulsor.width - 2:
i.x = repulsor.width - 2
if i.y < 2:
i.y = 2
if i.y > repulsor.height - 2:
i.y = repulsor.height - 2
return .01
# 이벤트 상에서 마우스 위치를 기록.
def repulsor_event(ev, x, y, st):
store.repulsor_pos = (x, y)
label repulsor_demo:
python:
# 스프라이트 매니저를 생성.
repulsor = SpriteManager(update=repulsor_update, event=repulsor_event)
repulsor_sprites = [ ]
repulsor_pos = None
# 스마일 그림은 하나만 사용한다
smile = Image("smile.png")
# 400개의 스프라이트를 추가한다.
for i in range(400):
repulsor_sprites.append(repulsor.create(smile))
# 400개의 스프라이트를 위치시킨다.
for i in repulsor_sprites:
i.x = renpy.random.randint(2, 798)
i.y = renpy.random.randint(2, 598)
del smile
del i
# 화면에 리펄서를 추가한다.
show expression repulsor as repulsor
"..."
hide repulsor
# 화면을 깨끗이 한다.
python:
del repulsor
del repulsor_sprites
del repulsor_pos