renpy/doc/cdd.html

662 lines
44 KiB
HTML
Raw Normal View History

2023-01-18 22:13:55 +00:00
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Creator-Defined Displayables &#8212; Ren&#39;Py Documentation</title>
<link rel="stylesheet" href="_static/renpydoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/bootstrap-3.3.6/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="_static/bootstrap-3.3.6/css/bootstrap-theme.min.css" />
<link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="_static/js/jquery-fix.js"></script>
<script type="text/javascript" src="_static/bootstrap-3.3.6/js/bootstrap.min.js"></script>
<script type="text/javascript" src="_static/bootstrap-sphinx.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Creator-Defined Statements" href="cds.html" />
<link rel="prev" title="Modes" href="modes.html" />
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
<meta name="apple-mobile-web-app-capable" content="yes">
</head><body>
<div id="navbar" class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<!-- .btn-navbar is used as the toggle for collapsed navbar content -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">
Ren&#39;Py Documentation</a>
<span class="navbar-text navbar-version pull-left"><b>7.5.3</b></span>
</div>
<div class="collapse navbar-collapse nav-collapse">
<ul class="nav navbar-nav">
<li><a href="https://www.renpy.org">Home Page</a></li>
<li><a href="https://www.renpy.org/doc/html/">Online Documentation</a></li>
<li class="dropdown globaltoc-container">
<a role="button"
id="dLabelGlobalToc"
data-toggle="dropdown"
data-target="#"
href="index.html">Site <b class="caret"></b></a>
<ul class="dropdown-menu globaltoc"
role="menu"
aria-labelledby="dLabelGlobalToc"><ul>
<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Quickstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="gui.html">GUI Customization Guide</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="language_basics.html">Language Basics</a></li>
<li class="toctree-l1"><a class="reference internal" href="label.html">Labels &amp; Control Flow</a></li>
<li class="toctree-l1"><a class="reference internal" href="dialogue.html">Dialogue and Narration</a></li>
<li class="toctree-l1"><a class="reference internal" href="displaying_images.html">Displaying Images</a></li>
<li class="toctree-l1"><a class="reference internal" href="menus.html">In-Game Menus</a></li>
<li class="toctree-l1"><a class="reference internal" href="python.html">Python Statements</a></li>
<li class="toctree-l1"><a class="reference internal" href="conditional.html">Conditional Statements</a></li>
<li class="toctree-l1"><a class="reference internal" href="audio.html">Audio</a></li>
<li class="toctree-l1"><a class="reference internal" href="movie.html">Movie</a></li>
<li class="toctree-l1"><a class="reference internal" href="voice.html">Voice</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="text.html">Text</a></li>
<li class="toctree-l1"><a class="reference internal" href="translation.html">Translation</a></li>
<li class="toctree-l1"><a class="reference internal" href="displayables.html">Displayables</a></li>
<li class="toctree-l1"><a class="reference internal" href="transforms.html">Transforms</a></li>
<li class="toctree-l1"><a class="reference internal" href="transitions.html">Transitions</a></li>
<li class="toctree-l1"><a class="reference internal" href="atl.html">Animation and Transformation Language</a></li>
<li class="toctree-l1"><a class="reference internal" href="matrixcolor.html">Matrixcolor</a></li>
<li class="toctree-l1"><a class="reference internal" href="layeredimage.html">Layered Images</a></li>
<li class="toctree-l1"><a class="reference internal" href="3dstage.html">3D Stage</a></li>
<li class="toctree-l1"><a class="reference internal" href="live2d.html">Live2D Cubism</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="style.html">Styles</a></li>
<li class="toctree-l1"><a class="reference internal" href="style_properties.html">Style Properties</a></li>
<li class="toctree-l1"><a class="reference internal" href="screens.html">Screens and Screen Language</a></li>
<li class="toctree-l1"><a class="reference internal" href="screen_actions.html">Screen Actions, Values, and Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="screen_special.html">Special Screen Names</a></li>
<li class="toctree-l1"><a class="reference internal" href="screen_optimization.html">Screen Language Optimization</a></li>
<li class="toctree-l1"><a class="reference internal" href="config.html">Configuration Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="preferences.html">Preference Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="store_variables.html">Store Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="mouse.html">Custom Mouse Cursors</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="launcher.html">Launcher</a></li>
<li class="toctree-l1"><a class="reference internal" href="developer_tools.html">Developer Tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="director.html">Interactive Director</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="nvl_mode.html">NVL-Mode Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="input.html">Text Input</a></li>
<li class="toctree-l1"><a class="reference internal" href="side_image.html">Side Images</a></li>
<li class="toctree-l1"><a class="reference internal" href="rooms.html">Image Gallery, Music Room, and Replay Actions</a></li>
<li class="toctree-l1"><a class="reference internal" href="drag_drop.html">Drag and Drop</a></li>
<li class="toctree-l1"><a class="reference internal" href="sprites.html">Sprites</a></li>
<li class="toctree-l1"><a class="reference internal" href="keymap.html">Customizing the Keymap</a></li>
<li class="toctree-l1"><a class="reference internal" href="achievement.html">Achievements</a></li>
<li class="toctree-l1"><a class="reference internal" href="history.html">Dialogue History</a></li>
<li class="toctree-l1"><a class="reference internal" href="multiple.html">Multiple Character Dialogue</a></li>
<li class="toctree-l1"><a class="reference internal" href="splashscreen_presplash.html">Splashscreen and Presplash</a></li>
</ul>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="statement_equivalents.html">Statement Equivalents</a></li>
<li class="toctree-l1"><a class="reference internal" href="save_load_rollback.html">Saving, Loading, and Rollback</a></li>
<li class="toctree-l1"><a class="reference internal" href="persistent.html">Persistent Data</a></li>
<li class="toctree-l1"><a class="reference internal" href="trans_trans_python.html">Transforms and Transitions in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="gui_advanced.html">Advanced GUI</a></li>
<li class="toctree-l1"><a class="reference internal" href="screen_python.html">Screens and Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="modes.html">Modes</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Creator-Defined Displayables</a></li>
<li class="toctree-l1"><a class="reference internal" href="cds.html">Creator-Defined Statements</a></li>
<li class="toctree-l1"><a class="reference internal" href="custom_text_tags.html">Custom Text Tags</a></li>
<li class="toctree-l1"><a class="reference internal" href="character_callbacks.html">Character Callbacks</a></li>
<li class="toctree-l1"><a class="reference internal" href="file_python.html">File Access</a></li>
<li class="toctree-l1"><a class="reference internal" href="color_class.html">Color Class</a></li>
<li class="toctree-l1"><a class="reference internal" href="matrix.html">Matrix</a></li>
<li class="toctree-l1"><a class="reference internal" href="model.html">Model-Based Rendering</a></li>
<li class="toctree-l1"><a class="reference internal" href="other.html">Other Functions and Variables</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="build.html">Building Distributions</a></li>
<li class="toctree-l1"><a class="reference internal" href="updater.html">Web Updater</a></li>
<li class="toctree-l1"><a class="reference internal" href="android.html">Android</a></li>
<li class="toctree-l1"><a class="reference internal" href="chromeos.html">Chrome OS/Chromebook</a></li>
<li class="toctree-l1"><a class="reference internal" href="ios.html">iOS</a></li>
<li class="toctree-l1"><a class="reference internal" href="iap.html">In-App Purchasing</a></li>
<li class="toctree-l1"><a class="reference internal" href="gesture.html">Gestures</a></li>
<li class="toctree-l1"><a class="reference internal" href="raspi.html">Raspberry Pi</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="security.html">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="problems.html">Dealing with Problems</a></li>
<li class="toctree-l1"><a class="reference internal" href="environment_variables.html">Environment Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="self_voicing.html">Self-Voicing</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="editor.html">Text Editor Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="skins.html">Skins</a></li>
<li class="toctree-l1"><a class="reference internal" href="translating_renpy.html">Translating Ren'Py</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Changelog (Ren'Py 7.x-)</a></li>
<li class="toctree-l1"><a class="reference internal" href="changelog6.html">Changelog (Ren'Py 6.11 - 6.99)</a></li>
<li class="toctree-l1"><a class="reference internal" href="incompatible.html">Incompatible Changes</a></li>
<li class="toctree-l1"><a class="reference internal" href="distributor.html">Distributor Notes</a></li>
<li class="toctree-l1"><a class="reference internal" href="license.html">License</a></li>
<li class="toctree-l1"><a class="reference internal" href="credits.html">Credits</a></li>
<li class="toctree-l1"><a class="reference internal" href="sponsors.html">Ren'Py Development Sponsors</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="thequestion.html">Script of The Question</a></li>
<li class="toctree-l1"><a class="reference internal" href="thequestion_nvl.html">NVL-mode script for The Question</a></li>
</ul>
</ul>
</li>
</ul>
<form class="navbar-form navbar-right" action="search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" placeholder="Search" />
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3">
<div id="sidebar" class="bs-sidenav" role="complementary"><ul>
<li><a class="reference internal" href="#">Creator-Defined Displayables</a><ul>
<li><a class="reference internal" href="#example">Example</a></li>
<li><a class="reference internal" href="#renpy-displayable">renpy.Displayable</a></li>
<li><a class="reference internal" href="#renpy-render">renpy.Render</a></li>
<li><a class="reference internal" href="#utility-functions-and-classes">Utility Functions and Classes</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="col-md-9 content">
<div class="section" id="creator-defined-displayables">
<span id="cdd"></span><span id="udd"></span><h1>Creator-Defined Displayables<a class="headerlink" href="#creator-defined-displayables" title="Permalink to this headline"> link</a></h1>
<p>The most complex, but most powerful, way of customizing Ren'Py's
behavior is to use a creator-defined displayable. A creator-defined
displayable is allowed to take arbitrary pygame events. It can
also render other displayables, and place them at arbitrary locations
on the screen. This makes it suitable for creating 2D mini-games that
cannot be expressed with the tools Ren'Py gives you. (But see also the
section <a class="reference internal" href="sprites.html"><span class="doc">sprites</span></a>, which describes a higher-level way
of accomplishing many of the same things.)</p>
<p>Creator-defined displayables are programmed entirely in Python, and we
encourage you to have a reasonable degree of skill at object-oriented
Python programming before you begin creating one.</p>
<div class="section" id="example">
<h2>Example<a class="headerlink" href="#example" title="Permalink to this headline"> link</a></h2>
<p>Here's an example of a creator-defined displayable. This displayable
changes renders its child with an alpha that is determined by the
distance of the mouse pointer from the center of the child.</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">init</span> <span class="k">python</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="k">class</span> <span class="nc">Appearing</span><span class="p">(</span><span class="n">renpy</span><span class="o">.</span><span class="n">Displayable</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="na">child</span><span class="p">,</span> <span class="n">opaque_distance</span><span class="p">,</span> <span class="n">transparent_distance</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># Pass additional properties on to the renpy.Displayable</span>
<span class="c1"># constructor.</span>
<span class="nb">super</span><span class="p">(</span><span class="n">Appearing</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># The child.</span>
<span class="bp">self</span><span class="o">.</span><span class="na">child</span> <span class="o">=</span> <span class="n">renpy</span><span class="o">.</span><span class="n">displayable</span><span class="p">(</span><span class="na">child</span><span class="p">)</span>
<span class="c1"># The distance at which the child will become fully opaque, and</span>
<span class="c1"># where it will become fully transparent. The former must be less</span>
<span class="c1"># than the latter.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">opaque_distance</span> <span class="o">=</span> <span class="n">opaque_distance</span>
<span class="bp">self</span><span class="o">.</span><span class="n">transparent_distance</span> <span class="o">=</span> <span class="n">transparent_distance</span>
<span class="c1"># The alpha channel of the child.</span>
<span class="bp">self</span><span class="o">.</span><span class="na">alpha</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="c1"># The width and height of us, and our child.</span>
<span class="bp">self</span><span class="o">.</span><span class="na">width</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="na">height</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">render</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="na">width</span><span class="p">,</span> <span class="na">height</span><span class="p">,</span> <span class="n">st</span><span class="p">,</span> <span class="k">at</span><span class="p">):</span>
<span class="c1"># Create a transform, that can adjust the alpha channel of the</span>
<span class="c1"># child.</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">Transform</span><span class="p">(</span><span class="na">child</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="na">child</span><span class="p">,</span> <span class="na">alpha</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="na">alpha</span><span class="p">)</span>
<span class="c1"># Create a render from the child.</span>
<span class="n">child_render</span> <span class="o">=</span> <span class="n">renpy</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="na">width</span><span class="p">,</span> <span class="na">height</span><span class="p">,</span> <span class="n">st</span><span class="p">,</span> <span class="k">at</span><span class="p">)</span>
<span class="c1"># Get the size of the child.</span>
<span class="bp">self</span><span class="o">.</span><span class="na">width</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="na">height</span> <span class="o">=</span> <span class="n">child_render</span><span class="o">.</span><span class="n">get_size</span><span class="p">()</span>
<span class="c1"># Create the render we will return.</span>
<span class="n">render</span> <span class="o">=</span> <span class="n">renpy</span><span class="o">.</span><span class="n">Render</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="na">width</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="na">height</span><span class="p">)</span>
<span class="c1"># Blit (draw) the child&#39;s render to our render.</span>
<span class="n">render</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">child_render</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
<span class="c1"># Return the render.</span>
<span class="k">return</span> <span class="n">render</span>
<span class="k">def</span> <span class="nf">event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ev</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">st</span><span class="p">):</span>
<span class="c1"># Compute the distance between the center of this displayable and</span>
<span class="c1"># the mouse pointer. The mouse pointer is supplied in x and y,</span>
<span class="c1"># relative to the upper-left corner of the displayable.</span>
<span class="n">distance</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">hypot</span><span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="na">width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">),</span> <span class="n">y</span> <span class="o">-</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="na">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">))</span>
<span class="c1"># Base on the distance, figure out an alpha.</span>
<span class="k">if</span> <span class="n">distance</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">opaque_distance</span><span class="p">:</span>
<span class="na">alpha</span> <span class="o">=</span> <span class="mf">1.0</span>
<span class="k">elif</span> <span class="n">distance</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">transparent_distance</span><span class="p">:</span>
<span class="na">alpha</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="k">else</span><span class="p">:</span>
<span class="na">alpha</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="mf">1.0</span> <span class="o">*</span> <span class="p">(</span><span class="n">distance</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">opaque_distance</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">transparent_distance</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">opaque_distance</span><span class="p">)</span>
<span class="c1"># If the alpha has changed, trigger a redraw event.</span>
<span class="k">if</span> <span class="na">alpha</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="na">alpha</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="na">alpha</span> <span class="o">=</span> <span class="na">alpha</span>
<span class="n">renpy</span><span class="o">.</span><span class="n">redraw</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="c1"># Pass the event to our child.</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="na">child</span><span class="o">.</span><span class="k">event</span><span class="p">(</span><span class="n">ev</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">st</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">visit</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span> <span class="bp">self</span><span class="o">.</span><span class="na">child</span> <span class="p">]</span>
</pre></div>
</div>
<p>To use the creator-defined displayable, we can create an instance of it,
and add that instance to the screen.</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">screen</span> <span class="n">alpha_magic</span><span class="p">:</span>
<span class="k">add</span> <span class="n">Appearing</span><span class="p">(</span><span class="s2">&quot;logo.png&quot;</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">):</span>
<span class="na">xalign</span> <span class="mf">0.5</span>
<span class="na">yalign</span> <span class="mf">0.5</span>
<span class="k">label</span> <span class="n">start</span><span class="p">:</span>
<span class="k">show</span> <span class="k">screen</span> <span class="n">alpha_magic</span>
<span class="s2">&quot;Can you find the logo?&quot;</span>
<span class="k">return</span>
</pre></div>
</div>
</div>
<div class="section" id="renpy-displayable">
<h2>renpy.Displayable<a class="headerlink" href="#renpy-displayable" title="Permalink to this headline"> link</a></h2>
<p>A creator-defined displayable is created by subclassing the
renpy.Displayable class. A creator-defined displayable must override
the render method, and may override other methods as well.</p>
<p>A displayable object must be pickleable, which means it may not
contain references to objects that cannot be pickled. Most notably,
Render objects cannot be stored in a creator-defined displayable.</p>
<p>Since we expect you to override the methods of the displayable
class, we'll present them with the <cite>self</cite> parameter.</p>
<dl class="class">
<dt id="renpy.Displayable">
<em class="property">class </em><code class="descclassname">renpy.</code><code class="descname">Displayable</code><a class="headerlink" href="#renpy.Displayable" title="Permalink to this definition"> link</a></dt>
<dd><p>Base class for creator-defined displayables.</p>
<dl class="method">
<dt id="renpy.Displayable.__init__">
<code class="descname">__init__</code><span class="sig-paren">(</span><em>**properties</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Displayable.__init__" title="Permalink to this definition"> link</a></dt>
<dd><p>A subclass may override the constructor, perhaps adding new
parameters. If it does, it should pass all unknown keyword
arguments to the renpy.Displayable constructor, with the
call:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="nb">super</span><span class="p">(</span><span class="n">MyDisplayable</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">**</span><span class="na">properties</span><span class="p">)</span>
</pre></div>
</div>
</dd></dl>
<dl class="method">
<dt id="renpy.Displayable.render">
<code class="descname">render</code><span class="sig-paren">(</span><em>self</em>, <em>width</em>, <em>height</em>, <em>st</em>, <em>at</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Displayable.render" title="Permalink to this definition"> link</a></dt>
<dd><p>Subclasses must override this, to return a <a class="reference internal" href="#renpy.Render" title="renpy.Render"><code class="xref py py-class docutils literal notranslate"><span class="pre">renpy.Render</span></code></a>
object. The render object determines what, if anything, is
shown on the screen.</p>
<dl class="docutils">
<dt><cite>width</cite>, <cite>height</cite></dt>
<dd>The amount of space available to this displayable, in
pixels.</dd>
<dt><cite>st</cite></dt>
<dd>A float, the shown timebase, in seconds. The shown
timebase begins when this displayable is first shown
on the screen.</dd>
<dt><cite>at</cite></dt>
<dd>A float, the animation timebase, in seconds. The animation
timebase begins when an image with the same tag was shown,
without being hidden. (When the displayable is shown
without a tag, this is the same as the shown timebase.)</dd>
</dl>
<p>The render method is called when the displayable is first
shown. It can be called again if <a class="reference internal" href="#renpy.redraw" title="renpy.redraw"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.redraw()</span></code></a>
is called on this object.</p>
</dd></dl>
<dl class="method">
<dt id="renpy.Displayable.event">
<code class="descname">event</code><span class="sig-paren">(</span><em>self</em>, <em>ev</em>, <em>x</em>, <em>y</em>, <em>st</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Displayable.event" title="Permalink to this definition"> link</a></dt>
<dd><p>The event method is called to pass a pygame event to
the creator-defined displayable. If the event method returns
a value other than None, that value is returned as the result
of the interaction. If the event method returns None, the event
is passed on to other displayables.</p>
<p>To ignore the event without returning None, raise <a class="reference internal" href="#renpy.IgnoreEvent" title="renpy.IgnoreEvent"><code class="xref py py-class docutils literal notranslate"><span class="pre">renpy.IgnoreEvent</span></code></a>.</p>
<p>The event method exists on other displayables, allowing the
creator-defined displayable to pass on the event.</p>
<dl class="docutils">
<dt><cite>ev</cite></dt>
<dd>An <a class="reference external" href="http://www.pygame.org/docs/ref/event.html">event object</a></dd>
<dt><cite>x</cite>, <cite>y</cite></dt>
<dd>The x and y coordinates of the event, relative to the
upper-left corner of the displayable. These should
be used in preference to position information
found in the pygame event objects.</dd>
<dt><cite>st</cite></dt>
<dd>A float, the shown timebase, in seconds.</dd>
</dl>
<p>An event is generated at the start of each interaction, and
<a class="reference internal" href="#renpy.timeout" title="renpy.timeout"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.timeout()</span></code></a> can be used to cause another event to
occur.</p>
</dd></dl>
<dl class="method">
<dt id="renpy.Displayable.per_interact">
<code class="descname">per_interact</code><span class="sig-paren">(</span><em>self</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Displayable.per_interact" title="Permalink to this definition"> link</a></dt>
<dd><p>This method is called at the start of each interaction. It
can be used to trigger a redraw, and probably should be used
to trigger a redraw if the object participates in rollback.</p>
</dd></dl>
<dl class="method">
<dt id="renpy.Displayable.visit">
<code class="descname">visit</code><span class="sig-paren">(</span><em>self</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Displayable.visit" title="Permalink to this definition"> link</a></dt>
<dd><p>If the displayable has child displayables, this method should
be overridden to return a list of those displayables. This
ensures that the per_interact methods of those displayables
are called, and also allows images used by those displayables
to be predicted.</p>
</dd></dl>
</dd></dl>
</div>
<div class="section" id="renpy-render">
<h2>renpy.Render<a class="headerlink" href="#renpy-render" title="Permalink to this headline"> link</a></h2>
<p>Creator-defined displayables work with renpy.Render objects. Render
objects are returned by calling the <a class="reference internal" href="#renpy.render" title="renpy.render"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.render()</span></code></a> function on a
displayable. A creator-defined displayable should create a Render object
by calling <a class="reference internal" href="#renpy.Render" title="renpy.Render"><code class="xref py py-class docutils literal notranslate"><span class="pre">renpy.Render</span></code></a> from its render method.</p>
<p>Since the render object isn't intended to be subclassed, we will omit
the implicit <cite>self</cite> parameter.</p>
<dl class="class">
<dt id="renpy.Render">
<em class="property">class </em><code class="descclassname">renpy.</code><code class="descname">Render</code><span class="sig-paren">(</span><em>width</em>, <em>height</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Render" title="Permalink to this definition"> link</a></dt>
<dd><p>Creates a new Render object.</p>
<dl class="docutils">
<dt><cite>width</cite>, <cite>height</cite></dt>
<dd>The width and height of the render object, in pixels.</dd>
</dl>
<dl class="method">
<dt id="renpy.Render.blit">
<code class="descname">blit</code><span class="sig-paren">(</span><em>source</em>, <em>pos</em>, <em>main=True</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Render.blit" title="Permalink to this definition"> link</a></dt>
<dd><p>Draws another render object into this render object.</p>
<dl class="docutils">
<dt><cite>source</cite></dt>
<dd>The render object to draw.</dd>
<dt><cite>pos</cite></dt>
<dd>The location to draw into. This is an (x, y) tuple
with the coordinates being pixels relative to the
upper-left corner of the target render.</dd>
<dt><cite>main</cite></dt>
<dd>A keyword-only parameter. If true, <cite>source</cite> will be displayed
in the style inspector.</dd>
</dl>
</dd></dl>
<dl class="method">
<dt id="renpy.Render.place">
<code class="descname">place</code><span class="sig-paren">(</span><em>d</em>, <em>x=0</em>, <em>y=0</em>, <em>width=None</em>, <em>height=None</em>, <em>st=None</em>, <em>at=None</em>, <em>render=None</em>, <em>main=True</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Render.place" title="Permalink to this definition"> link</a></dt>
<dd><p>Renders <cite>d</cite> and places it into the rectangle defined by the <cite>x</cite>, <cite>y</cite>,
<cite>width</cite>, and <cite>height</cite>, using Ren'Py's standard placement algorithm.</p>
<dl class="docutils">
<dt><cite>x</cite>, <cite>y</cite>, <cite>width</cite>, <cite>height</cite></dt>
<dd>The rectangle to place in. If <cite>width</cite> or <cite>height</cite>, when None,
are the width and height of this render, respectively.</dd>
<dt><cite>st</cite>, <cite>at</cite></dt>
<dd>The times passed to Render. If None, defaults to the times
passed to the render method calling this method.</dd>
<dt><cite>render</cite></dt>
<dd>If not None, this is used instead of rendering <cite>d</cite>.</dd>
<dt><cite>main</cite></dt>
<dd>As for .blit().</dd>
</dl>
</dd></dl>
<dl class="method">
<dt id="renpy.Render.canvas">
<code class="descname">canvas</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Render.canvas" title="Permalink to this definition"> link</a></dt>
<dd><p>Returns a canvas object. A canvas object has methods
corresponding to the
<a class="reference external" href="http://www.pygame.org/docs/ref/draw.html">pygame.draw</a>
functions, with the first parameter (the surface) omitted.</p>
<p>Canvas objects also have a get_surface() method that returns the
pygame Surface underlying the canvas.</p>
</dd></dl>
<dl class="method">
<dt id="renpy.Render.get_size">
<code class="descname">get_size</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Render.get_size" title="Permalink to this definition"> link</a></dt>
<dd><p>Returns a (width, height) tuple giving the size of
this render.</p>
</dd></dl>
<dl class="method">
<dt id="renpy.Render.subsurface">
<code class="descname">subsurface</code><span class="sig-paren">(</span><em>rect</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Render.subsurface" title="Permalink to this definition"> link</a></dt>
<dd><p>Returns a render consisting of a rectangle cut out of this
render.</p>
<dl class="docutils">
<dt><cite>rect</cite></dt>
<dd>A (x, y, width, height) tuple.</dd>
</dl>
</dd></dl>
<dl class="method">
<dt id="renpy.Render.zoom">
<code class="descname">zoom</code><span class="sig-paren">(</span><em>xzoom</em>, <em>yzoom</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Render.zoom" title="Permalink to this definition"> link</a></dt>
<dd><p>Sets the zoom level of the children of this displayable in the
horitzontal and vertical axes. Only the children of the displayable
are zoomed the width, height, and blit coordinates are not zoomed.</p>
</dd></dl>
<p>The following attributes and methods are only used when model-based rendering
is enabled:</p>
<dl class="attribute">
<dt id="renpy.Render.mesh">
<code class="descname">mesh</code><a class="headerlink" href="#renpy.Render.mesh" title="Permalink to this definition"> link</a></dt>
<dd><p>This field enables model-based rendering for this Render. If true:</p>
<p>If set to True:</p>
<ul class="simple">
<li>All of the children of this displayable are rendered to textures.</li>
<li>A mesh the size of the first child is assocated with this displayable.</li>
<li>A model is created with the mesh, shaders, uniforms, and properties
associated with this Render.</li>
</ul>
<p>The model will then be drawn in a single operation.</p>
</dd></dl>
<dl class="method">
<dt id="renpy.Render.add_shader">
<code class="descname">add_shader</code><span class="sig-paren">(</span><em>shader</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Render.add_shader" title="Permalink to this definition"> link</a></dt>
<dd><p>This causes the shader part <cite>shader</cite> to be used when this Render
or its children are drawn. The part should be a string, or can be a
string beginning with &quot;-&quot; to prevent a shader from being drawn.</p>
</dd></dl>
<dl class="method">
<dt id="renpy.Render.add_uniform">
<code class="descname">add_uniform</code><span class="sig-paren">(</span><em>name</em>, <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Render.add_uniform" title="Permalink to this definition"> link</a></dt>
<dd><p>Causes the uniform <cite>name</cite> to have <cite>value</cite> when this Render or
its children are drawn.</p>
</dd></dl>
<dl class="method">
<dt id="renpy.Render.add_property">
<code class="descname">add_property</code><span class="sig-paren">(</span><em>name</em>, <em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.Render.add_property" title="Permalink to this definition"> link</a></dt>
<dd><p>Causes the GL property <cite>name</cite> to have <cite>value</cite> when this Render or
one of its children are drawn.</p>
</dd></dl>
</dd></dl>
</div>
<div class="section" id="utility-functions-and-classes">
<h2>Utility Functions and Classes<a class="headerlink" href="#utility-functions-and-classes" title="Permalink to this headline"> link</a></h2>
<dl class="function">
<dt id="renpy.displayable">
<code class="descclassname">renpy.</code><code class="descname">displayable</code><span class="sig-paren">(</span><em>d</em>, <em>scope=None</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.displayable" title="Permalink to this definition"> link</a></dt>
<dd><p>This takes <cite>d</cite>, which may be a displayable object or a string. If it's
a string, it converts that string into a displayable using the usual
rules.</p>
</dd></dl>
<dl class="function">
<dt id="renpy.end_interaction">
<code class="descclassname">renpy.</code><code class="descname">end_interaction</code><span class="sig-paren">(</span><em>value</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.end_interaction" title="Permalink to this definition"> link</a></dt>
<dd><p>If <cite>value</cite> is not None, immediately ends the current interaction, causing
the interaction to return <cite>value</cite>. If <cite>value</cite> is None, does nothing.</p>
<p>This can be called from inside the render and event methods of a
creator-defined displayable.</p>
</dd></dl>
<dl class="function">
<dt id="renpy.load_image">
<code class="descclassname">renpy.</code><code class="descname">load_image</code><span class="sig-paren">(</span><em>im</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.load_image" title="Permalink to this definition"> link</a></dt>
<dd><p>Loads the image manipulator <cite>im</cite> using the image cache, and returns a render.</p>
</dd></dl>
<dl class="function">
<dt id="renpy.load_surface">
<code class="descclassname">renpy.</code><code class="descname">load_surface</code><span class="sig-paren">(</span><em>im</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.load_surface" title="Permalink to this definition"> link</a></dt>
<dd><p>Loads the image manipulator <cite>im</cite> using the image cache, and returns a pygame Surface.</p>
</dd></dl>
<dl class="function">
<dt id="renpy.map_event">
<code class="descclassname">renpy.</code><code class="descname">map_event</code><span class="sig-paren">(</span><em>ev</em>, <em>keysym</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.map_event" title="Permalink to this definition"> link</a></dt>
<dd><p>Returns true if the pygame event <cite>ev</cite> matches <cite>keysym</cite></p>
<dl class="docutils">
<dt><cite>keysym</cite></dt>
<dd><p class="first">One of:</p>
<ul class="last simple">
<li>The name of a keybinding in <a class="reference internal" href="config.html#var-config.keymap"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.keymap</span></code></a>.</li>
<li>A keysym, as documented in the <a class="reference internal" href="keymap.html#keymap"><span class="std std-ref">Customizing the Keymap</span></a> section.</li>
<li>A list containing one or more keysyms.</li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="renpy.render">
<code class="descclassname">renpy.</code><code class="descname">render</code><span class="sig-paren">(</span><em>d</em>, <em>width</em>, <em>height</em>, <em>st</em>, <em>at</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.render" title="Permalink to this definition"> link</a></dt>
<dd><p>Causes a displayable to be rendered, and a renpy.Render object to
be returned.</p>
<dl class="docutils">
<dt><cite>d</cite></dt>
<dd>The displayable to render.</dd>
<dt><cite>width</cite>, <cite>height</cite></dt>
<dd>The width and height available for the displayable to render into.</dd>
<dt><cite>st</cite>, <cite>at</cite></dt>
<dd>The shown and animation timebases.</dd>
</dl>
<p>Renders returned by this object may be cached, and should not be modified
once they have been retrieved.</p>
</dd></dl>
<dl class="function">
<dt id="renpy.timeout">
<code class="descclassname">renpy.</code><code class="descname">timeout</code><span class="sig-paren">(</span><em>seconds</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.timeout" title="Permalink to this definition"> link</a></dt>
<dd><p>Causes an event to be generated before <cite>seconds</cite> seconds have elapsed.
This ensures that the event method of a user-defined displayable will be
called.</p>
</dd></dl>
<dl class="function">
<dt id="renpy.redraw">
<code class="descclassname">renpy.</code><code class="descname">redraw</code><span class="sig-paren">(</span><em>d</em>, <em>when</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.redraw" title="Permalink to this definition"> link</a></dt>
<dd><p>Causes the displayable <cite>d</cite> to be redrawn after <cite>when</cite> seconds have
elapsed.</p>
</dd></dl>
<dl class="exception">
<dt id="renpy.IgnoreEvent">
<em class="property">exception </em><code class="descclassname">renpy.</code><code class="descname">IgnoreEvent</code><a class="headerlink" href="#renpy.IgnoreEvent" title="Permalink to this definition"> link</a></dt>
<dd><p>This is an exception that, if raised, causes Ren'Py to ignore the
event. To raise this inside the event method, write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">raise</span> <span class="n">renpy</span><span class="o">.</span><span class="n">IgnoreEvent</span><span class="p">()</span>
</pre></div>
</div>
</dd></dl>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="container">
<p class="pull-right">
<a href="#">Back to top</a>
</p>
<p>
&copy; Copyright 2012-2022, Tom Rothamel.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.6.<br/>
</p>
</div>
</footer>
</body>
</html>