user-components.html 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. <!DOCTYPE html>
  2. <html class="writer-html5" lang="en" >
  3. <head>
  4. <meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>User Components &mdash; Phaser Editor 2D Help</title>
  7. <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
  8. <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
  9. <link rel="stylesheet" href="../_static/css/custom.css" type="text/css" />
  10. <link rel="shortcut icon" href="../_static/icon.png"/>
  11. <!--[if lt IE 9]>
  12. <script src="../_static/js/html5shiv.min.js"></script>
  13. <![endif]-->
  14. <script src="../_static/jquery.js?v=5d32c60e"></script>
  15. <script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
  16. <script src="../_static/documentation_options.js?v=a1f35292"></script>
  17. <script src="../_static/doctools.js?v=888ff710"></script>
  18. <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
  19. <script src="../_static/js/theme.js"></script>
  20. <link rel="index" title="Index" href="../genindex.html" />
  21. <link rel="search" title="Search" href="../search.html" />
  22. <link rel="next" title="Create a new User Components file" href="user-components-create-file.html" />
  23. <link rel="prev" title="ScriptNode’s properties" href="script-node-properties.html" />
  24. </head>
  25. <body class="wy-body-for-nav">
  26. <div class="wy-grid-for-nav">
  27. <nav data-toggle="wy-nav-shift" class="wy-nav-side">
  28. <div class="wy-side-scroll">
  29. <div class="wy-side-nav-search" style="background: #343131" >
  30. <a href="../index.html" class="icon icon-home">
  31. Phaser Editor 2D
  32. <img src="../_static/logo.png" class="logo" alt="Logo"/>
  33. </a>
  34. <div class="version">
  35. v3.67.0
  36. </div>
  37. <div role="search">
  38. <form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
  39. <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
  40. <input type="hidden" name="check_keywords" value="yes" />
  41. <input type="hidden" name="area" value="default" />
  42. </form>
  43. </div>
  44. </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
  45. <ul class="current">
  46. <li class="toctree-l1"><a class="reference internal" href="../intro/index.html">Introduction</a></li>
  47. <li class="toctree-l1"><a class="reference internal" href="../first-steps/index.html">First steps</a></li>
  48. <li class="toctree-l1"><a class="reference internal" href="../workbench/index.html">Workbench</a></li>
  49. <li class="toctree-l1"><a class="reference internal" href="../asset-pack-editor/index.html">Asset Pack Editor</a></li>
  50. <li class="toctree-l1 current"><a class="reference internal" href="index.html">Scene Editor</a><ul class="current">
  51. <li class="toctree-l2"><a class="reference internal" href="create-new-scene-file.html">Create a new Scene file</a></li>
  52. <li class="toctree-l2"><a class="reference internal" href="add-object.html">Adding an object to the scene</a></li>
  53. <li class="toctree-l2"><a class="reference internal" href="inspector-view.html">Inspector view</a></li>
  54. <li class="toctree-l2"><a class="reference internal" href="game-objects.html">Game Object types</a></li>
  55. <li class="toctree-l2"><a class="reference internal" href="scene-properties.html">Scene properties</a></li>
  56. <li class="toctree-l2"><a class="reference internal" href="arcade-physics.html">Arcade Physics</a></li>
  57. <li class="toctree-l2"><a class="reference internal" href="sprite-animations.html">Sprite animations</a></li>
  58. <li class="toctree-l2"><a class="reference internal" href="spine-animations.html">Spine animations</a></li>
  59. <li class="toctree-l2"><a class="reference internal" href="shader-effects.html">Shader Effects</a></li>
  60. <li class="toctree-l2"><a class="reference internal" href="working-with-parent-objects.html">Working with parent objects</a></li>
  61. <li class="toctree-l2"><a class="reference internal" href="object-list.html">Object List</a></li>
  62. <li class="toctree-l2"><a class="reference internal" href="input.html">Input</a></li>
  63. <li class="toctree-l2"><a class="reference internal" href="prefabs.html">Prefabs</a></li>
  64. <li class="toctree-l2"><a class="reference internal" href="script-node.html">Script Nodes</a></li>
  65. <li class="toctree-l2 current"><a class="current reference internal" href="#">User Components</a><ul>
  66. <li class="toctree-l3"><a class="reference internal" href="user-components-create-file.html">Create a new User Components file</a></li>
  67. <li class="toctree-l3"><a class="reference internal" href="user-components-editor.html">User Components Editor</a></li>
  68. <li class="toctree-l3"><a class="reference internal" href="user-components-compiler.html">The User Components compiler</a></li>
  69. <li class="toctree-l3"><a class="reference internal" href="user-components-start-update-methods.html">Implementing behaviors with the Phaser events</a></li>
  70. <li class="toctree-l3"><a class="reference internal" href="user-components-super-class.html">A base class for your components</a></li>
  71. <li class="toctree-l3"><a class="reference internal" href="user-components-awake-event.html">The awake event</a></li>
  72. <li class="toctree-l3"><a class="reference internal" href="user-components-instancing.html">Adding User Components to a Game Object</a></li>
  73. <li class="toctree-l3"><a class="reference internal" href="user-components-in-prefab-object.html">Adding User Components to a Prefab</a></li>
  74. </ul>
  75. </li>
  76. <li class="toctree-l2"><a class="reference internal" href="manipulation-tools.html">Manipulation tools</a></li>
  77. <li class="toctree-l2"><a class="reference internal" href="layout-tools.html">Layout tools</a></li>
  78. <li class="toctree-l2"><a class="reference internal" href="scene-compiler.html">The scene compiler</a></li>
  79. <li class="toctree-l2"><a class="reference internal" href="misc.html">Miscellaneous</a></li>
  80. <li class="toctree-l2"><a class="reference internal" href="troubleshooting.html">Troubleshooting</a></li>
  81. </ul>
  82. </li>
  83. <li class="toctree-l1"><a class="reference internal" href="../code-editor/index.html">Code Editor</a></li>
  84. <li class="toctree-l1"><a class="reference internal" href="../animations-editor/index.html">Animations Editor</a></li>
  85. <li class="toctree-l1"><a class="reference internal" href="../atlas-editor/index.html">Atlas Editor</a></li>
  86. <li class="toctree-l1"><a class="reference internal" href="../misc/index.html">Miscellaneous</a></li>
  87. <li class="toctree-l1"><a class="reference internal" href="../pricing/index.html">License and pricing</a></li>
  88. </ul>
  89. </div>
  90. </div>
  91. </nav>
  92. <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
  93. <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
  94. <a href="../index.html">Phaser Editor 2D</a>
  95. </nav>
  96. <div class="wy-nav-content">
  97. <div class="rst-content">
  98. <div role="navigation" aria-label="Page navigation">
  99. <ul class="wy-breadcrumbs">
  100. <li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
  101. <li class="breadcrumb-item"><a href="index.html">Scene Editor</a></li>
  102. <li class="breadcrumb-item active">User Components</li>
  103. <li class="wy-breadcrumbs-aside">
  104. </li>
  105. </ul>
  106. <hr/>
  107. </div>
  108. <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
  109. <div itemprop="articleBody">
  110. <section id="user-components">
  111. <h1>User Components<a class="headerlink" href="#user-components" title="Link to this heading"></a></h1>
  112. <div class="toctree-wrapper compound">
  113. <ul>
  114. <li class="toctree-l1"><a class="reference internal" href="user-components-create-file.html">Create a new User Components file</a></li>
  115. <li class="toctree-l1"><a class="reference internal" href="user-components-editor.html">User Components Editor</a></li>
  116. <li class="toctree-l1"><a class="reference internal" href="user-components-compiler.html">The User Components compiler</a></li>
  117. <li class="toctree-l1"><a class="reference internal" href="user-components-start-update-methods.html">Implementing behaviors with the Phaser events</a></li>
  118. <li class="toctree-l1"><a class="reference internal" href="user-components-super-class.html">A base class for your components</a></li>
  119. <li class="toctree-l1"><a class="reference internal" href="user-components-awake-event.html">The awake event</a></li>
  120. <li class="toctree-l1"><a class="reference internal" href="user-components-instancing.html">Adding User Components to a Game Object</a></li>
  121. <li class="toctree-l1"><a class="reference internal" href="user-components-in-prefab-object.html">Adding User Components to a Prefab</a></li>
  122. </ul>
  123. </div>
  124. <p>A Component is a <a class="reference external" href="https://gameprogrammingpatterns.com/component.html">design pattern</a> that you can use to create reusable code and extend the behavior and data of a game object, using <a class="reference external" href="https://en.wikipedia.org/wiki/Composition_over_inheritance">composition over inheritance</a>.</p>
  125. <p>For example, an <strong>HorizontalMove</strong> component can be added to any kind of enemy object that moves horizontally from one position to another. This component class can be written more or less like this (see the <a class="reference external" href="../scene-editor/user-components-compiler.html">User Components compiler</a> section for a real example):</p>
  126. <div class="highlight-javascript notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="nx">HorizontalMove</span><span class="w"> </span><span class="p">{</span>
  127. <span class="w"> </span><span class="kr">constructor</span><span class="p">(</span><span class="nx">gameObject</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
  128. <span class="w"> </span><span class="c1">// in the component, keep a reference to the entity</span>
  129. <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">gameObject</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">gameObject</span><span class="p">;</span>
  130. <span class="w"> </span><span class="c1">// in the entity, keep a reference (&#39;horizontalMove&#39;) to the component</span>
  131. <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">gameObject</span><span class="p">.</span><span class="nx">horizontalMove</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">;</span>
  132. <span class="w"> </span><span class="c1">// init properties with default values</span>
  133. <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">minX</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span>
  134. <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">maxX</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">800</span><span class="p">;</span>
  135. <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">horizVelocity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">10</span><span class="p">;</span>
  136. <span class="w"> </span><span class="p">}</span>
  137. <span class="w"> </span><span class="nx">start</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
  138. <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">gameObject</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">velocity</span><span class="p">.</span><span class="nx">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">horizVelocity</span><span class="p">;</span>
  139. <span class="w"> </span><span class="p">}</span>
  140. <span class="w"> </span><span class="nx">update</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
  141. <span class="w"> </span><span class="c1">// the behavior of the component</span>
  142. <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">velocity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">gameObject</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">velocity</span><span class="p">;</span>
  143. <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">gameObject</span><span class="p">.</span><span class="nx">x</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">minX</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
  144. <span class="w"> </span><span class="nx">velocity</span><span class="p">.</span><span class="nx">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">horizVelocity</span><span class="p">);</span>
  145. <span class="w"> </span><span class="p">}</span>
  146. <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">gameObject</span><span class="p">.</span><span class="nx">x</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">maxX</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
  147. <span class="w"> </span><span class="nx">velocity</span><span class="p">.</span><span class="nx">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">horizVelocity</span><span class="p">);</span>
  148. <span class="w"> </span><span class="p">}</span>
  149. <span class="w"> </span><span class="p">}</span>
  150. <span class="p">}</span>
  151. </pre></div>
  152. </div>
  153. <p>In the scene, you can create objects and add the <strong>HorizontalMove</strong> component to them. Then, update the components at every game loop step:</p>
  154. <div class="highlight-javascript notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="nx">Level</span><span class="w"> </span><span class="k">extends</span><span class="w"> </span><span class="nx">Phaser</span><span class="p">.</span><span class="nx">Scene</span><span class="w"> </span><span class="p">{</span>
  155. <span class="w"> </span><span class="nx">create</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
  156. <span class="w"> </span><span class="c1">// create two objects, alien and spider, and add the HorizontalMove</span>
  157. <span class="w"> </span><span class="c1">// component to both, but with different property values.</span>
  158. <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">alien</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">add</span><span class="p">.</span><span class="nx">sprite</span><span class="p">(</span><span class="mf">10</span><span class="p">,</span><span class="w"> </span><span class="mf">10</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;enemies&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;alien&quot;</span><span class="p">);</span>
  159. <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">alienMove</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">HorizontalMove</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">alien</span><span class="p">);</span>
  160. <span class="w"> </span><span class="nx">alienMove</span><span class="p">.</span><span class="nx">minX</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">10</span><span class="p">;</span>
  161. <span class="w"> </span><span class="nx">alienMove</span><span class="p">.</span><span class="nx">maxX</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">100</span><span class="p">;</span>
  162. <span class="w"> </span><span class="nx">alienMove</span><span class="p">.</span><span class="nx">horizVelocity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">40</span><span class="p">;</span>
  163. <span class="w"> </span><span class="nx">alienMove</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
  164. <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">spider</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">add</span><span class="p">.</span><span class="nx">sprite</span><span class="p">(</span><span class="mf">80</span><span class="p">,</span><span class="w"> </span><span class="mf">100</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;enemies&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;spider&quot;</span><span class="p">);</span>
  165. <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">spiderMove</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">HorizontalMove</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">spider</span><span class="p">);</span>
  166. <span class="w"> </span><span class="nx">spiderMove</span><span class="p">.</span><span class="nx">minX</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">50</span><span class="p">;</span>
  167. <span class="w"> </span><span class="nx">spiderMove</span><span class="p">.</span><span class="nx">maxX</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">200</span><span class="p">;</span>
  168. <span class="w"> </span><span class="nx">spiderMove</span><span class="p">.</span><span class="nx">horizVelocity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="mf">20</span><span class="p">;</span>
  169. <span class="w"> </span><span class="nx">spiderMove</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
  170. <span class="w"> </span><span class="p">}</span>
  171. <span class="w"> </span><span class="nx">update</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
  172. <span class="w"> </span><span class="c1">// update the HorizontalMove component of each object</span>
  173. <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">alien</span><span class="p">.</span><span class="nx">horizontalMove</span><span class="p">.</span><span class="nx">update</span><span class="p">();</span>
  174. <span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">spider</span><span class="p">.</span><span class="nx">horizontalMove</span><span class="p">.</span><span class="nx">update</span><span class="p">();</span>
  175. <span class="w"> </span><span class="c1">// in a real case, the component can register</span>
  176. <span class="w"> </span><span class="c1">// a listener to the UPDATE event of the scene.</span>
  177. <span class="w"> </span><span class="p">}</span>
  178. <span class="p">}</span>
  179. </pre></div>
  180. </div>
  181. <p>In <a class="reference external" href="https://phasereditor2d.com">Phaser Editor 2D</a>, we provide a way to create game object components (we name it <strong>User Components</strong>, to make a difference with the built-in Phaser components) and use them in the <a class="reference external" href="../scene-editor/index.html">Scene Editor</a>. The <a class="reference external" href="../scene-editor/prefabs.html">prefabs</a> system is another way to create reusable behaviors and data but has the limitation that it uses inheritance.</p>
  182. <p>Like the <a class="reference external" href="../scene-editor/index.html">Scene Editor</a>, we provide a <a class="reference external" href="../scene-editor/user-components-editor.html">User Components Editor</a>.</p>
  183. <p>The <a class="reference external" href="../scene-editor/user-components-editor.html">User Components Editor</a> allows you to create User Components configuration files. A User Components configuration file (<code class="docutils literal notranslate"><span class="pre">*.components</span></code>) contains a list of component configurations that are compiled into JavaScript (or TypeScript) code. It is pretty similar to the <a class="reference external" href="../scene-editor/scene-compiler.html">scene compiler</a>.</p>
  184. </section>
  185. </div>
  186. </div>
  187. <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
  188. <a href="script-node-properties.html" class="btn btn-neutral float-left" title="ScriptNode’s properties" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
  189. <a href="user-components-create-file.html" class="btn btn-neutral float-right" title="Create a new User Components file" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
  190. </div>
  191. <hr/>
  192. <div role="contentinfo">
  193. <p>&#169; Copyright 2016-2024, Arian Fornaris.</p>
  194. </div>
  195. Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
  196. <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
  197. provided by <a href="https://readthedocs.org">Read the Docs</a>.
  198. </footer>
  199. </div>
  200. </div>
  201. </section>
  202. </div>
  203. <script>
  204. jQuery(function () {
  205. SphinxRtdTheme.Navigation.enable(true);
  206. });
  207. </script>
  208. <!-- Theme Analytics -->
  209. <script async src="https://www.googletagmanager.com/gtag/js?id=UA-67206336-2"></script>
  210. <script>
  211. window.dataLayer = window.dataLayer || [];
  212. function gtag(){dataLayer.push(arguments);}
  213. gtag('js', new Date());
  214. gtag('config', 'UA-67206336-2', {
  215. 'anonymize_ip': false,
  216. });
  217. </script>
  218. </body>
  219. </html>