user-components-awake-event.html 20 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>The awake event &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="Adding User Components to a Game Object" href="user-components-instancing.html" />
  23. <link rel="prev" title="A base class for your components" href="user-components-super-class.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="reference internal" href="user-components.html">User Components</a><ul class="current">
  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 current"><a class="current reference internal" href="#">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"><a href="user-components.html">User Components</a></li>
  103. <li class="breadcrumb-item active">The awake event</li>
  104. <li class="wy-breadcrumbs-aside">
  105. </li>
  106. </ul>
  107. <hr/>
  108. </div>
  109. <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
  110. <div itemprop="articleBody">
  111. <section id="the-awake-event">
  112. <h1>The awake event<a class="headerlink" href="#the-awake-event" title="Link to this heading"></a></h1>
  113. <p>We propose using <a class="reference external" href="https://phaser.io">Phaser</a> events for implementing the User Components behaviors. However, the events provided in <a class="reference external" href="https://phaser.io">Phaser</a> are not enough. When you create a component, all properties are set with the default values. Then, you set the value of each property. However, maybe you want to perform a custom initialization routine after all properties are set.</p>
  114. <p>Looking into the <a class="reference external" href="https://phaser.io">Phaser</a> events, you can do it in the first scene’s update. It means you can listen once for the <strong>UPDATE</strong> event and run the initialization routine. It may work in many cases. But maybe, you want to run this routine just after all properties are set, and before the game starts the update loop.</p>
  115. <p>For this reason, the <a class="reference external" href="../scene-editor/scene-compiler.html">scene compiler</a> generates code for emitting a custom event, the <code class="docutils literal notranslate"><span class="pre">scene-awake</span></code> event, just after it generates the code that creates the objects in the scene, and all their properties are set:
  116. .. code:</p>
  117. <div class="highlight-javascript notranslate"><div class="highlight"><pre><span></span><span class="c1">// code generated by the compiler:</span>
  118. <span class="nx">editorCreate</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
  119. <span class="w"> </span><span class="c1">// creates the game object</span>
  120. <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">dino</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">image</span><span class="p">(</span><span class="mf">400</span><span class="p">,</span><span class="w"> </span><span class="mf">240</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;FufuSuperDino&quot;</span><span class="p">);</span>
  121. <span class="w"> </span><span class="c1">// creates the PushOnClick component</span>
  122. <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">dinoPushOnClick</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">PushOnClick</span><span class="p">(</span><span class="nx">dino</span><span class="p">);</span>
  123. <span class="w"> </span><span class="c1">// sets the component&#39;s properties</span>
  124. <span class="w"> </span><span class="nx">dinoPushOnClick</span><span class="p">.</span><span class="nx">pushDelay</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">500</span><span class="p">;</span>
  125. <span class="w"> </span><span class="c1">// emit the scene-awake event, after all objects are created</span>
  126. <span class="w"> </span><span class="c1">// and all properties are set</span>
  127. <span class="w"> </span><span class="nx">dino</span><span class="p">.</span><span class="nx">emit</span><span class="p">(</span><span class="s2">&quot;scene-awake&quot;</span><span class="p">);</span>
  128. <span class="p">}</span>
  129. </pre></div>
  130. </div>
  131. <p>When you implement a component, you can register a listener on the <strong>scene-awake</strong> event:</p>
  132. <div class="highlight-javascript notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="nx">PushOnClick</span><span class="w"> </span><span class="p">{</span>
  133. <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>
  134. <span class="w"> </span><span class="p">...</span>
  135. <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>
  136. <span class="w"> </span><span class="nx">gameObject</span><span class="p">.</span><span class="nx">scene</span><span class="p">.</span><span class="nx">events</span><span class="p">.</span><span class="nx">once</span><span class="p">(</span><span class="s2">&quot;scene-awake&quot;</span><span class="p">,</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">{</span>
  137. <span class="w"> </span><span class="c1">// I register a &quot;pointerdown&quot;</span>
  138. <span class="w"> </span><span class="c1">// event for &quot;animating&quot; the game object</span>
  139. <span class="w"> </span><span class="c1">// with a push effect</span>
  140. <span class="w"> </span><span class="c1">// I set a pixel perfect handler</span>
  141. <span class="w"> </span><span class="c1">// with certain alpha-tolerance</span>
  142. <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">handler</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">scene</span><span class="p">.</span><span class="nx">input</span>
  143. <span class="w"> </span><span class="p">.</span><span class="nx">makePixelPerfect</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">alphaTolerance</span><span class="p">);</span>
  144. <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">setInteractive</span><span class="p">(</span><span class="nx">handler</span><span class="p">)</span>
  145. <span class="w"> </span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;pointerdown&quot;</span><span class="p">,</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">{</span>
  146. <span class="w"> </span><span class="c1">// animate the object with the push effect</span>
  147. <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">scene</span><span class="p">.</span><span class="nx">add</span><span class="p">.</span><span class="nx">tween</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="w"> </span><span class="p">}</span>
  151. <span class="w"> </span><span class="cm">/** @type {number} **/</span>
  152. <span class="w"> </span><span class="nx">alphaTolerance</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">100</span><span class="p">;</span>
  153. <span class="p">}</span>
  154. </pre></div>
  155. </div>
  156. <p>In the section <a class="reference external" href="./user-components-super-class.html">A base class for your components</a>), we explain how you can use a common super-class for all the components. It simplifies the listening of <a class="reference external" href="https://phaser.io">Phaser</a> events, and it also includes the <strong>scene-awake</strong> event. So you can rewrite the previous <strong>PushOnClick</strong> component in this way:</p>
  157. <div class="highlight-javascript notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="nx">PushOnClick</span><span class="w"> </span><span class="k">extends</span><span class="w"> </span><span class="nx">UserComponent</span><span class="w"> </span><span class="p">{</span>
  158. <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>
  159. <span class="w"> </span><span class="k">super</span><span class="p">(</span><span class="nx">gameObject</span><span class="p">);</span>
  160. <span class="w"> </span><span class="p">}</span>
  161. <span class="w"> </span><span class="nx">awake</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
  162. <span class="w"> </span><span class="c1">// Instead of registering a scene-awake event listener</span>
  163. <span class="w"> </span><span class="c1">// you can override this method.</span>
  164. <span class="w"> </span><span class="p">...</span>
  165. <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">setInteractive</span><span class="p">(...)</span>
  166. <span class="w"> </span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;pointerdown&quot;</span><span class="p">,</span><span class="w"> </span><span class="p">...);</span>
  167. <span class="w"> </span><span class="p">...</span>
  168. <span class="w"> </span><span class="p">}</span>
  169. <span class="w"> </span><span class="p">...</span>
  170. <span class="p">}</span>
  171. </pre></div>
  172. </div>
  173. <p>The <code class="docutils literal notranslate"><span class="pre">scene-awake</span></code> event is emitted in the <code class="docutils literal notranslate"><span class="pre">editorCreate()</span></code> method of a scene. So, if you create a new component and this component listens to the <code class="docutils literal notranslate"><span class="pre">scene-awake</span></code> event, then you should emit that event manually:</p>
  174. <div class="highlight-javascript notranslate"><div class="highlight"><pre><span></span><span class="kd">const</span><span class="w"> </span><span class="nx">comp</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">PushOnClick</span><span class="p">(</span><span class="nx">someSprite</span><span class="p">);</span>
  175. <span class="nx">comp</span><span class="p">.</span><span class="nx">alphaTolerance</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">50</span><span class="p">;</span>
  176. <span class="c1">// emit the awake event so the component can be notified</span>
  177. <span class="k">this</span><span class="p">.</span><span class="nx">events</span><span class="p">.</span><span class="nx">emit</span><span class="p">(</span><span class="s2">&quot;scene-awake&quot;</span><span class="p">);</span>
  178. </pre></div>
  179. </div>
  180. <p>Emitting the <code class="docutils literal notranslate"><span class="pre">scene-awake</span></code> event later in the game is safe because components and <a class="reference external" href="../scene-editor/prefabs.html">prefabs</a> handle this event only once in their lifetime.</p>
  181. <p>The <a class="reference external" href="../scene-editor/prefabs.html">prefabs</a> also listens to the <code class="docutils literal notranslate"><span class="pre">scene-awake</span></code> event. <a class="reference external" href="./prefab-user-properties-initializing.html#the-scene-awake-event">Learn more about it</a>.</p>
  182. </section>
  183. </div>
  184. </div>
  185. <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
  186. <a href="user-components-super-class.html" class="btn btn-neutral float-left" title="A base class for your components" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
  187. <a href="user-components-instancing.html" class="btn btn-neutral float-right" title="Adding User Components to a Game Object" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
  188. </div>
  189. <hr/>
  190. <div role="contentinfo">
  191. <p>&#169; Copyright 2016-2024, Arian Fornaris.</p>
  192. </div>
  193. Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
  194. <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
  195. provided by <a href="https://readthedocs.org">Read the Docs</a>.
  196. </footer>
  197. </div>
  198. </div>
  199. </section>
  200. </div>
  201. <script>
  202. jQuery(function () {
  203. SphinxRtdTheme.Navigation.enable(true);
  204. });
  205. </script>
  206. <!-- Theme Analytics -->
  207. <script async src="https://www.googletagmanager.com/gtag/js?id=UA-67206336-2"></script>
  208. <script>
  209. window.dataLayer = window.dataLayer || [];
  210. function gtag(){dataLayer.push(arguments);}
  211. gtag('js', new Date());
  212. gtag('config', 'UA-67206336-2', {
  213. 'anonymize_ip': false,
  214. });
  215. </script>
  216. </body>
  217. </html>