You need two images, the outside of an object and the inside.
The following script is a slight modification of the Creator-Defined Displayables example from the documentation, it originated while I was studying how to create displyables:
Code: Select all
init python:
import math
class XRay(renpy.Displayable):
def __init__(self, child, child2, opaque_distance, transparent_distance, **kwargs):
# Pass additional properties on to the renpy.Displayable
# constructor.
super(XRay, self).__init__(**kwargs)
# The childs.
self.child = renpy.displayable(child) # Top
self.child2 = renpy.displayable(child2) # bottom
# The distance at which the child will become fully opaque, and
# where it will become fully transparent. The former must be less
# than the latter.
self.opaque_distance = opaque_distance
self.transparent_distance = transparent_distance
# The alpha channel of the child.
self.alpha = 0.0
# The width and height of us, and our child.
self.width = 0
self.height = 0
def render(self, width, height, st, at):
# Create a transform, that can adjust the alpha channel of the
# child.
t = Transform(child=self.child, alpha=self.alpha)
# Create a render from the child.
child_render = renpy.render(t, width, height, st, at)
# Get the size of the child.
self.width, self.height = child_render.get_size()
# Create the render we will return.
render = renpy.Render(self.width, self.height)
#
render.place(self.child2)
# Blit (draw) the child's render to our render.
render.blit(child_render, (0, 0))
# Return the render.
return render
def event(self, ev, x, y, st):
# Compute the distance between the center of this displayable and
# the mouse pointer. The mouse pointer is supplied in x and y,
# relative to the upper-left corner of the displayable.
distance = math.hypot(x - (self.width / 2), y - (self.height / 2))
# Base on the distance, figure out an alpha.
if distance >= self.opaque_distance:
alpha = 1.0
elif distance <= self.transparent_distance:
alpha = 0.0
else:
alpha = 1.0 - 1.0 * (distance - self.opaque_distance) / (self.transparent_distance - self.opaque_distance)
# If the alpha has changed, trigger a redraw event.
if alpha != self.alpha:
self.alpha = alpha
renpy.redraw(self, 0)
# Pass the event to our child.
return self.child.event(ev, x, y, st)
def visit(self):
return [ self.child, self.child2 ]
Code: Select all
label start:
"start"
image myxray = XRay("top.png", "botton.png", 200, 100)
show myxray at truecenter
":)"
hide myxray
"end"
References:
https://www.renpy.org/doc/html/udd.html