tag:blogger.com,1999:blog-47812739019100414752023-11-15T22:10:44.634-08:00AndEngine from ScratchAngelhttp://www.blogger.com/profile/01073241333005135564noreply@blogger.comBlogger10125tag:blogger.com,1999:blog-4781273901910041475.post-21629454921397091212012-04-27T10:33:00.002-07:002012-04-27T10:33:24.440-07:00Blog StatusHello everyone.
I'm finishing my web page. When the job is done (a week or so) and Nicholas publish the GLES2 version of andengine (he makes a promise that the api would not suffer so much changes), i would rewrite all the tutorials with the GLES2 version of andengine. I will publish here and in my webpage all the series of the tutorial. And i will continue with series.
If someone is interested in helping me... please put in contact with me. I would be very pleased.
Thank you all.Angelhttp://www.blogger.com/profile/01073241333005135564noreply@blogger.com2tag:blogger.com,1999:blog-4781273901910041475.post-31286694383293096322011-12-05T13:42:00.000-08:002011-12-05T13:42:48.032-08:00AndEngine Quick Start Guide<h2>Prerequisites</h2><br />
<p>You must have <a href="http://www.eclipse.org" target="_blank">Eclipse</a> and <a href="http://developer.android.com/sdk/index.html" target="_blank">Android SDK</a> already installed.</p><br />
<p>First of all we need the <a href="http://cbes.javaforge.com/project/HGE" target="_blank">Mercurial plug-in</a> installed. Go in Eclipse to Help -> Install New Software, and install from http://cbes.javaforge.com/update.</p><br />
<div class="separator" style="clear: both; text-align: center;"><br />
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0gycn7eaBibq2BxXOC7rOPRZwA27TwTaiKDxOi_beWF5nxXJuBHVPyD6bMvns6WCO25OIRxeY5fzH5kPwP5gbW0tuS6AuD5fKiDtMgxnqYIi2pbH9sRzeXyyB6og4skbGLzlZ7dpEkAU/s1600/pantalla1.png" /></div><br />
<br />
<br />
<h2>Getting AndEngine Sources</h2><br />
<p>To get AndEngine sources in eclipse, go to File -> Import in the Eclipse menu.</p><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheykPNNgelzhggKhvYLWxa2iJXYTrWBgr2RBkdQcXiMzKaRaFO9-RA3iwuG8Y3OxuaIlxvlGGLn6P5oBTJuRShjWSc-UeZnzlcDthZUBLq2L2mKQCNH2A75VkRKJKqu-6mh8VEl3uk_yY/s1600/pantalla2.png" /></div><br />
<br />
<br />
<br />
<p>Then select "Close existing Mercurial Respository"</p><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiIk4Azsida6SC_5gG-8wfJD0wLs0yv1qwVIQfUiBl5PpJKmfjSYiLm7ohnFmu-oZisB1IL_hjd8XKks5Hp8iN1MUA9H78wIpa_iapfK8LuE6cnjsFM3lUELrX64IWupluGFvJ8Vwzu_I/s1600/pantalla3.png" /></div><br />
<br />
<br />
<br />
<p>In Repository Location put https://code.google.com/p/andengine/ and click Next</p><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM6fv9Xt4Q831891ylayiLa4vTVZergmeOzgTBMTUh4uBGuO9cUnKyo5W3oEucV-fVjZve_r4MmY0eQndgGchazsYiDrrTE4wBVotihWfuEZtR4Kzbnf_rJZAXZCI5-uuCDXb-B_2qc6U/s1600/pantalla4.png" /></div><br />
<br />
<br />
<p>Click Next Again. and Finish. My Eclipse looks like this:</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOsmBLyo0WN1Fq68kuBUBgmfIFsV4lVlePh6GNET-W-I4say-sL2fhZHEQZV6iGbtCYeOdVdLTK0OKaoBrSmHqqDnqbO44x_VY36YkCx5JYL2jUlLPINzWFlHQbt6xnvdKGyeUADpZj7Y/s1600/pantalla5.png" /></div><br />
<br />
<br />
<br />
<p>Then we have some errors in the Eclipse proyect. To solve this you need to do two things.</p><br />
<br />
<br />
<br />
<br />
<p>Right click on AndEngine Proyect and go to properties.</p><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTC4Ztv-4XWeJFYirAmdv285pOou2iG6idUrtrChgp3Mlqk7O2M8oNsvxyj-myAdpuL4Rq4EDmUFM1c8uEBLfeYpN-QkKSxJ8JrIGjcjoojGYyCsCq1OB2gkZ5H1oZG7ku1S195zArddA/s1600/pantalla8.png" /></div><br />
<br />
<p>In the left side choose Java Compiler and make sure that Enable project specific settings and 1.6 in the compilance level is clicked.</p><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFunxxFKBh0_zVtL8S9dPMmaTJZ8EmsZPKsVSq8RcashErE4RPkadlVj2pvagpdW5T8puEEuleU3UgiIgbIntv40UeywbkOX76x8H73RsNCiDtRxFiSu3WSB1En7lS228Q-237NYVmS3A/s1600/pantalla9.png" /></div><br />
<br />
<br />
<p>Right click on the AndEngine proyect and go to Android Tools -> Fix project properties.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK0xlghaqL9Es8TSDAgtV-iLaMHWcaouSWYCJW3dQlWKz49J9-U1WdCjWHnufLzZJ1xKg4VzPKcv33JLjftqGuT3oEdMxu3aQvwCJfZ0sFgkNiuZ3WdpSaCeQ_VR5cB4miZLrXnyX2Hzg/s1600/pantalla10.png" /></div><br />
<br />
<br />
<br />
<p>New we have a clean AndEngine sources installed.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAUQoxMiGFlOOSAK27a5WWrigbm-GjaSLssvn4Pei8BQVmihIirbjyxkFpou-eqsw9lTRSfOWpDyGKqLTCFjkBlsO4UiioBL5en_teWBgLdRVumwUrfSZrg6ASFH2osyaqkVKG3dM-OlY/s1600/pantalla11.png" /></div><br />
<br />
<br />
<br />
<p>We must get now all the extensions for AndEngine. Repeat the same process with these urls<br />
<br />
<ul><li>https://code.google.com/p/andenginelivewallpaperextension</li>
<li>https://code.google.com/p/andenginemodplayerextension</li>
<li>https://code.google.com/p/andenginemultiplayerextension</li>
<li>https://code.google.com/p/andenginemultitouchextension</li>
<li>https://code.google.com/p/andenginephysicsbox2dextension</li>
<li>https://code.google.com/p/andengineaugmentedrealityextension</li>
<li>https://code.google.com/p/andenginesvgtextureregionextension</li>
<li>https://code.google.com/p/andenginetexturepackerextension</li>
</ul></p><br />
<h2>Congratulations</h2><br />
<br />
<p>We have now a clean installation of AndEngine totally updated. In the next weeks i will update all the series of the tutorials to the last version of AndEngine.</p>Angelhttp://www.blogger.com/profile/01073241333005135564noreply@blogger.com0tag:blogger.com,1999:blog-4781273901910041475.post-18352275939175919392011-08-06T08:33:00.000-07:002011-08-06T08:34:18.312-07:00[Off-Topic] :First Game releasedMy first game is on market!!!<br />
<br />
<br />
<a href="https://market.android.com/details?id=com.chorragames.math"><br />
Math Monkey!!</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAu0nRuNpKt-2Qo4gfX4vplbLc3qElL8YBCATVL3RtVrEDf6X39ohkvSvpyd3o_iNpUYBNw_biYTRBLXMrfEewmLUXGKXiubcjbNzYD8SdtTCz3_Cipcf1wswxWmijfyGPYC2r-4-K0Tg/s1600/qrcode.png" /></div><br />
Please post any comments.Angelhttp://www.blogger.com/profile/01073241333005135564noreply@blogger.com2tag:blogger.com,1999:blog-4781273901910041475.post-22891121173901606852011-06-11T19:01:00.000-07:002011-06-11T19:01:41.304-07:00Off-Topic Article: How to stay up to date in andengine<h2>Getting the sources of AndEngine</h2><br />
<p>First of all we need to get the sources. We need to get the sources of <a target="_new" href="http://www.andengine.org/">andengine</a>. For that you will need any <a target="_new" href="http://mercurial.selenic.com/downloads/">Mercurial Client</a>.<br />
</p><br />
<p>In my case (debian) "apt-get install mercurial", in ubuntu it may work well. If you use windows, try with the links in the mercurial page. Now we need to create a directory, open a terminal, go to that folder and write this:<br />
</p><br />
<div class="bash">hg clone https://andengine.googlecode.com/hg/ andengine</div><br />
<p>I have an output like this:<br />
requesting all changes<br />
adding changesets<br />
adding manifests<br />
adding file changes<br />
added 818 changesets with 3243 changes to 703 files (+4 heads)<br />
updating to branch default<br />
410 files updated, 0 files merged, 0 files removed, 0 files unresolved<br />
</p><br />
<p>Congratulations, our first step to have our own andengine.jar is completed</p><br />
<h2>Importing sources in android</h2><br />
<p>In the Eclipse menu, we go to File -> Import </p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixucEEGQ77kH8kfwNad-dTnWrTusOEeMDrV-NLLZO0yO5o20YB_2uIVeDn62tCWWG1JKq1zqXcE2U1bYik4hqU3yEdxVJXzrU_7lEhnFbvDyHCuwCZ95cp7rI2BCSBNoFt3Zvg52qAKqg/s1600/101.png" /></div><br />
<p>We select "Existing Projects into Workspace" and press Next. Now in "Select root directory" we need to browse to the directory when we downloaded the sources of andEngine. In my case looks like that.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgioRnsiFCr8ThsR013wFUK7V5-_Kmm7-S61tUxZxiInijsJPW9MsH51dn_wciHFCelcSE7pItx4w0GMj7-1JJ5J3EQq1rIdptFJbJLnKg7szUMhFf0kRsLA91V1XPe5lwezfd6AAOz330/s1600/102.png" /></div><br />
<p>If you have done all the steps correctly, in Projects you must see AndEngine checked. Click Finish.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis22sVDkzrK6gqVVPO4toqHGwl6LKvlj0a289e7XSow50xXKkeIjsnyXA16Gp3TkqkaX8ScQ-YNMSkJaVi6NYggU-hDhf-AsF9cr9Z2elCq-k7ehd3qiR1Z12TATbpNZU2PLws3AMnVgY/s1600/103.png" /></div><br />
<p>Now we have the project inside Eclipse, but it appears some erors.</p><br />
<h2>Fixing some errors</h2><br />
<p>Once imported the project in Eclipse, you need to create the Res folder. Right Click on AndEngine Root Project and select New -> Folder</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKkJTGoIoIy1aWe9qzuNGrfgG3wTHBs-ZLeTRGm3kK1EFq3V5isED26-LM-tc3huCJRr9vYDZimBliwu_LxSEAYvjnogEdb5T-tfSlm9DQXgFEKhelqptESgfaeuLLBr5X6XU2nBsCgVU/s1600/104.png" /></div><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikEpcVhDju4plgDFp3YllxPMo3DCE8WoT3oEttjhfCjNyf7zwyO3k-EeU9ggf9NLCpL31oz0f1rZLUDs4T8CxnnUXVoXXSGeiei3OAhB02tJonK1ZoNp3j4ZYZYaVgdr6RunUkT3PgrGs/s1600/105.png" /></div><br />
<p>Once created the res folder the problems have gone away.</p><br />
<h2>Exporting the jar</h2><br />
<p>Right Click on root AndEngine Project and select export.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz6dOU5WIpKiPYsXLCFnkWKQZKr4DJyj9PbpuLuYJf0COEF9HDVCItbmZWVl8qtDsAJsSpT0eYVOchCZ37LZvUxhRFsBbEJDtAsl08r6uifc0mN8MrTT4zNFip7XZWOkmsLIK6k59SQqo/s1600/106.png" /></div><br />
<p>We select Java -> Jar file and click Next.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiJYlUgsBeHH9Un-ncyVITz8Rhm_rl0nGHimG0lJYeblWB3hP0vQcOR5YY843K5sB32JsmFgEB5Jk49dUEBKqSkTQjUyOeXiHXFusLVZhli57eJGQsI0FyR_6OG7iUjt3J4LKJ0SezuTs/s1600/107.png" /></div><br />
<p>In the next screen we need to do something <b>important</b>, we need to uncheck all the checkboxes in the right part of the screen, i marked in the photo in red. Then you need to put a path to the jar... and click Finish. All done.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7Hg7iRpXKuRwKfj9_2mTPiRTQ3NV6q32eBaIt_rt_F4wcCDDFMA2Wv5UHXuUyYBJAHdoq8pZHEsHFiBTkuHLgBxUExTekFwxrbTL0_7RIOAXiMvrhAu6C0lD0M8A-EDHDN2u20aYq35Y/s1600/108.png" /></div><br />
<p>Hope it helps you guys.</p>Angelhttp://www.blogger.com/profile/01073241333005135564noreply@blogger.com4tag:blogger.com,1999:blog-4781273901910041475.post-48392648995511318042011-04-08T06:52:00.000-07:002011-04-08T06:52:38.258-07:00Current State of Development (April 2011)<p>Sorry about the quality of the video. I expect to put the code in subversion and make one, two or three articles to get to the actual state. Working with Box2d.</p><br />
<center><br />
<iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/u1_5bKirrD0" frameborder="0" allowfullscreen></iframe><br />
</center>Angelhttp://www.blogger.com/profile/01073241333005135564noreply@blogger.com7tag:blogger.com,1999:blog-4781273901910041475.post-34086340853971128862011-03-30T12:13:00.000-07:002011-04-06T15:01:21.091-07:00AndEngine from Scratch (V)<h2>Previously on AndEngine from Scratch</h2><br />
<ul><li><a href="http://andenginefromscratch.blogspot.com/2011/03/introduccion-andengine-parte-i.html">Tutorial I</a></li>
<li><a href="http://andenginefromscratch.blogspot.com/2011/03/introduccion-andengine-parte-ii.html">Tutorial II</a></li>
<li><a href="http://andenginefromscratch.blogspot.com/2011/03/introduccion-andengine-parte-iii.html">Tutorial III</a></li>
<li><a href="http://andenginefromscratch.blogspot.com/2011/03/introduccion-andengine-parte-iv.html">Tutorial IV</a></li>
</ul><br />
<h2>Today Goals</h2><ul><li>Finish the CatapultDetector</li>
<li>Make the player react to the detector's events.</li>
</ul></p><br />
<h2>Let's go with the Detector</h2><br />
<p>I have the Detector stable, here is the complete code:<br />
</p><br />
<div class="java"><div class="head">CatapultDetector.java</div><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">com.pruebas.andengine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.TouchEvent</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.BaseDetector</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">android.view.MotionEvent</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> CatapultDetector <span class="kw1">extends</span> BaseDetector <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">float</span> ANGLE_CONSTANT <span class="sy0">=</span> <span class="nu0">90</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">float</span> DEFAULT_MAX_DISTANCE <span class="sy0">=</span> <span class="nu0">80</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Listener for the Detector</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">final</span> ICatapultDetectorListener mCatapultDetectorListener<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw4">float</span> mMaxDistance<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// First Touch</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mFirstX<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mFirstY<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constructors</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> CatapultDetector<span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> ICatapultDetectorListener pCatapultDetectorListener<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span><span class="br0">(</span>DEFAULT_MAX_DISTANCE, pCatapultDetectorListener<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> CatapultDetector<span class="br0">(</span><span class="kw1">final</span> <span class="kw4">float</span> pMaxDistance,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> ICatapultDetectorListener pCatapultDetectorListener<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">setMaxDistance</span><span class="br0">(</span>pMaxDistance<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetectorListener</span> <span class="sy0">=</span> pCatapultDetectorListener<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods for/from SuperClass/Interfaces</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">boolean</span> onManagedTouchEvent<span class="br0">(</span>TouchEvent pSceneTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> touchX <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">getX</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> touchY <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">getY</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> action <span class="sy0">=</span> pSceneTouchEvent.<span class="me1">getAction</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">switch</span> <span class="br0">(</span>action<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_DOWN</span><span class="sy0">:</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFirstX</span> <span class="sy0">=</span> touchX<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFirstY</span> <span class="sy0">=</span> touchY<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_MOVE</span><span class="sy0">:</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_UP</span><span class="sy0">:</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// case MotionEvent.ACTION_CANCEL:</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> distanceX <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">abs</span><span class="br0">(</span>touchX <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstX</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> <span class="kw4">float</span> distanceY <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">abs</span><span class="br0">(</span>touchY <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstY</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> distance <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">min</span><span class="br0">(</span><span class="br0">(</span><span class="kw4">float</span><span class="br0">)</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">hypot</span><span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span> distanceX, <span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span> distanceY<span class="br0">)</span>, mMaxDistance<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">double</span> angleX <span class="sy0">=</span> touchX <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstX</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">double</span> angleY <span class="sy0">=</span> touchY <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstY</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> <span class="kw4">float</span> angle <span class="sy0">=</span> <span class="br0">(</span><span class="kw4">float</span><span class="br0">)</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">toDegrees</span><span class="br0">(</span><a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">atan2</span><span class="br0">(</span>angleY,</pre></li>
<li class="li1"><pre class="de1">angleX<span class="br0">)</span><span class="br0">)</span></pre></li>
<li class="li1"><pre class="de1"><span class="sy0">+</span> ANGLE_CONSTANT<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">if</span> <span class="br0">(</span>action <span class="sy0">==</span> MotionEvent.<span class="me1">ACTION_MOVE</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetectorListener</span>.<span class="me1">onCharge</span><span class="br0">(</span><span class="kw1">this</span>, pSceneTouchEvent,</pre></li>
<li class="li2"><pre class="de2">distance, angle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetectorListener</span>.<span class="me1">onShoot</span><span class="br0">(</span><span class="kw1">this</span>, pSceneTouchEvent,</pre></li>
<li class="li1"><pre class="de1">distance, angle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">default</span><span class="sy0">:</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Getter & Setter</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw4">void</span> setMaxDistance<span class="br0">(</span><span class="kw4">float</span> mMaxDistance<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mMaxDistance</span> <span class="sy0">=</span> mMaxDistance<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">float</span> getMaxDistance<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">return</span> mMaxDistance<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">float</span> getX<span class="br0">(</span><span class="kw1">final</span> TouchEvent pTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> pTouchEvent.<span class="me1">getX</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">float</span> getY<span class="br0">(</span><span class="kw1">final</span> TouchEvent pTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> pTouchEvent.<span class="me1">getY</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Inner and Anonymous Classes</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">interface</span> ICatapultDetectorListener <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onCharge<span class="br0">(</span><span class="kw1">final</span> CatapultDetector pCatapultDetector,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TouchEvent pTouchEvent, <span class="kw1">final</span> <span class="kw4">float</span> pDistance,</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> <span class="kw4">float</span> pAngle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onShoot<span class="br0">(</span><span class="kw1">final</span> CatapultDetector pCatapultDetector,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TouchEvent pTouchEvent, <span class="kw1">final</span> <span class="kw4">float</span> pDistance,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> pAngle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
</ol><div class="foot">Parsed in 0.130 seconds at 31.87 KB/s, using GeSHi 1.0.8.10</div></div><br />
<br />
<p>Let's take a look on the Listener, is the starting point of the listener.<br />
</p><br />
<div class="java"><div class="head">CatapultDetector Listener</div><ol><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">interface</span> ICatapultDetectorListener <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw4">void</span> onCharge<span class="br0">(</span><span class="kw1">final</span> CatapultDetector pCatapultDetector,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TouchEvent pTouchEvent, <span class="kw1">final</span> <span class="kw4">float</span> pDistance,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> pAngle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onShoot<span class="br0">(</span><span class="kw1">final</span> CatapultDetector pCatapultDetector,</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> TouchEvent pTouchEvent, <span class="kw1">final</span> <span class="kw4">float</span> pDistance,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> pAngle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.091 seconds at 7.05 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>This listener has to respond two kind of events, when we are "charging" and when we shoot. The onCharge() method is for the first one and the onShoot() for the second one. The parameters to this methods are the same.<br />
<ul><li><b>pCatapultDetector:</b> The detector itself.</li>
<li><b>pTouchEvent:</b> The current TouchScreen Event.</li>
<li><b>pDistance:</b> Distance from the starting point of the gesture to the current point.</li>
<li><b>pAngle:</b> The angle formed by the first touch point and the current.</li>
</ul>The onShoot() parameters and the onCharge() are the same. Let's take a look at the variables.<br />
</p><br />
<div class="java"><div class="head">CatapultDetector variables</div><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">float</span> ANGLE_CONSTANT <span class="sy0">=</span> <span class="nu0">90</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">float</span> DEFAULT_MAX_DISTANCE <span class="sy0">=</span> <span class="nu0">80</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Listener for the Detector</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">final</span> ICatapultDetectorListener mCatapultDetectorListener<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mMaxDistance<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// First Touch</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw4">float</span> mFirstX<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mFirstY<span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.086 seconds at 6.68 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>We have the constants<br />
<ul><li><b>ANGLE_CONSTANT:</b> In the early tests, i had to sum 90 to the angle for the player to rotate the correct angle.</li>
<li><b>DEFAULT_MAX_DISTANCE:</b> Default max distance of charge, if not indicated in the constructor, this is the max distance of charge, if you try to charge a number larger than the max distance, the detector will trigger the listener with the max distance.</li>
</ul></p><br />
<p>Let's view the variables.<br />
<ul><li><b>mCatapultDetectorListener:</b> Is a ICatapultDetectorListener that we have seen before. Is mandatary to have one Listener.</li>
<li><b>mMaxDistance:</b> In this variable we hold the max distance.</li>
<li><b>mFirstX,mFirstY:</b> First point of touch in X,Y coordinates.</li>
</ul></p><br />
<p>Let's go to the class constructors</p><br />
<div class="java"><div class="head">CatapultDetector's constructors</div><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constructors</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> CatapultDetector<span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> ICatapultDetectorListener pCatapultDetectorListener<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span><span class="br0">(</span>DEFAULT_MAX_DISTANCE, pCatapultDetectorListener<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> CatapultDetector<span class="br0">(</span><span class="kw1">final</span> <span class="kw4">float</span> pMaxDistance,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> ICatapultDetectorListener pCatapultDetectorListener<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">setMaxDistance</span><span class="br0">(</span>pMaxDistance<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetectorListener</span> <span class="sy0">=</span> pCatapultDetectorListener<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
</ol><div class="foot">Parsed in 0.086 seconds at 5.98 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>We have two different constructors. The first one is invoked with only one parameter, the ICatapultDetectorListener that responds to the events. In the second one we can specify the value of Max Charge distance.<br />
</p><br />
<p>The real work in the detector is in the onManagedTouchEvent() method. It has only one parameter, the TouchEvent.<br />
</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> touchX <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">getX</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> touchY <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">getY</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> action <span class="sy0">=</span> pSceneTouchEvent.<span class="me1">getAction</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.081 seconds at 1.88 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Here we use final variables to hold data usefull later in the method. In the first line we hold the X coordinate of the event, in the second the Y coordinate and in the third we have the action performed, in our case three posible values.<br />
<ul><li><b>ACTION_DOWN :</b> The user touch the screen for first time.</li>
<li><b>ACTION_MOVE :</b> The user has the finger on the screen and move it.</li>
<li><b>ACTION_UP :</b> The take the finger away from the screen.</li>
</ul></p><br />
<p>When the event is ACTION_DOWN the only thing we need to do is keep the coordinates where the user put the finger, that we will use them to calculate angles and distance.<br />
</p><br />
<p>To the ACTION_MOVE and ACTION_UP we use the same code for both.<br />
</p><br />
<div class="java"><div class="head">ACTION_MOVE and ACTION_UP</div><ol><li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> distanceX <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">abs</span><span class="br0">(</span>touchX <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstX</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> distanceY <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">abs</span><span class="br0">(</span>touchY <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstY</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> distance <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">min</span><span class="br0">(</span><span class="br0">(</span><span class="kw4">float</span><span class="br0">)</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">hypot</span><span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span> distanceX, <span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span> distanceY<span class="br0">)</span>, mMaxDistance<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> <span class="kw4">double</span> angleX <span class="sy0">=</span> touchX <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstX</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">double</span> angleY <span class="sy0">=</span> touchY <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstY</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> angle <span class="sy0">=</span> <span class="br0">(</span><span class="kw4">float</span><span class="br0">)</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">toDegrees</span><span class="br0">(</span><a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">atan2</span><span class="br0">(</span>angleY,</pre></li>
<li class="li1"><pre class="de1">angleX<span class="br0">)</span><span class="br0">)</span></pre></li>
<li class="li1"><pre class="de1"><span class="sy0">+</span> ANGLE_CONSTANT<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">if</span> <span class="br0">(</span>action <span class="sy0">==</span> MotionEvent.<span class="me1">ACTION_MOVE</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetectorListener</span>.<span class="me1">onCharge</span><span class="br0">(</span><span class="kw1">this</span>, pSceneTouchEvent,</pre></li>
<li class="li1"><pre class="de1">distance, angle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetectorListener</span>.<span class="me1">onShoot</span><span class="br0">(</span><span class="kw1">this</span>, pSceneTouchEvent,</pre></li>
<li class="li2"><pre class="de2">distance, angle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.078 seconds at 8.91 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>First and second line, we grab the distance between the first and last touch coordinates in pixels. The third line calculates with hypot the real distance between the two points. In this third line we apply the Max distance of charge. Let's go to the angle.<br />
</p><br />
<p>The best way i found to figure th e angle between two point is the next lines method.We have in the angle variable the angle.</p><br />
<p>If the action is ACTION_MOVE we trigger an onCharge() event, if the action is ACTION_UP we trigger an onShoot() event.</p><br />
<p>With that we have finished the first version of our Detector. Sure there will be better and more efficiently ways to do this. If you have one better solution, please post it in the comments and i change the tutorial. I will send you a virtual beer ;)<br />
</p><br />
<h2>Adapting the Player Class</h2><br />
<p>First of all, the Player is a descendant of the AnimatedSprite class.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVxg0iZdOOC3fHBkuS2UmCczLIWHwKIYTBa1amMfQ4EZ0z2aUj6WAkmQJZIIn8qN-rjAxngFL6X6QNjYBihKYidBttdouJGOmfXJ_uUk3torVhLw4t8KHg9JIRHHCnMiN2eKFWfUL1IGoF/s1600/ui_player.png" /></div><br />
<p>We have here the diferent frames of the animation. Let's go to work. Define a constant to hold the max frame of the charging state, if you look well, the las two frames are for the movement when the user releases the player.<br />
<p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> PLAYER_CHARGE_ANIMATIONS <span class="sy0">=</span> <span class="nu0">5</span><span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.073 seconds at 737 B/s, using GeSHi 1.0.8.10</div></div><br />
<p>Let's add one method to the class.</p><br />
<div class="java"><div class="head">Add this procedure to your Player class.</div><ol><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> setCharge<span class="br0">(</span><span class="kw1">final</span> <span class="kw4">float</span> angle, <span class="kw1">final</span> <span class="kw4">float</span> distance<span class="br0">)</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> step <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">round</span><span class="br0">(</span>distance <span class="sy0">*</span> PLAYER_CHARGE_ANIMATIONS <span class="sy0">/</span> Main.<span class="me1">MAX_CHARGE_DISTANCE</span><span class="br0">)</span><span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">stopAnimation</span><span class="br0">(</span>step<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">setRotation</span><span class="br0">(</span>angle<span class="br0">)</span><span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.067 seconds at 3.32 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>In the first line, we use a "rule of three" (Is this correct in english?) to calculate the actual frame according to distance the detector send to us. We use the MAX_CHARGE_DISTANCE constant (we will define that later). We use the stopAnimation() method to indicate the sprite not to animate and which frame we want to see in the screen. Then we rotate the Sprite the angle.<br />
</p><br />
<p>Let's go to the Main.java and put that constant. Mine look like this:<br />
</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_WIDTH <span class="sy0">=</span> <span class="nu0">480</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_HEIGHT <span class="sy0">=</span> <span class="nu0">320</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">float</span> MAX_CHARGE_DISTANCE <span class="sy0">=</span> <span class="nu0">80</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> TAG <span class="sy0">=</span> <span class="st0">"AndEngineTest"</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
</ol><div class="foot">Parsed in 0.069 seconds at 4.94 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>In the onLoadScene() method we touch where the CatapultDetector is created and pass this constant to the constructor.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span> <span class="sy0">=</span> <span class="kw1">new</span> SurfaceScrollDetector<span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">setEnabled</span><span class="br0">(</span><span class="kw2">false</span><span class="br0">)</span><span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetector</span> <span class="sy0">=</span> <span class="kw1">new</span> CatapultDetector<span class="br0">(</span>MAX_CHARGE_DISTANCE,<span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mCatapultDetector</span>.<span class="me1">setEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.089 seconds at 2.46 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Change the onCharge() method</p><br />
<div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onCharge<span class="br0">(</span>CatapultDetector pCatapultDetector,</pre></li>
<li class="li1"><pre class="de1">TouchEvent pTouchEvent, <span class="kw4">float</span> pDistance, <span class="kw4">float</span> pAngle<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mActivePlayer</span>.<span class="me1">setCharge</span><span class="br0">(</span>pAngle,pDistance<span class="br0">)</span><span class="sy0">;</span> </pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.076 seconds at 2.42 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Here we pass the player the level of charge. With these modifications the programs runs correctly. If you experienced any problem in this tutorial, please contact with me or post a comment and i will be pleased to solve it.<br />
</p><br />
<p>In the next chapter we will see how integrate the Box2d phisics engine and some improvements in the game.<br />
</p><br />
<h2>Source Code</h2><p>To get the source code: <b>svn checkout http://ch-soccer.googlecode.com/svn/trunk/ tutorial-read-only -r 8</b></p><br />
<h2>Index</h2><ul><li><a href="http://andenginefromscratch.blogspot.com/p/tutorial-index.html">Tutorial index</a></li>
</ul>Angelhttp://www.blogger.com/profile/01073241333005135564noreply@blogger.com10tag:blogger.com,1999:blog-4781273901910041475.post-65935873302901767792011-03-25T09:14:00.000-07:002011-04-06T14:51:31.718-07:00AndEngine from Scratch (IV)<h2>Previously on AndEngine from Scratch</h2><br />
<ul><li><a href="http://andenginefromscratch.blogspot.com/2011/03/introduccion-andengine-parte-i.html">Tutorial I</a></li>
<li><a href="http://andenginefromscratch.blogspot.com/2011/03/introduccion-andengine-parte-ii.html">Tutorial II</a></li>
<li><a href="http://andenginefromscratch.blogspot.com/2011/03/introduccion-andengine-parte-iii.html">Tutorial III</a></li>
</ul><br />
<h2>Today goals</h2><ul><li>Create the player sprite.</li>
<li>Create a Detector to the catapult effect.</li>
</ul></p><br />
<br />
<h2>Create the player</h2><br />
<p>To create the player i decided to use an AnimatedSprite, but we subclass the AnimatedSprite to be able to personalize it.</p><br />
<p>To crate the class, go to the folder with the sources in Eclipse. File New -> Class and the Name is Player and the SuperClass is AnimatedSprite. We add a debug TAG and for now is ok.<br />
</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">com.pruebas.andengine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.sprite.AnimatedSprite</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.HoldDetector</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.HoldDetector.IHoldDetectorListener</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.region.TiledTextureRegion</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">android.util.Log</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw1">class</span> Player <span class="kw1">extends</span> AnimatedSprite <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> TAG <span class="sy0">=</span> <span class="st0">"Player"</span><span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Player<span class="br0">(</span><span class="kw4">float</span> pX, <span class="kw4">float</span> pY, TiledTextureRegion pTiledTextureRegion<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">super</span><span class="br0">(</span>pX, pY, pTiledTextureRegion<span class="br0">)</span><span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
</ol><div class="foot">Parsed in 0.077 seconds at 7.25 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Get back to the Main.java and let's add a variable to hold the active Player object. Let's change the mFaceTextureRegion to mBallTextureRegion to make it pretty and change the type to TiledTextureRegion. My variables looks like this:<br />
</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> ZoomCamera mCamera<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> Texture mTexture<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TiledTextureRegion mBallTextureRegion<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TiledTextureRegion mPlayerTextureRegion<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> SurfaceScrollDetector mScrollDetector<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> TMXTiledMap mTMXTiledMap<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> Player mActivePlayer<span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.106 seconds at 3.86 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Here is the player sprite, download to your assets/gfx folder as usual.<br />
</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEife0GdU1AqzQNGzHyyXmWoow2AWBXRX4F9maxiS8HwObrh8djQhqg8O2MOmVO5m-9p3nesg6ukYM8eONA8UdmKE7S43ShWs2VwxOLdJ527x7NalbVl0TsC45VzF-gkytq5p6KPdUEKJXXJ/s1600/ui_player.png" /></div><br />
<p>Here is some experimental ball sprite (i need a real ball to make photos), to the same site, assets/gfx<br />
</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSbYDdLlfIUgT7vApXvxGuRL9YMz7bMzW-TsULTjm3VwRf80UYEqFgr2iUqFmkS-WWvAKYUGmsAX0kmvhK87Pyf61Xuuq2fJRR9i0os8uF7oXcfJRU3EljBVYe_sTMcwqq1-TOC_I3gUst/s1600/ui_ball.png" /></div><br />
<p>Now we must change the way to load the textures to load this new two textures. All the textures go to the mTexture Object. The mTexture object need a power of two in width and height in pixels. To hold the textures recently downloaded we need exactly 256X256 pixels. The texture in memory would look like this:<br />
</p><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0wLk5-9yF_QA8u3tE5-qZIlzsEZuFBZaMEWRePfbOBsuw9C1oVgGbN9ZPI2ohi3WEn3QTE4Cu0Y3z7p-O0GCFexuNINGitkJmfwV0xVdLPDHNPmadAkS14ZPFlN6xs29reVoz_T4lXekR/s1600/paso1.png" /></div><br />
<p>Let's change en onLoadResources() method to load all this new stuff. First of all, the size of the mTexture needs to be 256X256 and now to load the ball texture we use the createTiledFromAsset() function with the parameters:<br />
<ul><li><b>this.mTexture:</b> The first is the mTexture object where all the textures are going</li>
<li><b>this:</b> Actual class.</li>
<li><b>"gfx/ui_ball.png":</b> Path to the image containing the tiled sprites.</li>
<li><b>0,0:</b> The next two integer parameters is where are going yo put the image inside mTexture. In this case, in the top left corner (0,0). The player in the top middle (128,0).</li>
<li><b>2,4:</b> Number of rows an columns in the tile. 2,4 in our case.</li>
</ul>The code looks like this:<br />
</p><br />
<div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadResources<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTexture</span> <span class="sy0">=</span> <span class="kw1">new</span> Texture<span class="br0">(</span><span class="nu0">256</span>, <span class="nu0">256</span>,</pre></li>
<li class="li1"><pre class="de1">TextureOptions.<span class="me1">BILINEAR_PREMULTIPLYALPHA</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mBallTextureRegion</span> <span class="sy0">=</span> TextureRegionFactory.<span class="me1">createTiledFromAsset</span><span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTexture</span>, <span class="kw1">this</span>, <span class="st0">"gfx/ui_ball.png"</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">2</span>, <span class="nu0">4</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mPlayerTextureRegion</span> <span class="sy0">=</span> TextureRegionFactory.<span class="me1">createTiledFromAsset</span><span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTexture</span>, <span class="kw1">this</span>, <span class="st0">"gfx/ui_player.png"</span>, <span class="nu0">128</span>, <span class="nu0">0</span>, <span class="nu0">2</span>, <span class="nu0">4</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">getTextureManager</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">loadTexture</span><span class="br0">(</span><span class="kw1">this</span>.<span class="me1">mTexture</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.074 seconds at 6.24 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Now, some code on the onLoadScene() method. First we delete the source creating the ball and deactivate the ScrollDetector. The procedure should look like this:<br />
</p><br />
<div class="java"><ol><li class="li1"><pre class="de1">scene.<span class="me1">setOnAreaTouchTraversalFrontToBack</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span> <span class="sy0">=</span> <span class="kw1">new</span> SurfaceScrollDetector<span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">setEnabled</span><span class="br0">(</span><span class="kw2">false</span><span class="br0">)</span><span class="sy0">;</span> <span class="co1">//Hemos puesto esto a false</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="coMULTI">/*</span></pre></li>
<li class="li1"><pre class="de1"><span class="coMULTI"> final int centerX = (CAMERA_WIDTH - this.mFaceTextureRegion.getWidth()) / 2;</span></pre></li>
<li class="li1"><pre class="de1"><span class="coMULTI"> final int centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion</span></pre></li>
<li class="li1"><pre class="de1"><span class="coMULTI"> .getHeight()) / 2;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="coMULTI"> final Sprite ball = new Sprite(centerX, centerY,</span></pre></li>
<li class="li1"><pre class="de1"><span class="coMULTI"> this.mFaceTextureRegion);</span></pre></li>
<li class="li1"><pre class="de1"><span class="coMULTI"> scene.getLastChild().attachChild(ball);</span></pre></li>
<li class="li1"><pre class="de1"><span class="coMULTI"> */</span></pre></li>
<li class="li2"><pre class="de2">scene.<span class="me1">setOnSceneTouchListener</span><span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setTouchAreaBindingEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> scene<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.077 seconds at 7.57 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Let's create a method to create a player to test the animation.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw4">void</span> createPlayer<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Scene scene <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">getScene</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Player sprite <span class="sy0">=</span> <span class="kw1">new</span> Player<span class="br0">(</span><span class="nu0">200</span>, <span class="nu0">100</span>, <span class="kw1">this</span>.<span class="me1">mPlayerTextureRegion</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// scene.registerTouchArea(sprite);</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">getLastChild</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">attachChild</span><span class="br0">(</span>sprite<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mActivePlayer</span> <span class="sy0">=</span> sprite<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.069 seconds at 5.99 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>To test, we are gonna put a player in the 200X100 position. Call this new function from onLoadComplete().</p><br />
<div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadComplete<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="co1">// scene.set </span></pre></li>
<li class="li1"><pre class="de1">createPlayer<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.072 seconds at 1.08 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>In this point, we can debug our program to see what's happen. We can see the background grass and the player. It doesn't respond to scroll because we deactivated it. Let's create the detector.<br />
</p><br />
<h2>Creating a Detector</h2><br />
<p>Looking around in the AndEngine sources, the ScrollDetector is a very easy way to create Detectors.</p><br />
<p>We create a new class in our project. Name: CatapultDetector and SuperClass BaseDetector<br />
(org.anddev.andengine.input.touch.detector.BaseDetector)</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">com.pruebas.andengine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.TouchEvent</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.BaseDetector</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> CatapultDetector <span class="kw1">extends</span> BaseDetector <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">boolean</span> onManagedTouchEvent<span class="br0">(</span>TouchEvent pSceneTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
</ol><div class="foot">Parsed in 0.091 seconds at 3.82 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>We are going to try to make a Detector that works like the ScrollDetector, we need a listener interface.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">interface</span> ICatapultDetectorListener <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw4">void</span> onCharge<span class="br0">(</span><span class="kw1">final</span> CatapultDetector pCatapultDetector,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TouchEvent pTouchEvent, <span class="kw1">final</span> <span class="kw4">float</span> pDistance,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> pAngle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onShoot<span class="br0">(</span><span class="kw1">final</span> CatapultDetector pCatapultDetector,</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> TouchEvent pTouchEvent, <span class="kw1">final</span> <span class="kw4">float</span> pDistance,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> pAngle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
</ol><div class="foot">Parsed in 0.102 seconds at 6.30 KB/s, using GeSHi 1.0.8.10</div></div><br />
<br />
<p>This is a basic listener to test the working of the Detector. The listener object recieves the angle and distance of the soot. We define this class inside the CatapultDetector class like the other detector in AndEngine.</p><br />
<p>Let's put some variables to the detector.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">float</span> TRIGGER_SCROLL_MINIMUM_DISTANCE_DEFAULT <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">float</span> ANGLE_CONSTANT <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> DEFAULT_STEPS <span class="sy0">=</span> <span class="nu0">6</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> DEFAULT_MAX_DISTANCE <span class="sy0">=</span> <span class="nu0">100</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">//Minimum distance to execute </span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mTriggerScrollMinimumDistance<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">//Listener for the Detector</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">final</span> ICatapultDetectorListener mCatapultDetectorListener<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">boolean</span> mTriggered<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">//First Touch</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mFirstX<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mFirstY<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">//Last Touch</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw4">float</span> mLastX<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mLastY<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">int</span> mSteps<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mMaxDistance<span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.088 seconds at 10.05 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>We create some methods to use later and getter and setter to mTriggerScrollMinimumDistance<br />
</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Getter & Setter</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw4">void</span> setTriggerScrollMinimumDistance<span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw4">float</span> mTriggerScrollMinimumDistance<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTriggerScrollMinimumDistance</span> <span class="sy0">=</span> mTriggerScrollMinimumDistance<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw4">float</span> getTriggerScrollMinimumDistance<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> mTriggerScrollMinimumDistance<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">float</span> getX<span class="br0">(</span><span class="kw1">final</span> TouchEvent pTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> pTouchEvent.<span class="me1">getX</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">float</span> getY<span class="br0">(</span><span class="kw1">final</span> TouchEvent pTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> pTouchEvent.<span class="me1">getY</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.098 seconds at 7.41 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Code a little in the class constructors.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constructors</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> CatapultDetector<span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> ICatapultDetectorListener pCatapultDetectorListener<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span><span class="br0">(</span>TRIGGER_SCROLL_MINIMUM_DISTANCE_DEFAULT, pCatapultDetectorListener<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> CatapultDetector<span class="br0">(</span><span class="kw1">final</span> <span class="kw4">float</span> pTriggerScrollMinimumDistance,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> ICatapultDetectorListener pCatapultDetectorListener<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">setTriggerScrollMinimumDistance</span><span class="br0">(</span>pTriggerScrollMinimumDistance<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetectorListener</span> <span class="sy0">=</span> pCatapultDetectorListener<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.077 seconds at 7.53 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>And now the main method of the class, where all happens.<br />
</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods for/from SuperClass/Interfaces</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">boolean</span> onManagedTouchEvent<span class="br0">(</span>TouchEvent pSceneTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> touchX <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">getX</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> touchY <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">getY</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">switch</span> <span class="br0">(</span>pSceneTouchEvent.<span class="me1">getAction</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_DOWN</span><span class="sy0">:</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFirstX</span> <span class="sy0">=</span> touchX<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFirstY</span> <span class="sy0">=</span> touchY<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mLastX</span> <span class="sy0">=</span> touchX<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mLastY</span> <span class="sy0">=</span> touchY<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTriggered</span> <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_MOVE</span><span class="sy0">:</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_UP</span><span class="sy0">:</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_CANCEL</span><span class="sy0">:</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> distanceX <span class="sy0">=</span> touchX <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mLastX</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> distanceY <span class="sy0">=</span> touchY <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mLastY</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">if</span> <span class="br0">(</span>pSceneTouchEvent.<span class="me1">getAction</span><span class="br0">(</span><span class="br0">)</span> <span class="sy0">==</span> MotionEvent.<span class="me1">ACTION_MOVE</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> triggerScrollMinimumDistance <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">mTriggerScrollMinimumDistance</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">if</span> <span class="br0">(</span><span class="kw1">this</span>.<span class="me1">mTriggered</span></pre></li>
<li class="li1"><pre class="de1"><span class="sy0">||</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">abs</span><span class="br0">(</span>distanceX<span class="br0">)</span> <span class="sy0">></span> triggerScrollMinimumDistance</pre></li>
<li class="li1"><pre class="de1"><span class="sy0">||</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">abs</span><span class="br0">(</span>distanceY<span class="br0">)</span> <span class="sy0">></span> triggerScrollMinimumDistance<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> distance <span class="sy0">=</span> <span class="br0">(</span><span class="kw4">float</span><span class="br0">)</span><a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">hypot</span><span class="br0">(</span><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span>distanceX,<span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span>distanceY<span class="br0">)</span><span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">double</span> angleX <span class="sy0">=</span> touchX <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstX</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> <span class="kw4">double</span> angleY <span class="sy0">=</span> touchY <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstY</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> angle <span class="sy0">=</span> <span class="br0">(</span><span class="kw4">float</span><span class="br0">)</span><a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">toDegrees</span><span class="br0">(</span><a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">atan2</span><span class="br0">(</span>angleY, angleX<span class="br0">)</span><span class="br0">)</span><span class="sy0">+</span>ANGLE_CONSTANT<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetectorListener</span>.<span class="me1">onCharge</span><span class="br0">(</span><span class="kw1">this</span>, pSceneTouchEvent, distance, angle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mLastX</span> <span class="sy0">=</span> touchX<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mLastY</span> <span class="sy0">=</span> touchY<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mTriggered</span> <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">else</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">default</span><span class="sy0">:</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
</ol><div class="foot">Parsed in 0.097 seconds at 16.70 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>In The next article we are going to explain more carefully the Detector, but looking the source you can see how it works. Let's back to the Main.java. Create a private variable to hold the Detector Object.<br />
</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> ZoomCamera mCamera<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> Texture mTexture<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TiledTextureRegion mBallTextureRegion<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TiledTextureRegion mPlayerTextureRegion<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> SurfaceScrollDetector mScrollDetector<span class="sy0">;</span> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> TMXTiledMap mTMXTiledMap<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> Player mActivePlayer<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> CatapultDetector mCatapultDetector<span class="sy0">;</span> <span class="co1">//Nueva variable Creada</span></pre></li>
</ol><div class="foot">Parsed in 0.078 seconds at 6.09 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Now tell the Main class to implement the new ICatapultDetectorListener interface.<br />
</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> Main <span class="kw1">extends</span> BaseGameActivity <span class="kw1">implements</span> IScrollDetectorListener,</pre></li>
<li class="li1"><pre class="de1">IOnSceneTouchListener, ICatapultDetectorListener</pre></li>
</ol><div class="foot">Parsed in 0.082 seconds at 1.54 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Now we must implement the missing methods of the interface.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onCharge<span class="br0">(</span>CatapultDetector pCatapultDetector,</pre></li>
<li class="li1"><pre class="de1">TouchEvent pTouchEvent, <span class="kw4">float</span> pDistance, <span class="kw4">float</span> pAngle<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1">Log.<span class="me1">d</span><span class="br0">(</span>TAG, <span class="st0">"Cargando... {Distancia:"</span> <span class="sy0">+</span> pDistance <span class="sy0">+</span> <span class="st0">", angulo: "</span></pre></li>
<li class="li2"><pre class="de2"><span class="sy0">+</span> pAngle <span class="sy0">+</span> <span class="st0">"}"</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mActivePlayer</span>.<span class="me1">setRotation</span><span class="br0">(</span>pAngle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onShoot<span class="br0">(</span>CatapultDetector pCatapultDetector,</pre></li>
<li class="li1"><pre class="de1">TouchEvent pTouchEvent, <span class="kw4">float</span> pDistance, <span class="kw4">float</span> pAngle<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1">Log.<span class="me1">d</span><span class="br0">(</span>TAG, <span class="st0">"Disparo... {Distancia:"</span> <span class="sy0">+</span> pDistance <span class="sy0">+</span> <span class="st0">", angulo: "</span> <span class="sy0">+</span> pAngle</pre></li>
<li class="li1"><pre class="de1"><span class="sy0">+</span> <span class="st0">"}"</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.084 seconds at 5.75 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>In the onCharge() method, we rotate the player sprite according to the calculated angle. In the onShoot() method, only Debug message. The next step is create in the onLoadScene() method the Detector and assign to the Main Object.<br />
</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span> <span class="sy0">=</span> <span class="kw1">new</span> SurfaceScrollDetector<span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">setEnabled</span><span class="br0">(</span><span class="kw2">false</span><span class="br0">)</span><span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">//Creamos el detector de catapulta</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mCatapultDetector</span> <span class="sy0">=</span> <span class="kw1">new</span> CatapultDetector<span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetector</span>.<span class="me1">setEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.093 seconds at 2.55 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>And in the onSceneTouchEvent() method we pass the event to the CatapultDetector.<br />
</p><br />
<br />
<div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">boolean</span> onSceneTouchEvent<span class="br0">(</span>Scene pScene, TouchEvent pSceneTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">if</span> <span class="br0">(</span><span class="kw1">this</span>.<span class="me1">mActivePlayer</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetector</span>.<span class="me1">onTouchEvent</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.079 seconds at 2.59 KB/s, using GeSHi 1.0.8.10</div></div><br />
<br />
<p>We now can debug again the project and see what's going on. F11... we can see the splash, the background, the player... all fine. Let's tap with the finger on the Screen and do some move around. The payer rotates but not in the desired angle. It's a start. Now my files are like this:<br />
</p><br />
<br />
<div class="java"><div class="head">Main.java</div><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">com.pruebas.andengine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.Engine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.camera.ZoomCamera</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.EngineOptions</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.TMXLayer</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.TMXLoader</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.TMXProperties</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.TMXTile</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.TMXTileProperty</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.TMXTiledMap</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.TMXLoader.ITMXTilePropertiesListener</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.util.exception.TMXLoadException</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.Scene</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.Scene.IOnSceneTouchListener</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.sprite.AnimatedSprite</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.sprite.Sprite</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.util.FPSLogger</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.TouchEvent</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.ScrollDetector</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.SurfaceScrollDetector</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.ScrollDetector.IScrollDetectorListener</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.Texture</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.TextureOptions</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.region.TextureRegion</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.region.TextureRegionFactory</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.region.TiledTextureRegion</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.ui.activity.BaseGameActivity</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.util.Debug</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">android.util.Log</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">com.pruebas.andengine.CatapultDetector.ICatapultDetectorListener</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> Main <span class="kw1">extends</span> BaseGameActivity <span class="kw1">implements</span> IScrollDetectorListener,</pre></li>
<li class="li1"><pre class="de1">IOnSceneTouchListener, ICatapultDetectorListener <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_WIDTH <span class="sy0">=</span> <span class="nu0">480</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_HEIGHT <span class="sy0">=</span> <span class="nu0">320</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> TAG <span class="sy0">=</span> <span class="st0">"AndEngineTest"</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> ZoomCamera mCamera<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> Texture mTexture<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TiledTextureRegion mBallTextureRegion<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TiledTextureRegion mPlayerTextureRegion<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> SurfaceScrollDetector mScrollDetector<span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TMXTiledMap mTMXTiledMap<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> Player mActivePlayer<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> CatapultDetector mCatapultDetector<span class="sy0">;</span> <span class="co1">//Nueva variable Creada</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constructors</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Getter & Setter</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods for/from SuperClass/Interfaces</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadComplete<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> </pre></li>
<li class="li1"><pre class="de1">createPlayer<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Engine onLoadEngine<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span> <span class="sy0">=</span> <span class="kw1">new</span> ZoomCamera<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> <span class="kw4">int</span> alturaTotal <span class="sy0">=</span> CAMERA_HEIGHT <span class="sy0">*</span> <span class="nu0">3</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">setBounds</span><span class="br0">(</span><span class="nu0">0</span>, CAMERA_WIDTH, <span class="nu0">0</span>, alturaTotal<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">setBoundsEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw1">new</span> Engine<span class="br0">(</span><span class="kw1">new</span> EngineOptions<span class="br0">(</span><span class="kw2">true</span>, ScreenOrientation.<span class="me1">LANDSCAPE</span>,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">new</span> RatioResolutionPolicy<span class="br0">(</span>CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span>,</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mCamera</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadResources<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mTexture</span> <span class="sy0">=</span> <span class="kw1">new</span> Texture<span class="br0">(</span><span class="nu0">256</span>, <span class="nu0">256</span>,</pre></li>
<li class="li1"><pre class="de1">TextureOptions.<span class="me1">BILINEAR_PREMULTIPLYALPHA</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mBallTextureRegion</span> <span class="sy0">=</span> TextureRegionFactory.<span class="me1">createTiledFromAsset</span><span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTexture</span>, <span class="kw1">this</span>, <span class="st0">"gfx/ui_ball.png"</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">2</span>, <span class="nu0">4</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mPlayerTextureRegion</span> <span class="sy0">=</span> TextureRegionFactory.<span class="me1">createTiledFromAsset</span><span class="br0">(</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mTexture</span>, <span class="kw1">this</span>, <span class="st0">"gfx/ui_player.png"</span>, <span class="nu0">128</span>, <span class="nu0">0</span>, <span class="nu0">2</span>, <span class="nu0">4</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">getTextureManager</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">loadTexture</span><span class="br0">(</span><span class="kw1">this</span>.<span class="me1">mTexture</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Scene onLoadScene<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">registerUpdateHandler</span><span class="br0">(</span><span class="kw1">new</span> FPSLogger<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> Scene scene <span class="sy0">=</span> <span class="kw1">new</span> Scene<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">try</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TMXLoader tmxLoader <span class="sy0">=</span> <span class="kw1">new</span> TMXLoader<span class="br0">(</span><span class="kw1">this</span>, <span class="kw1">this</span>.<span class="me1">mEngine</span></pre></li>
<li class="li1"><pre class="de1">.<span class="me1">getTextureManager</span><span class="br0">(</span><span class="br0">)</span>, <span class="co1">// TextureOptions.BILINEAR_PREMULTIPLYALPHA,</span></pre></li>
<li class="li2"><pre class="de2">TextureOptions.<span class="me1">NEAREST</span>, <span class="kw1">new</span> ITMXTilePropertiesListener<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onTMXTileWithPropertiesCreated<span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TMXTiledMap pTMXTiledMap,</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> TMXLayer pTMXLayer,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TMXTile pTMXTile,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TMXProperties<span class="sy0"><</span>TMXTileProperty<span class="sy0">></span> pTMXTileProperties<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTMXTiledMap</span> <span class="sy0">=</span> tmxLoader.<span class="me1">loadFromAsset</span><span class="br0">(</span><span class="kw1">this</span>, <span class="st0">"tmx/field.tmx"</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw1">final</span> TMXLoadException tmxle<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1">Debug.<span class="me1">e</span><span class="br0">(</span>tmxle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TMXLayer tmxLayer <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">mTMXTiledMap</span>.<span class="me1">getTMXLayers</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">get</span><span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">getFirstChild</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">attachChild</span><span class="br0">(</span>tmxLayer<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">scene.<span class="me1">setOnAreaTouchTraversalFrontToBack</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span> <span class="sy0">=</span> <span class="kw1">new</span> SurfaceScrollDetector<span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">setEnabled</span><span class="br0">(</span><span class="kw2">false</span><span class="br0">)</span><span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mCatapultDetector</span> <span class="sy0">=</span> <span class="kw1">new</span> CatapultDetector<span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetector</span>.<span class="me1">setEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setOnSceneTouchListener</span><span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setTouchAreaBindingEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> scene<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onCharge<span class="br0">(</span>CatapultDetector pCatapultDetector,</pre></li>
<li class="li1"><pre class="de1">TouchEvent pTouchEvent, <span class="kw4">float</span> pDistance, <span class="kw4">float</span> pAngle<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1">Log.<span class="me1">d</span><span class="br0">(</span>TAG, <span class="st0">"Cargando... {Distancia:"</span> <span class="sy0">+</span> pDistance <span class="sy0">+</span> <span class="st0">", angulo: "</span></pre></li>
<li class="li1"><pre class="de1"><span class="sy0">+</span> pAngle <span class="sy0">+</span> <span class="st0">"}"</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mActivePlayer</span>.<span class="me1">setRotation</span><span class="br0">(</span>pAngle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw4">void</span> onShoot<span class="br0">(</span>CatapultDetector pCatapultDetector,</pre></li>
<li class="li1"><pre class="de1">TouchEvent pTouchEvent, <span class="kw4">float</span> pDistance, <span class="kw4">float</span> pAngle<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1">Log.<span class="me1">d</span><span class="br0">(</span>TAG, <span class="st0">"Disparo... {Distancia:"</span> <span class="sy0">+</span> pDistance <span class="sy0">+</span> <span class="st0">", angulo: "</span> <span class="sy0">+</span> pAngle</pre></li>
<li class="li1"><pre class="de1"><span class="sy0">+</span> <span class="st0">"}"</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span> </pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onScroll<span class="br0">(</span>ScrollDetector pScollDetector, TouchEvent pTouchEvent,</pre></li>
<li class="li1"><pre class="de1"><span class="kw4">float</span> pDistanceX, <span class="kw4">float</span> pDistanceY<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">offsetCenter</span><span class="br0">(</span><span class="sy0">-</span>pDistanceX, <span class="sy0">-</span>pDistanceY<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">boolean</span> onSceneTouchEvent<span class="br0">(</span>Scene pScene, TouchEvent pSceneTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">if</span> <span class="br0">(</span><span class="kw1">this</span>.<span class="me1">mActivePlayer</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetector</span>.<span class="me1">onTouchEvent</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw4">void</span> createPlayer<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Scene scene <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">getScene</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Player sprite <span class="sy0">=</span> <span class="kw1">new</span> Player<span class="br0">(</span><span class="nu0">200</span>, <span class="nu0">100</span>, <span class="kw1">this</span>.<span class="me1">mPlayerTextureRegion</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">getLastChild</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">attachChild</span><span class="br0">(</span>sprite<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mActivePlayer</span> <span class="sy0">=</span> sprite<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Inner and Anonymous Classes</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
</ol><div class="foot">Parsed in 0.129 seconds at 53.47 KB/s, using GeSHi 1.0.8.10</div></div><br />
<br />
<div class="java"><div class="head">CatapultDetector.java</div><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">com.pruebas.andengine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.TouchEvent</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.BaseDetector</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">android.view.MotionEvent</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> CatapultDetector <span class="kw1">extends</span> BaseDetector <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">float</span> TRIGGER_SCROLL_MINIMUM_DISTANCE_DEFAULT <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">float</span> ANGLE_CONSTANT <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> DEFAULT_STEPS <span class="sy0">=</span> <span class="nu0">6</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw4">float</span> DEFAULT_MAX_DISTANCE <span class="sy0">=</span> <span class="nu0">100</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">//Minimum distance to execute </span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mTriggerScrollMinimumDistance<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">//Listener for the Detector</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">final</span> ICatapultDetectorListener mCatapultDetectorListener<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">boolean</span> mTriggered<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">//First Touch</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mFirstX<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw4">float</span> mFirstY<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">//Last Touch</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mLastX<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mLastY<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">int</span> mSteps<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">float</span> mMaxDistance<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Constructors</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> CatapultDetector<span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> ICatapultDetectorListener pCatapultDetectorListener<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span><span class="br0">(</span>TRIGGER_SCROLL_MINIMUM_DISTANCE_DEFAULT, pCatapultDetectorListener<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> CatapultDetector<span class="br0">(</span><span class="kw1">final</span> <span class="kw4">float</span> pTriggerScrollMinimumDistance,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> ICatapultDetectorListener pCatapultDetectorListener<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">setTriggerScrollMinimumDistance</span><span class="br0">(</span>pTriggerScrollMinimumDistance<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetectorListener</span> <span class="sy0">=</span> pCatapultDetectorListener<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods for/from SuperClass/Interfaces</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// =========================================================== </span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">boolean</span> onManagedTouchEvent<span class="br0">(</span>TouchEvent pSceneTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> touchX <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">getX</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> touchY <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">getY</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">switch</span> <span class="br0">(</span>pSceneTouchEvent.<span class="me1">getAction</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_DOWN</span><span class="sy0">:</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFirstX</span> <span class="sy0">=</span> touchX<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFirstY</span> <span class="sy0">=</span> touchY<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mLastX</span> <span class="sy0">=</span> touchX<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mLastY</span> <span class="sy0">=</span> touchY<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTriggered</span> <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_MOVE</span><span class="sy0">:</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_UP</span><span class="sy0">:</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">case</span> MotionEvent.<span class="me1">ACTION_CANCEL</span><span class="sy0">:</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> distanceX <span class="sy0">=</span> touchX <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mLastX</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> distanceY <span class="sy0">=</span> touchY <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mLastY</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">if</span> <span class="br0">(</span>pSceneTouchEvent.<span class="me1">getAction</span><span class="br0">(</span><span class="br0">)</span> <span class="sy0">==</span> MotionEvent.<span class="me1">ACTION_MOVE</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> triggerScrollMinimumDistance <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">mTriggerScrollMinimumDistance</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">if</span> <span class="br0">(</span><span class="kw1">this</span>.<span class="me1">mTriggered</span></pre></li>
<li class="li1"><pre class="de1"><span class="sy0">||</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">abs</span><span class="br0">(</span>distanceX<span class="br0">)</span> <span class="sy0">></span> triggerScrollMinimumDistance</pre></li>
<li class="li1"><pre class="de1"><span class="sy0">||</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">abs</span><span class="br0">(</span>distanceY<span class="br0">)</span> <span class="sy0">></span> triggerScrollMinimumDistance<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> distance <span class="sy0">=</span> <span class="br0">(</span><span class="kw4">float</span><span class="br0">)</span><a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">hypot</span><span class="br0">(</span><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span>distanceX,<span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span>distanceY<span class="br0">)</span><span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">double</span> angleX <span class="sy0">=</span> touchX <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstX</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> <span class="kw4">double</span> angleY <span class="sy0">=</span> touchY <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFirstY</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> angle <span class="sy0">=</span> <span class="br0">(</span><span class="kw4">float</span><span class="br0">)</span><a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">toDegrees</span><span class="br0">(</span><a href="http://www.google.com/search?hl=en&q=allinurl%3Amath+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">atan2</span><span class="br0">(</span>angleY, angleX<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCatapultDetectorListener</span>.<span class="me1">onCharge</span><span class="br0">(</span><span class="kw1">this</span>, pSceneTouchEvent, distance, angle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mLastX</span> <span class="sy0">=</span> touchX<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mLastY</span> <span class="sy0">=</span> touchY<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mTriggered</span> <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">else</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">default</span><span class="sy0">:</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Getter & Setter</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> setTriggerScrollMinimumDistance<span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw4">float</span> mTriggerScrollMinimumDistance<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mTriggerScrollMinimumDistance</span> <span class="sy0">=</span> mTriggerScrollMinimumDistance<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">float</span> getTriggerScrollMinimumDistance<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> mTriggerScrollMinimumDistance<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">float</span> getX<span class="br0">(</span><span class="kw1">final</span> TouchEvent pTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> pTouchEvent.<span class="me1">getX</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">protected</span> <span class="kw4">float</span> getY<span class="br0">(</span><span class="kw1">final</span> TouchEvent pTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> pTouchEvent.<span class="me1">getY</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Inner and Anonymous Classes</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// =========================================================== </span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">interface</span> ICatapultDetectorListener <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onCharge<span class="br0">(</span><span class="kw1">final</span> CatapultDetector pCatapultDetector,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TouchEvent pTouchEvent, <span class="kw1">final</span> <span class="kw4">float</span> pDistance,</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> <span class="kw4">float</span> pAngle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onShoot<span class="br0">(</span><span class="kw1">final</span> CatapultDetector pCatapultDetector,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TouchEvent pTouchEvent, <span class="kw1">final</span> <span class="kw4">float</span> pDistance,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">float</span> pAngle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
</ol><div class="foot">Parsed in 0.126 seconds at 38.60 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Good work today. I'm working on this Detector. The next chapter in the same subject.<br />
</p><br />
<br />
<h2>Source Code</h2><p>To get the source code: <b>svn checkout http://ch-soccer.googlecode.com/svn/trunk/ tutorial-read-only -r 7</b></p><br />
<h2>Index</h2><ul><li><a href="http://andenginefromscratch.blogspot.com/p/tutorial-index.html">Tutorial index</a></li>
</ul>Angelhttp://www.blogger.com/profile/01073241333005135564noreply@blogger.com15tag:blogger.com,1999:blog-4781273901910041475.post-76014453784698006032011-03-24T12:07:00.000-07:002011-04-06T14:39:10.047-07:00AndEngine from Scratch (III)<h2>Previously on AndEngine from Scratch</h2><br />
<ul><li><a href="http://andenginefromscratch.blogspot.com/p/tutorial-index.html">Tutorial index</a></li>
<li><a href="http://andenginefromscratch.blogspot.com/2011/03/introduccion-andengine-parte-i.html">Tutorial I</a></li>
<li><a href="http://andenginefromscratch.blogspot.com/2011/03/introduccion-andengine-parte-ii.html">Tutorial II</a></li>
</ul><br />
<h2>Today's Goals</h2><br />
<p>We have two objetives today:<br />
<ul><li>Splash Screen for the game</li>
<li>Create the grass background</li>
</ul></p><br />
<h2>Splash Screen</h2><br />
<p>Every game deserves a decent splash screen. Let's see how can we create a nice one. AndEngine has a BaseSPlashActivity. Go to Eclipse, in the package explorer, under src/com.pruebas.andengine and create a new class.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3QqCtVCY9ZiUEFJSrD4tySti51AlaUbQot6zr7HIwoH8Hs_CZt7NlO8oNEsSdz0GuCbxSKehqxtGB86Agdlsx37NeoWTmijk8wfFbjsbZSLbTdd_fdQLSEF3jYZxJUemeNNw9eOFCbSM1/s1600/paso1.png" /></div><br />
<p>Name SplashExample and in SuperClass we must search for BaseSplashActivity.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEQaLAeE9i9jEN5U-SJ1pJjBiPDpT-_u4qYlPMR8ZfmBBUKLBGA2SMBAt-wo8WI-6aUDmViv3MrcH_inr-aShgYVFrf7mJqdtr_0FqgziV0DS_X_pRQCLBhcBxHwQ3NPuhCXeu5SBBmFFP/s1600/paso2.png" /></div><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4ci3lewR5Dz0bRNnFkmoGO7ZAzi3adNtq3aNpFTaPJLlCjirWmkqglz-en7zmkQRzRmWwAzXevpmcfLdtVcfxZF3_RbGs-qCalsiCeNcE3qdnNoYYjo-Y2yoEc44OseQCLGF4lx7vwfRj/s1600/paso3.png" /></div><br />
<p>There is the result.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">com.pruebas.andengine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.source.ITextureSource</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.ui.activity.BaseSplashActivity</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">android.app.Activity</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> SplashExample <span class="kw1">extends</span> BaseSplashActivity <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="co1">//Ojo, porque esto no se ve bien aqui, dejadlo como Eclipse lo genera</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> Class<span class="sy0"><?</span> <span class="kw1">extends</span> Activity<span class="sy0">></span> getFollowUpActivity<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> ScreenOrientation getScreenOrientation<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">protected</span> <span class="kw4">float</span> getSplashDuration<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> ITextureSource onGetSplashTextureSource<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.074 seconds at 11.94 KB/s, using GeSHi 1.0.8.10</div></div><p><br />
Now let's touch some methods of the clase to show the splash screen we want. If you dont have a decent image, you can download this one. Remember save it as assets/gfx/splash.png.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgod3t7FLaaRTdCHsqlHrs64lZ4g1x-9y4YC2h64NTwlYiaNjdf54w2TjtAKFMgBOI-bM2A_c7trLrHhv-UZtnCzgC6-0xn1mt3iyyh5Dt4I6Zp1uk1FF_imjwgFkZxMe_RbXa1JFLbINXW/s1600/splash.png" /></div><br />
<br />
<p>Now touch the class SplashExample.java to show the splash from that file. Let's define some constants.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> SPLASH_DURATION <span class="sy0">=</span> <span class="nu0">3</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">float</span> SPLASH_SCALE_FROM <span class="sy0">=</span> 1f<span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.074 seconds at 3.24 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>SPLASH_DURATION Defines the time in seconds for the splash, three second is fine. The second constant defines the scale that the initial bitmap, try putting 0.5f and the image will make a animation.</p><p>In the first method getFollowUpActivity() we must return the Main activity of the game.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> Class<span class="sy0"><?</span> <span class="kw1">extends</span> Activity<span class="sy0">></span> getFollowUpActivity<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> Main.<span class="kw1">class</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.080 seconds at 1.19 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>The second method is getScreenOrientation(), we are working in LANDSCAPE.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">protected</span> ScreenOrientation getScreenOrientation<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> ScreenOrientation.<span class="me1">LANDSCAPE</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.082 seconds at 1.15 KB/s, using GeSHi 1.0.8.10</div></div><p>Third mehotd getSplashDuration(), we return the constant.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">float</span> getSplashDuration<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> SPLASH_DURATION<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.077 seconds at 1.01 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>And finally onGetSplashTextureSource(), we return the bitmap previously saved in assets/gfx. </p><br />
<br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">protected</span> ITextureSource onGetSplashTextureSource<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw1">new</span> AssetTextureSource<span class="br0">(</span><span class="kw1">this</span>, <span class="st0">"gfx/splash.png"</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
</ol><div class="foot">Parsed in 0.076 seconds at 1.51 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Now Let's implement a new method for the zoom an play some with it.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">protected</span> <span class="kw4">float</span> getSplashScaleFrom<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> SPLASH_SCALE_FROM<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.077 seconds at 1.06 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>We have now the SplashExample class, now let's put it in the AndroidManifest.xml and make it the default activiy.</p><br />
<div class="xml"><ol><li class="li1"><pre class="de1"><span class="sc3"><span class="re1"><activity</span> <span class="re0">android:name</span>=<span class="st0">"SplashExample"</span></span></pre></li>
<li class="li1"><pre class="de1"><span class="sc3"> <span class="re0">android:label</span>=<span class="st0">"@string/app_name"</span><span class="re2">></span></span></pre></li>
<li class="li1"><pre class="de1"><span class="sc3"><span class="re1"><intent-filter<span class="re2">></span></span></span></pre></li>
<li class="li1"><pre class="de1"><span class="sc3"><span class="re1"><action</span> <span class="re0">android:name</span>=<span class="st0">"android.intent.action.MAIN"</span> <span class="re2">/></span></span></pre></li>
<li class="li2"><pre class="de2"><span class="sc3"><span class="re1"><category</span> <span class="re0">android:name</span>=<span class="st0">"android.intent.category.LAUNCHER"</span> <span class="re2">/></span></span></pre></li>
<li class="li1"><pre class="de1"><span class="sc3"><span class="re1"></intent-filter<span class="re2">></span></span></span></pre></li>
<li class="li1"><pre class="de1"><span class="sc3"><span class="re1"></activity<span class="re2">></span></span></span></pre></li>
</ol><div class="foot">Parsed in 0.004 seconds at 87.19 KB/s, using GeSHi 1.0.8.10</div></div><br />
<br />
<p>We need to remove the intent-filter for the main activity. F11 to start the game and we can see the splash screen running.</p><br />
<h2>Background Grass</h2><br />
<p>To create the backgound seems to be several options. First i tried with a RepeatingSpriteBackground, but it doesn't scrool with the screen. Let's try with a TMXLoader, loading the level from a xml file.<br />
</p><br />
<p>Thankfully there is a free open source level editor available for most platforms. The first is to create a sprite with the grass background. There it is. Save it to assets/gfx as ussual.<br />
</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2sC-Q6zIdpcZtix9W-vplyws9UgY1KfHN1U-cXLtvf_gKLeOv8qSxHwzqNurZlSU_MnXtC6CP36iEjdo6gJ2HdPRbB24fnBCOO6lVrYJpLKlJpL5h5yKyhA6QCZTpWid_3pLLOD-_dwzF/s1600/background_tile.png" /></div><br />
<p>The way to create levels is based on tiled pngs. In our case we need four borders, left, right, top, bottom and a center one. Nine tiles.<br />
</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0G8UzdjN3hAuZXxVCMIIDQZyMykLzZHuyJJVw8sldtHpyWTrrhRIJGQt6Bp7_co9FiCrPF6mdki6xl1vG3ZUgJCAZ0mYiH07aXwKIUCcXQrjVA4uR4fj7wl8rP8k4-Wq9GJ6wu_2BXuMX/s1600/background_tile.png" /></div><br />
<p>There is the png with visible borders to you can make an idea of how it works. Nine tiles of 120X120. Now we mus get the level editor (tiled). In debian is as simple as "sudo apt-get install tiled". In other linux you probably have this software in the package manager of the distribution. In windows you can download the software from <a href="http://www.mapeditor.org/" target="_blank">the web</a>.<br />
<b>Caution:</b> After install, go to Edit->Preferences and in "Store Tile layer data as" -> "Base64 gzip compressed". If you dont do that, AndEngine will crash when you try to load the tmx file.</p><br />
<p>After a funny time, i get the tmx file. Now let's add to the project. Under the assets folder we create a folder named "tmx". Here we must put our maps. Mine looks like this:<br />
</p><div class="xml"><ol><li class="li1"><pre class="de1"><span class="sc3"><span class="re1"><map</span> <span class="re0">version</span>=<span class="st0">"1.0"</span> <span class="re0">orientation</span>=<span class="st0">"orthogonal"</span> <span class="re0">width</span>=<span class="st0">"4"</span> <span class="re0">height</span>=<span class="st0">"8"</span> <span class="re0">tilewidth</span>=<span class="st0">"120"</span> <span class="re0">tileheight</span>=<span class="st0">"120"</span><span class="re2">></span></span></pre></li>
<li class="li1"><pre class="de1"><span class="sc3"><span class="re1"><tileset</span> <span class="re0">firstgid</span>=<span class="st0">"1"</span> <span class="re0">name</span>=<span class="st0">"background"</span> <span class="re0">tilewidth</span>=<span class="st0">"120"</span> <span class="re0">tileheight</span>=<span class="st0">"120"</span><span class="re2">></span></span></pre></li>
<li class="li1"><pre class="de1"><span class="sc3"><span class="re1"><image</span> <span class="re0">source</span>=<span class="st0">"gfx/background_tile.png"</span><span class="re2">/></span></span></pre></li>
<li class="li1"><pre class="de1"><span class="sc3"><span class="re1"></tileset<span class="re2">></span></span></span></pre></li>
<li class="li2"><pre class="de2"><span class="sc3"><span class="re1"><layer</span> <span class="re0">name</span>=<span class="st0">"Capa de Patrones 1"</span> <span class="re0">width</span>=<span class="st0">"4"</span> <span class="re0">height</span>=<span class="st0">"8"</span><span class="re2">></span></span></pre></li>
<li class="li1"><pre class="de1"><span class="sc3"><span class="re1"><data</span> <span class="re0">encoding</span>=<span class="st0">"base64"</span> <span class="re0">compression</span>=<span class="st0">"gzip"</span><span class="re2">></span></span></pre></li>
<li class="li1"><pre class="de1">H4sIAAAAAAAAA2NlYGBghGI2IGYBYk4oZqYBnx2ImaCYA4gB8HAreoAAAAA=</pre></li>
<li class="li1"><pre class="de1"><span class="sc3"><span class="re1"></data<span class="re2">></span></span></span></pre></li>
<li class="li1"><pre class="de1"><span class="sc3"><span class="re1"></layer<span class="re2">></span></span></span></pre></li>
<li class="li2"><pre class="de2"><span class="sc3"><span class="re1"></map<span class="re2">></span></span></span></pre></li>
</ol><div class="foot">Parsed in 0.006 seconds at 69.25 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Look carefully at image-source, this point to gfx/background_tile.png, if you edit the map in tiled, you must count with that.</p><p>Before we put some code, i have Main.java like this:</p><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">com.pruebas.andengine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.Engine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.camera.ZoomCamera</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.EngineOptions</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.Scene</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.Scene.IOnSceneTouchListener</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.background.ColorBackground</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.sprite.Sprite</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.util.FPSLogger</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.TouchEvent</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.ScrollDetector</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.SurfaceScrollDetector</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.ScrollDetector.IScrollDetectorListener</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.Texture</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.TextureOptions</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.region.TextureRegion</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.region.TextureRegionFactory</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.ui.activity.BaseGameActivity</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">android.util.Log</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw1">class</span> Main <span class="kw1">extends</span> BaseGameActivity <span class="kw1">implements</span> IScrollDetectorListener,</pre></li>
<li class="li1"><pre class="de1">IOnSceneTouchListener <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_WIDTH <span class="sy0">=</span> <span class="nu0">480</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_HEIGHT <span class="sy0">=</span> <span class="nu0">320</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> TAG <span class="sy0">=</span> <span class="st0">"AndEngineTest"</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> ZoomCamera mCamera<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> Texture mTexture<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TextureRegion mFaceTextureRegion<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> SurfaceScrollDetector mScrollDetector<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Constructors</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Getter & Setter</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods for/from SuperClass/Interfaces</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadComplete<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Engine onLoadEngine<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span> <span class="sy0">=</span> <span class="kw1">new</span> ZoomCamera<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> <span class="kw4">int</span> alturaTotal <span class="sy0">=</span> CAMERA_HEIGHT <span class="sy0">*</span> <span class="nu0">3</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">setBounds</span><span class="br0">(</span><span class="nu0">0</span>, CAMERA_WIDTH, <span class="nu0">0</span>, alturaTotal<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">setBoundsEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw1">new</span> Engine<span class="br0">(</span><span class="kw1">new</span> EngineOptions<span class="br0">(</span><span class="kw2">true</span>, ScreenOrientation.<span class="me1">LANDSCAPE</span>,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">new</span> RatioResolutionPolicy<span class="br0">(</span>CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span>,</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mCamera</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadResources<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mTexture</span> <span class="sy0">=</span> <span class="kw1">new</span> Texture<span class="br0">(</span><span class="nu0">64</span>, <span class="nu0">64</span>,</pre></li>
<li class="li1"><pre class="de1">TextureOptions.<span class="me1">BILINEAR_PREMULTIPLYALPHA</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span> <span class="sy0">=</span> TextureRegionFactory.<span class="me1">createFromAsset</span><span class="br0">(</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTexture</span>, <span class="kw1">this</span>, <span class="st0">"gfx/ui_ball_1.png"</span>, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">getTextureManager</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">loadTexture</span><span class="br0">(</span><span class="kw1">this</span>.<span class="me1">mTexture</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> Scene onLoadScene<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">registerUpdateHandler</span><span class="br0">(</span><span class="kw1">new</span> FPSLogger<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Scene scene <span class="sy0">=</span> <span class="kw1">new</span> Scene<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setBackground</span><span class="br0">(</span><span class="kw1">new</span> ColorBackground<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, 0.8784f<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2">scene.<span class="me1">setOnAreaTouchTraversalFrontToBack</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span> <span class="sy0">=</span> <span class="kw1">new</span> SurfaceScrollDetector<span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">setEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> <span class="kw4">int</span> centerX <span class="sy0">=</span> <span class="br0">(</span>CAMERA_WIDTH <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span>.<span class="me1">getWidth</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> centerY <span class="sy0">=</span> <span class="br0">(</span>CAMERA_HEIGHT <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span></pre></li>
<li class="li1"><pre class="de1">.<span class="me1">getHeight</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Sprite ball <span class="sy0">=</span> <span class="kw1">new</span> Sprite<span class="br0">(</span>centerX, centerY,</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">getLastChild</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">attachChild</span><span class="br0">(</span>ball<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setOnSceneTouchListener</span><span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setTouchAreaBindingEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> scene<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw4">void</span> onScroll<span class="br0">(</span>ScrollDetector pScollDetector, TouchEvent pTouchEvent,</pre></li>
<li class="li1"><pre class="de1"><span class="kw4">float</span> pDistanceX, <span class="kw4">float</span> pDistanceY<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">offsetCenter</span><span class="br0">(</span><span class="sy0">-</span>pDistanceX, <span class="sy0">-</span>pDistanceY<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">boolean</span> onSceneTouchEvent<span class="br0">(</span>Scene pScene, TouchEvent pSceneTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">onTouchEvent</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Inner and Anonymous Classes</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
</ol><div class="foot">Parsed in 0.106 seconds at 43.53 KB/s, using GeSHi 1.0.8.10</div></div><p>Vamos a crear una variable para el TMXTiledMap.</p><pre class="brush: java">private TMXTiledMap mTMXTiledMap;
</pre><p>In the onLoadScene() method when we set the background color with<p><pre class="brush: java">scene.setBackground(new ColorBackground(0, 0, 0.8784f));
</pre><p>Change the code with this one</p><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">final</span> Scene scene <span class="sy0">=</span> <span class="kw1">new</span> Scene<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">try</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TMXLoader tmxLoader <span class="sy0">=</span> <span class="kw1">new</span> TMXLoader<span class="br0">(</span><span class="kw1">this</span>, <span class="kw1">this</span>.<span class="me1">mEngine</span></pre></li>
<li class="li2"><pre class="de2">.<span class="me1">getTextureManager</span><span class="br0">(</span><span class="br0">)</span>, TextureOptions.<span class="me1">NEAREST</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTMXTiledMap</span> <span class="sy0">=</span> tmxLoader.<span class="me1">loadFromAsset</span><span class="br0">(</span><span class="kw1">this</span>, <span class="st0">"tmx/field.tmx"</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw1">final</span> TMXLoadException tmxle<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1">Debug.<span class="me1">e</span><span class="br0">(</span>tmxle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TMXLayer tmxLayer <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">mTMXTiledMap</span>.<span class="me1">getTMXLayers</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">get</span><span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">getFirstChild</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">attachChild</span><span class="br0">(</span>tmxLayer<span class="br0">)</span><span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.088 seconds at 4.74 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Now we can try the background, F11 to see how it looks... Good, isn't it? It have a little problem with the terminal i'm trying on. When i do the vertical scroll a little black lines appears in some circunstances between the tiles. A little investigation in the AndEngine forums and see the solution. Let's go to the source, when we create the background texture, and change TextureOptions.BILINEAR_PREMULTIPLYALPHA to TextureOptions.NEAREST. Then we go to the method onLoadEngine() and put some code in the camera creation to round the camera coordinates to integer.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span> <span class="sy0">=</span> <span class="kw1">new</span> ZoomCamera<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onApplyMatrix<span class="br0">(</span>GL10 pGL<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2">GLHelper.<span class="me1">setProjectionIdentityMatrix</span><span class="br0">(</span>pGL<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">GLU.<span class="me1">gluOrtho2D</span><span class="br0">(</span>pGL, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span> <span class="kw1">this</span>.<span class="me1">getMinX</span><span class="br0">(</span><span class="br0">)</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span> <span class="kw1">this</span>.<span class="me1">getMaxX</span><span class="br0">(</span><span class="br0">)</span>,</pre></li>
<li class="li1"><pre class="de1"><span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span> <span class="kw1">this</span>.<span class="me1">getMaxY</span><span class="br0">(</span><span class="br0">)</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span> <span class="kw1">this</span>.<span class="me1">getMinY</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span><span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.091 seconds at 3.29 KB/s, using GeSHi 1.0.8.10</div></div><p>Perfect!! Problem solved. Now we have the code working well... there is my Main.java.<br />
</p><br />
<div class="java"><div class="head">Main.java</div><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">com.pruebas.andengine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.Engine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.camera.ZoomCamera</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.EngineOptions</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.TMXLayer</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.TMXLoader</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.TMXTiledMap</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.layer.tiled.tmx.util.exception.TMXLoadException</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.Scene</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.Scene.IOnSceneTouchListener</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.sprite.Sprite</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.util.FPSLogger</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.TouchEvent</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.ScrollDetector</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.SurfaceScrollDetector</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.ScrollDetector.IScrollDetectorListener</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.Texture</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.TextureOptions</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.region.TextureRegion</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.region.TextureRegionFactory</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.ui.activity.BaseGameActivity</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.util.Debug</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> Main <span class="kw1">extends</span> BaseGameActivity <span class="kw1">implements</span> IScrollDetectorListener,</pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">IOnSceneTouchListener <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_WIDTH <span class="sy0">=</span> <span class="nu0">480</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_HEIGHT <span class="sy0">=</span> <span class="nu0">320</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> TAG <span class="sy0">=</span> <span class="st0">"AndEngineTest"</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> ZoomCamera mCamera<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> Texture mTexture<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TextureRegion mFaceTextureRegion<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> SurfaceScrollDetector mScrollDetector<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TMXTiledMap mTMXTiledMap<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constructors</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Getter & Setter</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods for/from SuperClass/Interfaces</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw4">void</span> onLoadComplete<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> Engine onLoadEngine<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span> <span class="sy0">=</span> <span class="kw1">new</span> ZoomCamera<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> alturaTotal <span class="sy0">=</span> CAMERA_HEIGHT <span class="sy0">*</span> <span class="nu0">3</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">setBounds</span><span class="br0">(</span><span class="nu0">0</span>, CAMERA_WIDTH, <span class="nu0">0</span>, alturaTotal<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">setBoundsEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">return</span> <span class="kw1">new</span> Engine<span class="br0">(</span><span class="kw1">new</span> EngineOptions<span class="br0">(</span><span class="kw2">true</span>, ScreenOrientation.<span class="me1">LANDSCAPE</span>,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">new</span> RatioResolutionPolicy<span class="br0">(</span>CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span>,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadResources<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTexture</span> <span class="sy0">=</span> <span class="kw1">new</span> Texture<span class="br0">(</span><span class="nu0">64</span>, <span class="nu0">64</span>,</pre></li>
<li class="li1"><pre class="de1">TextureOptions.<span class="me1">BILINEAR_PREMULTIPLYALPHA</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span> <span class="sy0">=</span> TextureRegionFactory.<span class="me1">createFromAsset</span><span class="br0">(</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mTexture</span>, <span class="kw1">this</span>, <span class="st0">"gfx/ui_ball_1.png"</span>, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">getTextureManager</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">loadTexture</span><span class="br0">(</span><span class="kw1">this</span>.<span class="me1">mTexture</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> Scene onLoadScene<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">registerUpdateHandler</span><span class="br0">(</span><span class="kw1">new</span> FPSLogger<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Scene scene <span class="sy0">=</span> <span class="kw1">new</span> Scene<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">try</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TMXLoader tmxLoader <span class="sy0">=</span> <span class="kw1">new</span> TMXLoader<span class="br0">(</span><span class="kw1">this</span>, <span class="kw1">this</span>.<span class="me1">mEngine</span></pre></li>
<li class="li2"><pre class="de2">.<span class="me1">getTextureManager</span><span class="br0">(</span><span class="br0">)</span>, <span class="co1">// TextureOptions.BILINEAR_PREMULTIPLYALPHA,</span></pre></li>
<li class="li1"><pre class="de1">TextureOptions.<span class="me1">NEAREST</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTMXTiledMap</span> <span class="sy0">=</span> tmxLoader.<span class="me1">loadFromAsset</span><span class="br0">(</span><span class="kw1">this</span>, <span class="st0">"tmx/field.tmx"</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span> <span class="kw1">catch</span> <span class="br0">(</span><span class="kw1">final</span> TMXLoadException tmxle<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1">Debug.<span class="me1">e</span><span class="br0">(</span>tmxle<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> TMXLayer tmxLayer <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">mTMXTiledMap</span>.<span class="me1">getTMXLayers</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">get</span><span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">getFirstChild</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">attachChild</span><span class="br0">(</span>tmxLayer<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setOnAreaTouchTraversalFrontToBack</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span> <span class="sy0">=</span> <span class="kw1">new</span> SurfaceScrollDetector<span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">setEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> centerX <span class="sy0">=</span> <span class="br0">(</span>CAMERA_WIDTH <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span>.<span class="me1">getWidth</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> <span class="kw4">int</span> centerY <span class="sy0">=</span> <span class="br0">(</span>CAMERA_HEIGHT <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span></pre></li>
<li class="li1"><pre class="de1">.<span class="me1">getHeight</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Sprite ball <span class="sy0">=</span> <span class="kw1">new</span> Sprite<span class="br0">(</span>centerX, centerY,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">getLastChild</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">attachChild</span><span class="br0">(</span>ball<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2">scene.<span class="me1">setOnSceneTouchListener</span><span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setTouchAreaBindingEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> scene<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onScroll<span class="br0">(</span>ScrollDetector pScollDetector, TouchEvent pTouchEvent,</pre></li>
<li class="li1"><pre class="de1"><span class="kw4">float</span> pDistanceX, <span class="kw4">float</span> pDistanceY<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">offsetCenter</span><span class="br0">(</span><span class="sy0">-</span>pDistanceX, <span class="sy0">-</span>pDistanceY<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">boolean</span> onSceneTouchEvent<span class="br0">(</span>Scene pScene, TouchEvent pSceneTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">onTouchEvent</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Inner and Anonymous Classes</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.154 seconds at 33.72 KB/s, using GeSHi 1.0.8.10</div></div><p>Well, enough for today. In the next chapter we are gonna implement our own Detector, like the IScrollDetector we see in the previous chapter, but to archery games.</p><br />
<h2>Source Code</h2><p>To get the source code: <b>svn checkout http://ch-soccer.googlecode.com/svn/trunk/ tutorial-read-only -r 6</b></p><br />
<h2>Index</h2><ul><li><a href="http://andenginefromscratch.blogspot.com/p/tutorial-index.html">Tutorial index</a></li>
</ul>Angelhttp://www.blogger.com/profile/01073241333005135564noreply@blogger.com19tag:blogger.com,1999:blog-4781273901910041475.post-50238230279439248452011-03-21T12:19:00.000-07:002011-04-06T14:19:11.105-07:00AndEngine from Scratch (II)<h2>Previously on AndEngine from Scratch</h2><br />
<ul><li><a href="http://andenginefromscratch.blogspot.com/2011/03/introduccion-andengine-parte-i.html">Tutorial I</a></li>
</ul><br />
<h2>Creating our first object</h2><br />
<p>Before we create our first object, we are gonna touch the AndroidManifest.xml to add the permission to lock the phone from suspension. We go to the AndroidManifest.xml file in the root of our project and edit the file as xml. After the line <br />
<br />
<div class="xml"><ol><li class="li1"><pre class="de1"><span class="sc3"><span class="re1"><uses-sdk</span> <span class="re0">android:minSdkVersion</span>=<span class="st0">"4"</span> <span class="re2">/></span></span></pre></li>
</ol><div class="foot">Parsed in 0.001 seconds at 29.50 KB/s, using GeSHi 1.0.8.10</div></div><br />
We must put<br />
<br />
<div class="xml"><ol><li class="li1"><pre class="de1"><span class="sc3"><span class="re1"><uses-permission</span> <span class="re0">android:name</span>=<span class="st0">"android.permission.WAKE_LOCK"</span><span class="re2">/></span></span></pre></li>
</ol><div class="foot">Parsed in 0.001 seconds at 80.72 KB/s, using GeSHi 1.0.8.10</div></div></p><br />
<p>Let's create our first object in screen. To use images and other resources, Andengine doesn't use the typcal R from Android development. We must create a folder in assets called gfx.<br />
</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih2pTlEC8fL1qDmDNB5rspPEvJ_afSPLF3ml8yxIsPA1KSm1hyphenhyphenC3a5P6X66Blt3crI4KVQQ4KEh6oIxMQ9D-6M801Kkq7tpFrwOm3IgrnOcxLFY0dZS9B_G5rgxRAOpi9ClEXj-_melX_o/s1600/paso1.jpg" /></div><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0QWfVr3sziOokdVxQhFXfGD9SX5dAc4XYDERdyR8F5IY-LV2uXwgE1akzlXH8yn3zckGg6zSve0NKCTuKeSXeCQE_8HsLHwpwsomKuHayIuwTqYXs7fwIEwriRk84lKF3ckOgWjS7Fx4Z/s1600/paso2.jpg" /></div><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixW0mlE21RgOh333AiLA4ZhyphenhyphenbfE_v3hLzCJfnsFIZRAokmGUyEsPEFHXkQ7zuvnYzjn5lsqxYAnVTGj1jmwyYyO_8nY4Qgug8f53uQVmXPc9-a4DuIm41uEarxYY5U2FDDqULuziOKnZkE/s1600/paso3.jpg" /></div><br />
<p>Now download this image to your hard drive and put it in the assets/gfx recently created folder, you can directly save to the desired location or drag from your folder to the eclipse gfx folder.<br />
</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijp9v3MkWG2hP_BWUKV9RQgLc0d9y35xlEC5WKP6aM1r229D8ta2hxL5HU3sc5qKC00ilgdkSELApYfmM4d7Sl0gKBKzIv_bc-k1X6l4GuuBTXQ9XQ6wXaltVDY_QAqVXiSnCg0HHDmn_t/s1600/ui_ball_1.png" /></div><br />
<p>The next step is modify our source in Eclipse to show the image. In the part when we defined the camera, we must add two new variables.<br />
</p><div class="xml"><ol><li class="li1"><pre class="de1">// ===========================================================</pre></li>
<li class="li1"><pre class="de1">// Fields</pre></li>
<li class="li1"><pre class="de1">// ===========================================================</pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">private ZoomCamera mCamera;</pre></li>
<li class="li1"><pre class="de1">private Texture mTexture;</pre></li>
<li class="li1"><pre class="de1">private TextureRegion mFaceTextureRegion;</pre></li>
</ol><div class="foot">Parsed in 0.000 seconds at 1133.54 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>In the onLoadResources() method need to load the image to memory.</p><br />
<div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadResources<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTexture</span> <span class="sy0">=</span> <span class="kw1">new</span> Texture<span class="br0">(</span><span class="nu0">64</span>, <span class="nu0">64</span>, TextureOptions.<span class="me1">BILINEAR_PREMULTIPLYALPHA</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span> <span class="sy0">=</span> TextureRegionFactory.<span class="me1">createFromAsset</span><span class="br0">(</span><span class="kw1">this</span>.<span class="me1">mTexture</span>, <span class="kw1">this</span>, <span class="st0">"gfx/ui_ball_1.png"</span>, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">getTextureManager</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">loadTexture</span><span class="br0">(</span><span class="kw1">this</span>.<span class="me1">mTexture</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.082 seconds at 3.62 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>And finally, in the onLoadScene() method put some code to show the image centered in the screen</p><br />
<div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Scene onLoadScene<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">registerUpdateHandler</span><span class="br0">(</span><span class="kw1">new</span> FPSLogger<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> Scene scene <span class="sy0">=</span> <span class="kw1">new</span> Scene<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setBackground</span><span class="br0">(</span><span class="kw1">new</span> ColorBackground<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, 0.8784f<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> centerX <span class="sy0">=</span> <span class="br0">(</span>CAMERA_WIDTH <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span>.<span class="me1">getWidth</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> centerY <span class="sy0">=</span> <span class="br0">(</span>CAMERA_HEIGHT <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span>.<span class="me1">getHeight</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="coMULTI">/* Dibujamos la bola en el centro de la pantalla. */</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Sprite ball <span class="sy0">=</span> <span class="kw1">new</span> Sprite<span class="br0">(</span>centerX, centerY, <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">getLastChild</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">attachChild</span><span class="br0">(</span>ball<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> scene<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.091 seconds at 5.85 KB/s, using GeSHi 1.0.8.10</div></div><br />
<p>Now run our project and we can see what we expected on the screen.</p><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWYycIg8A_nEBZm8hOszr0RXZwrtrEMusPmPsAvWZhQMUGNendHI_fIB-aawnBcBqDZvt54BTD0BFcxLDLgMxBxKpti8wQA3016Gy2njW8HG9ZUPTKCmBoGAkW5YKf-mvvGZuJ328jegsR/s1600/device_1.png" /></div><br />
<p>Until now everything runs correctly. Now let's control the camera movement touching the screen.<br />
</p><br />
<br />
<h2>Constrolling Scroll</h2><br />
<p>In order to the scroll to work, we need our Main class to implement two interfaces.</p><br />
<ul><li><b>IScrollDetectorListener: </b> This class that AndEngine bring to us is to control the scroll movement. We must add the interface and implement the necessary methods.</p><li><b>IOnSceneTouchListener: </b> This class give us the posibility to control the touchScreen.</p></ul><p>The class looks like this:</p><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> Main <span class="kw1">extends</span> BaseGameActivity <span class="kw1">implements</span> IScrollDetectorListener, IOnSceneTouchListener </pre></li>
</ol><div class="foot">Parsed in 0.072 seconds at 1.37 KB/s, using GeSHi 1.0.8.10</div></div><p>Let's implement the two necessary methods-</p><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onScroll<span class="br0">(</span>ScrollDetector pScollDetector, TouchEvent pTouchEvent,</pre></li>
<li class="li1"><pre class="de1"><span class="kw4">float</span> pDistanceX, <span class="kw4">float</span> pDistanceY<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">boolean</span> onSceneTouchEvent<span class="br0">(</span>Scene pScene, TouchEvent pSceneTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.079 seconds at 2.81 KB/s, using GeSHi 1.0.8.10</div></div><p>Now let's put some code into the methods. In the onScroll we put only a Debug Message.</p><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onScroll<span class="br0">(</span>ScrollDetector pScollDetector, TouchEvent pTouchEvent,</pre></li>
<li class="li1"><pre class="de1"><span class="kw4">float</span> pDistanceX, <span class="kw4">float</span> pDistanceY<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1">Log.<span class="me1">d</span><span class="br0">(</span>TAG, <span class="st0">"Scroll {x:"</span><span class="sy0">+</span>pDistanceX<span class="sy0">+</span><span class="st0">", y: "</span><span class="sy0">+</span>pDistanceY<span class="sy0">+</span><span class="st0">"}"</span><span class="br0">)</span><span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.076 seconds at 2.31 KB/s, using GeSHi 1.0.8.10</div></div><p>In the TouchEvent, we pass directly the params to the ScrollDetector.</p><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">boolean</span> onSceneTouchEvent<span class="br0">(</span>Scene pScene, TouchEvent pSceneTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">onTouchEvent</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.077 seconds at 1.88 KB/s, using GeSHi 1.0.8.10</div></div><p>We must touch a little the LoadScene() method in order to the Engine Listen the TouchScreen events.</p><div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">public</span> Scene onLoadScene<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">registerUpdateHandler</span><span class="br0">(</span><span class="kw1">new</span> FPSLogger<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> Scene scene <span class="sy0">=</span> <span class="kw1">new</span> Scene<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setBackground</span><span class="br0">(</span><span class="kw1">new</span> ColorBackground<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, 0.8784f<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setOnAreaTouchTraversalFrontToBack</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span> <span class="sy0">=</span> <span class="kw1">new</span> SurfaceScrollDetector<span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">setEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> centerX <span class="sy0">=</span> <span class="br0">(</span>CAMERA_WIDTH <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span>.<span class="me1">getWidth</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> centerY <span class="sy0">=</span> <span class="br0">(</span>CAMERA_HEIGHT <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span>.<span class="me1">getHeight</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="coMULTI">/* Dibujamos la bola en el centro de la pantalla. */</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Sprite ball <span class="sy0">=</span> <span class="kw1">new</span> Sprite<span class="br0">(</span>centerX, centerY, <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">getLastChild</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">attachChild</span><span class="br0">(</span>ball<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">scene.<span class="me1">setOnSceneTouchListener</span><span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setTouchAreaBindingEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> scene<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.084 seconds at 8.84 KB/s, using GeSHi 1.0.8.10</div></div><p>Add the ScrollDetector to Fields.</p><div class="java"><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> ZoomCamera mCamera<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> Texture mTexture<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TextureRegion mFaceTextureRegion<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> SurfaceScrollDetector mScrollDetector<span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.080 seconds at 3.48 KB/s, using GeSHi 1.0.8.10</div></div><p>Let's go to the Debug Perspective and let's define to filters to see the information in a confortable way. We must create "AndEngineTest" and "AndEngine" filters.</p><div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHTYmH2S3g4T72K1gVLkWBBNI317Mpv5bg5zTMcvPGhINr-Q1TzONBwbFq0dVU0HKhJAxvck1_DLIRSCtINHwUzm6yziS6oJ6bh5A9n-AoKnncyu4g1wQIhBrjx01wlF5gXHwEUGj-v3Zh/s1600/paso4.jpg" /></div><div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9dYzh8J6jkb1T6GaqAOyWvNG80-GutECqGK8jHQf9jvHMR7FZdDSvVqyvW1iTu2eK80Xxdu5tcfByRSp1WE5WY3ePa_eqbkH-UIV1Uotyd-2SsCGu8jmrCf-4u44FQuJVr_5Ph2EkkmlH/s1600/paso5.jpg" /></div><div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfNGqi8PuiSWdCP7jrKpZR823VtUkfUKzES1jTOSUo1wCmnl56z7ZWh2CObnSvxNbOCHOXcXxSa2owggnLPMFNA9LnS79D9uI8haG385OGgIMmXiLej0IWOIwNSi2TPbuxglWozSi6_AZy/s1600/paso6.jpg" /></div><div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgje3PmsQKLTddDd1_8immC6YSQI1n4PgZMgghZq7Ee5pSH6DSQGvRVQ8izq7rxAMe7uMkBpoHqh3df0cs4PZk3SGOfIj-PIFhkoPYGH86Mu1SW2DySv3u8VYA6HFQOTpq-aZ3Zw55YFs3n/s1600/paso7.jpg" /></div><p>Now we have the Eclipse ready to see some information about what's going on. Debug the project (F11), switch to Debug Perspective and tap with the finger in the screen (or the mouse in the emulator) and move around. This is what we must see in the debug window. </p><p>Now, the Main.java file looks like this:</p><div class="java"><div class="head">Main.java</div><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">com.pruebas.andengine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.Engine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.camera.ZoomCamera</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.EngineOptions</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.Scene</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.Scene.IOnSceneTouchListener</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.background.ColorBackground</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.sprite.Sprite</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.util.FPSLogger</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.TouchEvent</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.ScrollDetector</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.SurfaceScrollDetector</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.input.touch.detector.ScrollDetector.IScrollDetectorListener</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.Texture</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.TextureOptions</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.region.TextureRegion</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.opengl.texture.region.TextureRegionFactory</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.ui.activity.BaseGameActivity</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">android.util.Log</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw1">class</span> Main <span class="kw1">extends</span> BaseGameActivity <span class="kw1">implements</span> IScrollDetectorListener,</pre></li>
<li class="li1"><pre class="de1">IOnSceneTouchListener <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_WIDTH <span class="sy0">=</span> <span class="nu0">480</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_HEIGHT <span class="sy0">=</span> <span class="nu0">320</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> TAG <span class="sy0">=</span> <span class="st0">"AndEngineTest"</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> ZoomCamera mCamera<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> Texture mTexture<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> TextureRegion mFaceTextureRegion<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> SurfaceScrollDetector mScrollDetector<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Constructors</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Getter & Setter</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods for/from SuperClass/Interfaces</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadComplete<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Engine onLoadEngine<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span> <span class="sy0">=</span> <span class="kw1">new</span> ZoomCamera<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">return</span> <span class="kw1">new</span> Engine<span class="br0">(</span><span class="kw1">new</span> EngineOptions<span class="br0">(</span><span class="kw2">true</span>, ScreenOrientation.<span class="me1">LANDSCAPE</span>,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">new</span> RatioResolutionPolicy<span class="br0">(</span>CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span>,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadResources<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mTexture</span> <span class="sy0">=</span> <span class="kw1">new</span> Texture<span class="br0">(</span><span class="nu0">64</span>, <span class="nu0">64</span>,</pre></li>
<li class="li1"><pre class="de1">TextureOptions.<span class="me1">BILINEAR_PREMULTIPLYALPHA</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span> <span class="sy0">=</span> TextureRegionFactory.<span class="me1">createFromAsset</span><span class="br0">(</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mTexture</span>, <span class="kw1">this</span>, <span class="st0">"gfx/ui_ball_1.png"</span>, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">getTextureManager</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">loadTexture</span><span class="br0">(</span><span class="kw1">this</span>.<span class="me1">mTexture</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Scene onLoadScene<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">registerUpdateHandler</span><span class="br0">(</span><span class="kw1">new</span> FPSLogger<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> Scene scene <span class="sy0">=</span> <span class="kw1">new</span> Scene<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setBackground</span><span class="br0">(</span><span class="kw1">new</span> ColorBackground<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, 0.8784f<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setOnAreaTouchTraversalFrontToBack</span><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span> <span class="sy0">=</span> <span class="kw1">new</span> SurfaceScrollDetector<span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">setEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> centerX <span class="sy0">=</span> <span class="br0">(</span>CAMERA_WIDTH <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span>.<span class="me1">getWidth</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> centerY <span class="sy0">=</span> <span class="br0">(</span>CAMERA_HEIGHT <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span></pre></li>
<li class="li1"><pre class="de1">.<span class="me1">getHeight</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="coMULTI">/* Dibujamos la bola en el centro de la pantalla. */</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Sprite ball <span class="sy0">=</span> <span class="kw1">new</span> Sprite<span class="br0">(</span>centerX, centerY,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mFaceTextureRegion</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">getLastChild</span><span class="br0">(</span><span class="br0">)</span>.<span class="me1">attachChild</span><span class="br0">(</span>ball<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setOnSceneTouchListener</span><span class="br0">(</span><span class="kw1">this</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setTouchAreaBindingEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> scene<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onScroll<span class="br0">(</span>ScrollDetector pScollDetector, TouchEvent pTouchEvent,</pre></li>
<li class="li1"><pre class="de1"><span class="kw4">float</span> pDistanceX, <span class="kw4">float</span> pDistanceY<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2">Log.<span class="me1">d</span><span class="br0">(</span>TAG, <span class="st0">"Scroll {x:"</span> <span class="sy0">+</span> pDistanceX <span class="sy0">+</span> <span class="st0">", y: "</span> <span class="sy0">+</span> pDistanceY <span class="sy0">+</span> <span class="st0">"}"</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">boolean</span> onSceneTouchEvent<span class="br0">(</span>Scene pScene, TouchEvent pSceneTouchEvent<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mScrollDetector</span>.<span class="me1">onTouchEvent</span><span class="br0">(</span>pSceneTouchEvent<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Inner and Anonymous Classes</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
</ol><div class="foot">Parsed in 0.117 seconds at 37.52 KB/s, using GeSHi 1.0.8.10</div></div><div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVsH8HLp7VqTqwY0ujLxvUvrK_-yQBt9JRwiu_UF5qWG1GFEDaGC_hT1lagu8drLbdUqxw0kH_Xe2AfMBGGQKgMJ1E09SfB2o_kxdRzeBnETe1CmYDCUIyXf943Z5cTrGgDPr3H9uL2VrL/s1600/debug1.jpg" /></div><div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzQTWkv-WrnrcfwrzF1yX4IKN8U54IAEF1JL3ZFZFSwKH7_U5O0KAyrYyQVsUTt3BRIflM3qXwFP37fNT6DPW3uKhsWpnnHftgT2ZxnEeySRefTmdosSWoEL7E6B3-PpZX_hSIRpatXAsz/s1600/debug2.jpg" /></div><p>In the AndEngine filter, we can see some AndEngine messages, inicialization, and the FPS of the game. In the AndEngineTest fiter, we can see the debug messages we put in the sources.</p><p>In my case, i have moved the finger first up and then down verticaly, and in the debug i can see correct messages. Changing values in the Y axis. </p><p>We have suscefully detected the movement of the finger on the screen, and AndEngine bring to us some classes to make the process easier.Let's define some boundaries.</p><h2>Controling the camera</h2><p>Some code to put on the onScroll() method</p><div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onScroll<span class="br0">(</span>ScrollDetector pScollDetector, TouchEvent pTouchEvent,</pre></li>
<li class="li1"><pre class="de1"><span class="kw4">float</span> pDistanceX, <span class="kw4">float</span> pDistanceY<span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">offsetCenter</span><span class="br0">(</span><span class="sy0">-</span>pDistanceX, <span class="sy0">-</span>pDistanceY<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span> </pre></li>
</ol><div class="foot">Parsed in 0.079 seconds at 2.26 KB/s, using GeSHi 1.0.8.10</div></div><p>We debug and we now can move the camera with scroll movements of the finger. But it has no limits, we need to define them. </p><div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Engine onLoadEngine<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span> <span class="sy0">=</span> <span class="kw1">new</span> ZoomCamera<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span><span class="sy0">;</span> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> <span class="kw4">int</span> alturaTotal <span class="sy0">=</span> CAMERA_HEIGHT<span class="sy0">*</span><span class="nu0">3</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">setBounds</span><span class="br0">(</span><span class="nu0">0</span>, CAMERA_WIDTH, <span class="nu0">0</span>, alturaTotal<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span>.<span class="me1">setBoundsEnabled</span><span class="br0">(</span><span class="kw2">true</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw1">new</span> Engine<span class="br0">(</span><span class="kw1">new</span> EngineOptions<span class="br0">(</span><span class="kw2">true</span>, ScreenOrientation.<span class="me1">LANDSCAPE</span>,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">new</span> RatioResolutionPolicy<span class="br0">(</span>CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span>,</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.088 seconds at 4.41 KB/s, using GeSHi 1.0.8.10</div></div><p>Well... that ends the phase two. The next lesson we are going to put some background, and play with sprites.</p><h2>Source Code</h2><p>To get the source code: <b>svn checkout http://ch-soccer.googlecode.com/svn/trunk/ tutorial-read-only -r 4</b></p>
<h2>Index</h2><ul><li><a href="http://andenginefromscratch.blogspot.com/p/tutorial-index.html">Tutorial index</a></li>
</ul>Angelhttp://www.blogger.com/profile/01073241333005135564noreply@blogger.com20tag:blogger.com,1999:blog-4781273901910041475.post-35499246585032225882011-03-21T10:15:00.000-07:002011-12-05T13:42:45.535-08:00AndEngine from Scratch (I)<h2>What's AndEngine</h2><a href="http://www.andengine.org/" target="_blank">AndEngine</a> is a 2d Engine OpenGL for the Android platform. <br />
There is the AndEngine Core Terminology taken directly from <a href="http://www.andengine.org/forums/tutorials/andengine-core-terminology-t316.html" target="_blank">the AndEngine forums</a>.<br />
<ul><li><b>BaseGameActivity:</b> The BaseGameActivity is the root of a game, that contains an Engine and manages to create a SurfaceView the contents of the Engine will be drawn into. There is always exactly one Engine for one BaseGameActivity. You can proceed from one BaseGameActivity to another using common Android mechanisms.</li>
<li><b>Engine:</b> The Engine make the game proceed in small discrete steps of time. The Engine manages to synchronize a periodic drawing and updating of the Scene, which contains all the content that your game is currently handling actively. There usually is one Scene per Engine, except for the SplitScreenEngines.</li>
<li><b>IResolutionPolicy:</b> An implementation of the IResolutionPolicy interface is part of the EngineOptions. It tells AndEngine how to deal with the different screen-sizes of different devices. I.e. RatioResolutionPolicy will maximize the SurfaceView to the limiting size of the screen, while keeping a specific ratio. That means objects won't be distorted while the SurfaceView has the maximum size possible.</li>
<li><b>Camera:</b> A Camera defines the rectangle of the scene that is drawn on the screen, as not the whole scene is visible all the time. Usually there is one Camera per Scene, except for the SplitScreenEngines. There are subclasses that allow zooming and smooth position changes of the Camera.</li>
<li><b>Scene:</b> The Scene class is the root container for all objects to be drawn on the screen. A Scene has a specific amount of Layers, which themselves can contain a (fixed or dynamic) amount of Entities. There are subclasses, like the CameraScene/HUD/MenuScene that are drawing themselves to the same position of the Scene no matter where the camera is positioned to.</li>
<li><b>Entity:</b> An Entitiy is an object that can be drawn, like Sprites, Rectangles, Text or Lines. An Entity has a position/rotation/scale/color/etc...</li>
<li><b>Texture:</b> A Texture is a 'image' in the memory of the graphics chip. On Android the width and height of a Texture has to be a power of 2. Therefore AndEngine assembles a Texture from a couple of ITextureSources, so the space can be used better.</li>
<li><b>ITextureSource:</b> An implmentation of the ITextureSource-interface like AssetTextureSource manages to load an image onto a specific position in the Texture.</li>
<li><b>TextureRegion:</b> A TextureRegion defines a rectangle on the Texture. A TextureRegion is used by Sprites to let the system know what part of the big Texture the Sprite is showing.<br />
</li>
<li><b>PhysicsConnector:</b> A PhysicsConnector manages to update the AndEngine-Shapes (like Rectangles/Sprites/etc...) when their physics representations "bodies" change. Once using Physics (and a PhysicsConnector) with an AndEngine-Shape you'd disable the Physics calculated by AndEngine itself, by calling setUpdatePhysics(false) to the Shape. Changes made to the AndEngine-Shape are not reflected in the Physics - you have to call the methods on the Body object you have used to create the PhysicsConnector.</li>
</ul><br />
<h2>Getting AndEngine</h2><br />
To get Andengine, you can download sources from <a href="http://www.andengine.org/" target="_blank">http://www.andengine.org</a> or you can download a <a href="http://www.mediafire.com/?sz7xjjohbk3vo6o" target="_blank">jar file</a>. I'm using the jar file option.<br />
<br />
First download <a href="http://www.mediafire.com/?sz7xjjohbk3vo6o" target="_blank">this file</a> and keep it in your computer.<br />
<br />
<h2>Eclipse project Creation</h2><br />
Start new Project with File -> New Project.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPlCE2EdopWwxHNzL07zGz2IibrxknnUkO0En5IRyKSHic_ZVhj3oW8BtajWp7DUWC3UQff6fwkuHAhNkC6Mly1cGioD-GVoOXmNzlUIIAHR2_kmBTS4aJkwESXpCBBQGJynO6ZqipsavK/s1600/paso1.jpg" /></div><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQCTgnEAJ-gUdEKiz3oACyafrqDB0iICjA6wayHOwP44aWKB0h4dm-Z_mfMsB1GTP_v8ipI-ddhZFVMaaj0h3xMpBh2iDlG89Jc7ABC6mh8h4-lj4TbahKon8VV4tCgevL1Ufa0vEeZpYA/s1600/paso2.jpg" /></div><br />
Next, Finish.. Now we create a lib folder under the root directory of our project.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVMg4OEBi6ZG5EoLfhWWamnDNiFUcLqlkPLQOgK7C-CwUubNnJP8rQ9VHONkbMiL5ISeI7ZdJpUt3rbrisZ2x1zZr5u8PJD_rW9oz_iv7i4DkFGQUsGqYzVEF8pE7pmY95vT8OeZWjtfZy/s1600/paso3.jpg" /></div><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDLcofQ7B9iAD5yIWfFxVbNZX6eUhiPrsrhAdS4emwI9X96JZWB1ivALUk8hbwfF6GBUDpuHM-hGAxvrERL93FHTzwk9H_IrCNWUE-sKOuAoJl33w0gpO5rmobjqjjDzHbbnh51vh8w126/s1600/paso4.jpg" /></div><br />
Now drag the <a href="http://www.mediafire.com/?sz7xjjohbk3vo6o" target="_blank">jar file</a> previously downloaded to the lib folder in Eclipse. It looks like this..<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_CJL_MKd-vN_m46V9dUYFfGEsvlphGbtRxKjRg8zXmUp5KqLW5FiHYPJGU7i3EJBfxrlBDaHPCGRPIkwoPPP4TfHKHW-saKmxoT4Mks7SUO8jQWZEKVqwYyFtdjvnCh_hejBMLv39QUpJ/s1600/paso5.jpg" /></div><br />
Now Right Button on the andengine.jar file and Build Path -> Add to Build Path.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2b5Yl2N1phiWqOHJNejegEcyQI4XyEMhZDKEZh-p_uXNFJIHiNc8VPmFLT-iquBB5V5emhNnMUqsi94eFFvcqM3IfOMQCT38CbKhNRCp9nAQ8e7j2B0yAapz6_VpsNEvWFggW7W5ZrKPI/s1600/paso6.jpg" /></div><br />
Now the go to Main.java file and change Activity to BaseGameActivity. delete the default constructor, organize imports, and implement the BaseGameActivity methods. Now it should look like this code below.<br />
<br />
<br />
<div class="java"><div class="head">Main.java</div><ol><li class="li1"><pre class="de1"><span class="kw1">package</span> <span class="co2">com.pruebas.andengine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.Engine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.Scene</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.ui.activity.BaseGameActivity</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">android.os.Bundle</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> Main <span class="kw1">extends</span> BaseGameActivity <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw4">void</span> onLoadComplete<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Engine onLoadEngine<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadResources<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Scene onLoadScene<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.072 seconds at 8.45 KB/s, using GeSHi 1.0.8.10</div></div><br />
Now let's change a little the file to make it clear.<br />
<br />
<br />
<div class="java"><div class="head">Main.java</div><ol><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.Engine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.Scene</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.ui.activity.BaseGameActivity</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw1">class</span> Main <span class="kw1">extends</span> BaseGameActivity <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Constructors</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Getter &amp; Setter</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods for/from SuperClass/Interfaces</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadComplete<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Engine onLoadEngine<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadResources<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> Scene onLoadScene<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Inner and Anonymous Classes</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// =========================================================== </span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
</ol><div class="foot">Parsed in 0.092 seconds at 17.27 KB/s, using GeSHi 1.0.8.10</div></div><h2>Let's Start</h2><br />
Now we need a camera object to the proper view of the game. Let's create variables to define the screen resolution we are going to work for and a TAG variable for debugging purposes.<br />
<br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_WIDTH <span class="sy0">=</span> <span class="nu0">480</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_HEIGHT <span class="sy0">=</span> <span class="nu0">320</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> TAG <span class="sy0">=</span> <span class="st0">"AndEngineTest"</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> ZoomCamera mCamera<span class="sy0">;</span></pre></li>
</ol><div class="foot">Parsed in 0.076 seconds at 5.72 KB/s, using GeSHi 1.0.8.10</div></div><br />
Now let's write some code on the on the onLoadEngine() method.<br />
<br />
<br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">public</span> Engine onLoadEngine<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span> <span class="sy0">=</span> <span class="kw1">new</span> ZoomCamera<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw1">new</span> Engine<span class="br0">(</span><span class="kw1">new</span> EngineOptions<span class="br0">(</span><span class="kw2">true</span>, ScreenOrientation.<span class="me1">LANDSCAPE</span>, <span class="kw1">new</span> RatioResolutionPolicy<span class="br0">(</span>CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span>, <span class="kw1">this</span>.<span class="me1">mCamera</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.084 seconds at 2.84 KB/s, using GeSHi 1.0.8.10</div></div><br />
We have a camera object now. Let's implement the method onLoadScene() and put some background color.<br />
<br />
<div class="java"><ol><li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Scene onLoadScene<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">registerUpdateHandler</span><span class="br0">(</span><span class="kw1">new</span> FPSLogger<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">final</span> Scene scene <span class="sy0">=</span> <span class="kw1">new</span> Scene<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setBackground</span><span class="br0">(</span><span class="kw1">new</span> ColorBackground<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, 0.8784f<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> scene<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.076 seconds at 2.66 KB/s, using GeSHi 1.0.8.10</div></div><br />
After organize imports and some organization...<br />
<br />
<div class="java"><ol><li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.Engine</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.camera.ZoomCamera</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.EngineOptions</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.Scene</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.scene.background.ColorBackground</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.entity.util.FPSLogger</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">import</span> <span class="co2">org.anddev.andengine.ui.activity.BaseGameActivity</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw1">class</span> Main <span class="kw1">extends</span> BaseGameActivity <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constants</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_WIDTH <span class="sy0">=</span> <span class="nu0">480</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">static</span> <span class="kw1">final</span> <span class="kw4">int</span> CAMERA_HEIGHT <span class="sy0">=</span> <span class="nu0">320</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&q=allinurl%3Astring+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> TAG <span class="sy0">=</span> <span class="st0">"AndEngineTest"</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Fields</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="kw1">private</span> ZoomCamera mCamera<span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Constructors</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Getter &amp; Setter</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods for/from SuperClass/Interfaces</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li2"><pre class="de2"><span class="kw1">public</span> <span class="kw4">void</span> onLoadComplete<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Engine onLoadEngine<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mCamera</span> <span class="sy0">=</span> <span class="kw1">new</span> ZoomCamera<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> <span class="kw1">new</span> Engine<span class="br0">(</span><span class="kw1">new</span> EngineOptions<span class="br0">(</span><span class="kw2">true</span>, ScreenOrientation.<span class="me1">LANDSCAPE</span>, <span class="kw1">new</span> RatioResolutionPolicy<span class="br0">(</span>CAMERA_WIDTH, CAMERA_HEIGHT<span class="br0">)</span>, <span class="kw1">this</span>.<span class="me1">mCamera</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">void</span> onLoadResources<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// TODO Auto-generated method stub</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1">@Override</pre></li>
<li class="li1"><pre class="de1"><span class="kw1">public</span> Scene onLoadScene<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></pre></li>
<li class="li1"><pre class="de1"><span class="kw1">this</span>.<span class="me1">mEngine</span>.<span class="me1">registerUpdateHandler</span><span class="br0">(</span><span class="kw1">new</span> FPSLogger<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">final</span> Scene scene <span class="sy0">=</span> <span class="kw1">new</span> Scene<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1">scene.<span class="me1">setBackground</span><span class="br0">(</span><span class="kw1">new</span> ColorBackground<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">0</span>, 0.8784f<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="kw1">return</span> scene<span class="sy0">;</span></pre></li>
<li class="li2"><pre class="de2"><span class="br0">}</span></pre></li>
<li class="li1"><pre class="de1"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Methods</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li2"><pre class="de2"> </pre></li>
<li class="li1"><pre class="de1"><span class="co1">// ===========================================================</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// Inner and Anonymous Classes</span></pre></li>
<li class="li1"><pre class="de1"><span class="co1">// =========================================================== </span></pre></li>
<li class="li1"><pre class="de1"><span class="br0">}</span></pre></li>
</ol><div class="foot">Parsed in 0.093 seconds at 26.05 KB/s, using GeSHi 1.0.8.10</div></div><br />
<br />
Let's start the application to see a Background color. In the Top menu "Run" Configurations<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdTi4dPiKmOsXLl9RDAu2Qj0YCK-EugDgT_JKhn4hNCDTOEnnfvKkQKLbXveANbtKZ5SCSldjmHxApylNOPUQoi06yi2KxXfQpVgJxLa5E8gWAUjpzf7u8BaM4G-uWPibuqdzfEOEIgQ3Y/s1600/paso7.jpg" /></div><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkRmMYk7ks9iwo2fGYduCa1gxPC2O5Q-VWB3ysXp99kT3qASsYmOp7hiVswXDY7qrt_-uLJplQ7b1oR2bfKjgzQPGTKqgDSM3_rr_UwRBWVlAytZvqx73GBsQJaE0gTtAA-YkKFzalN3QT/s1600/paso8.jpg" /></div><br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhux7WAulVfHMv8Bq9-k7HFj3sbigUH0D7StDzsNUeFQnVbTwTKV2JC_TYVZyBxbMMYsyC3_q-r8dCTPwEuIULApVHpQ_7hzqBA4MGWEwLZgdb9R4I3C6rqJUZyp4cTyDmbaME8lh7Uk5_X/s1600/paso9.jpg" /></div><br />
Apply -> Run and now we see in the terminal our first AndEngine application.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY4raHHUGk981ywpOgcNHxkBkNYXqFE0acV1sb0w9A2Ep-yGq12tdvwFTwXcOahNep-KgklSz0xQDonDU9V28Qz7nL7mc9nUYuUIlrQ43MhUKNzBDyaK_p5kUY3B15QXAZ3b0zYUDrh6it/s1600/device.png" /></div><br />
This is the end of the first lesson in the series. In the second tutorial, we are gonna paint some objects in the screen, and implement scrolling with TouchEvents.<br />
<br />
<h2>Source Code</h2><br />
<p>To get the source code: <b>svn checkout http://ch-soccer.googlecode.com/svn/trunk/ tutorial-read-only -r 3</b></p><br />
<br />
<h2>Index</h2><ul><li><a href="http://andenginefromscratch.blogspot.com/p/tutorial-index.html">Tutorial index</a></li>
</ul>Angelhttp://www.blogger.com/profile/01073241333005135564noreply@blogger.com14