{"id":195830,"date":"2013-09-30T18:48:03","date_gmt":"2013-09-30T14:48:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=195830"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=195830","title":{"rendered":"<span class=\"post_title\">\u041f\u0438\u0448\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0433\u0440 \u2014 Mechanic Framework<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c, \u0436\u0438\u0442\u0435\u043b\u0438 \u0425\u0430\u0431\u0440\u0430!<br \/>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c Mechanic Framework \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0433\u0440 \u043f\u043e\u0434 \u0430\u043d\u0434\u0440\u043e\u0438\u0434.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/e01\/494\/b86\/e01494b86e1d1ad52fb3dff6540d7d9d.png\" alt=\"image\"\/><\/p>\n<h4>\u0427\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f:<\/h4>\n<p>  <\/p>\n<ul>\n<li> \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 Eclipse \u0438 Android SDK<\/li>\n<li> \u041f\u0440\u0438\u043b\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u043d\u0438\u0435 Java \u043b\u0438\u0431\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0421-\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430. \u041b\u0443\u0447\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2013 C#<\/li>\n<li> \u0422\u0435\u0440\u043f\u0435\u043d\u0438\u0435<\/li>\n<\/ul>\n<p>  <a name=\"habracut\"><\/a><br \/>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442.<br \/>  File \u2013 New \u2013 Other \u2013 Android Application Project<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/e59\/c84\/56b\/e59c8456b5e639df88ce51662e5a96b9.png\" alt=\"image\"\/><br \/>  \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043a\u043e\u0448\u043a\u043e New Android Application. \u0412\u0432\u043e\u0434\u0438\u043c \u043b\u044e\u0431\u043e\u0435 \u0438\u043c\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Mechanic), \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c package \u0441\u0432\u043e\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0430\u043d\u0434\u0440\u043e\u0438\u0434 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Next.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/11d\/3e8\/130\/11d3e81306d5ae5e392b2402ea355ab7.png\" alt=\"image\"\/><br \/>  \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Next.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/25f\/b34\/2f0\/25fb342f085bffa4cdbcc8bac25bed43.png\" alt=\"image\"\/><br \/>  \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0443 (\u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0438\u043a\u043e\u043d\u043a\u0430 \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0430, \u0436\u043c\u0438\u0442\u0435 Clipart \u2013 Choose \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c, \u043b\u0438\u0431\u043e \u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0432\u043e\u044e \u0438\u043a\u043e\u043d\u043a\u0443).<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/e19\/3ea\/548\/e193ea548916b45018e5ab9b3a8df14a.png\" alt=\"image\"\/><br \/>  \u0416\u043c\u0435\u043c Next.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/0ba\/841\/366\/0ba8413665a3d32bc9bc90d9cd119374.png\" alt=\"image\"\/><br \/>  \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f Activity, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, MyGame, \u0436\u043c\u0435\u043c Finish.<\/p>\n<p>  \u041e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f .xml \u043e\u043a\u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e.<br \/>  \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c AndroidManifest.xml \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043d\u0443\u0436\u0434\u044b<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/46e\/349\/0e1\/46e3490e1265c4d0e57fd435f6877100.png\" alt=\"image\"\/><\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043d\u0430 \u043a\u0430\u0440\u0442\u0443 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438 \u043d\u0435 \u0437\u0430\u0433\u0440\u044f\u0437\u043d\u044f\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0432 \u043f\u043e\u043b\u0435 manifest \u043f\u0438\u0448\u0435\u043c   <\/p>\n<pre><code class=\"xml\">android:installLocation=&quot;preferExternal&quot; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u043f\u0438\u0448\u0435\u043c \u0432 \u043f\u043e\u043b\u0435 application  <\/p>\n<pre><code class=\"xml\">android:debuggable=&quot;true&quot; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u043f\u043e\u0440\u0442\u0440\u0435\u0442\u043d\u043e\u043c \u043b\u0438\u0431\u043e \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 (\u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c), \u0432 \u043f\u043e\u043b\u0435 activity \u043f\u0438\u0448\u0435\u043c  <\/p>\n<pre><code class=\"xml\">android:screenOrientation=&quot;landscape&quot; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u043c\u043e\u0433\u043b\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043e\u0439, \u043f\u0438\u0448\u0435\u043c \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u043b\u0435  <\/p>\n<pre><code class=\"xml\">android:configChanges=&quot;keyboard|keyboardHidden|orientation&quot; <\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 Google Play, \u0432\u044b \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u0430\u0440\u0442\u0435 \u043f\u0430\u043c\u044f\u0442\u0438\/\u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443 \u0438 \u043f\u0440\u043e\u0447\u0438\u043c \u0432\u0435\u0449\u0430\u043c, \u0442\u0430\u043a \u0432\u043e\u0442, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u043a\u0430\u0440\u0442\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u044d\u043a\u0440\u0430\u043d\u0430 \u043f\u0440\u0438 \u0431\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438, \u043f\u0438\u0448\u0435\u043c  <\/p>\n<pre><code class=\"xml\">\t&lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;\/&gt; \t&lt;uses-permission android:name=&quot;android.permission.WAKE_LOCK&quot;\/&gt; <\/code><\/pre>\n<p>  \u0412\u0438\u0434 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439  <\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;manifest xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;     package=&quot;com.frame&quot;     android:versionCode=&quot;1&quot;     android:versionName=&quot;1.0&quot;     android:installLocation=&quot;preferExternal&quot;&gt;      &lt;uses-sdk         android:minSdkVersion=&quot;8&quot;         android:targetSdkVersion=&quot;18&quot; \/&gt;      &lt;application         android:allowBackup=&quot;true&quot;         android:icon=&quot;@drawable\/ic_launcher&quot;         android:label=&quot;@string\/app_name&quot;         android:theme=&quot;@style\/AppTheme&quot;         android:debuggable=&quot;true&quot; &gt;         &lt;activity             android:name=&quot;com.frame.MyGame&quot;             android:screenOrientation=&quot;landscape&quot;             android:configChanges=&quot;keyboard|keyboardHidden|orientation&quot;             android:label=&quot;@string\/app_name&quot; &gt;             &lt;intent-filter&gt;                 &lt;action android:name=&quot;android.intent.action.MAIN&quot; \/&gt;                  &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; \/&gt;             &lt;\/intent-filter&gt;         &lt;\/activity&gt;     &lt;\/application&gt;      \t&lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;\/&gt; \t&lt;uses-permission android:name=&quot;android.permission.WAKE_LOCK&quot;\/&gt; &lt;\/manifest&gt;  <\/code><\/pre>\n<p>  \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0440\u043a\u0430\u0441 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u2013 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0432\u0432\u043e\u0434\u043e\u043c, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u043c, \u0430 \u043f\u043e\u0437\u0436\u0435 \u0432\u0441\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c.<br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/5db\/983\/e75\/5db983e758d8596f3cc1e5fd0119676f.png\" alt=\"image\"\/><\/p>\n<h4>\u0412\u0432\u043e\u0434<\/h4>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 package \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c com.mechanic.input<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Input \u0432 \u044d\u0442\u043e\u043c package, \u0438 \u0434\u043e\u0432\u043e\u0434\u0438\u043c \u0435\u0433\u043e \u0434\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430  <\/p>\n<pre><code class=\"java\">public interface Input { \tpublic static class MechanicKeyEvent \t{ \t\tpublic static final int KEY_DOWN = 0, KEY_UP = 1; \t\t \t\tpublic int Type; \t\tpublic int KeyCode; \t\tpublic char KeyChar; \t}  \tpublic static class MechanicTouchEvent \t{ \t\tpublic static final int TOUCH_DOWN = 0, TOUCH_UP = 1, TOUCH_DRAGGED = 2; \t\t \t\tpublic int Type; \t\tpublic int X, Y; \t\tpublic int Pointer; \t} \t \tpublic boolean IsKeyPressed(int KeyCode); \tpublic boolean IsKeyPressed(char KeyChar); \t \tpublic boolean IsTouchDown(int pointer); \tpublic int GetTouchX(int pointer); \tpublic int GetTouchY(int pointer); \t \tpublic float GetAccelX(); \tpublic float GetAccelY(); \tpublic float GetAccelZ(); \t \tpublic List&lt;MechanicTouchEvent&gt; GetTouchEvents(); \tpublic List&lt;MechanicKeyEvent&gt; GetKeyEvents(); } <\/code><\/pre>\n<p>  GetKeyDown \u2013 \u0431\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u0434 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 true, \u0435\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0430<br \/>  GetTouchDown \u2013 \u0431\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 true, \u0435\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442 \u044d\u043a\u0440\u0430\u043d, \u043f\u0440\u0438\u0447\u0435\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u043e\u043c\u0435\u0440 \u043f\u0430\u043b\u044c\u0446\u0430, \u043d\u0430\u0436\u0430\u0432\u0448\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d. \u0421\u0442\u0430\u0440\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Multitouch.<br \/>  GetTouchX \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 X-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u043d\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0438<br \/>  GetTouchY \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Y-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u043d\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0438<br \/>  \u041e\u0431\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u043e\u043c\u0435\u0440 \u043f\u0430\u043b\u044c\u0446\u0430<br \/>  GetAccelX, GetAccelY, GetAccelZ \u2013 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u0430. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u0440\u0436\u0438\u043c \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u0432 \u043f\u043e\u0440\u0442\u0440\u0435\u0442\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0432\u0432\u0435\u0440\u0445, \u0442\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u0441\u0438 Y \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e 9.6 \u043c\/\u04412, \u043f\u043e \u043e\u0441\u044f\u043c X \u0438 Z 0 \u043c\/\u04412.<\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 MechanicKeyEvent \u0438 MechanicTouchEvent<br \/>  \u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0438. Type \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043b\u0438\u0431\u043e KEY_DOWN \u043b\u0438\u0431\u043e KEY_UP. KeyCode \u0438 KeyChar \u0445\u0440\u0430\u043d\u044f\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0432 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u043c \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u0442\u0438\u043f\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0435\u043d\u043d\u043e.<br \/>  \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 X \u0438 Y \u2013 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0430\u043b\u044c\u0446\u0430, \u043d\u0430\u0436\u0438\u043c\u0430\u044e\u0449\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d, Pointer \u2013 \u043d\u043e\u043c\u0435\u0440 \u043f\u0430\u043b\u044c\u0446\u0430. TOUCH_DRAGGED \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u0430\u043b\u044c\u0446\u0430.<\/p>\n<p>  \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u0432\u043b\u0435\u0447\u044c\u0441\u044f \u0438 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043d\u0430\u043b\u0430\u0436\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Input.<br \/>  \u0417\u0430 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440, \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 Input, \u0430 \u0442\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u0447\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b Accelerometer, Keyboard \u0438 Touch \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. Input \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u044d\u0442\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0445\u0438\u0442\u0440\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0424\u0430\u0441\u0430\u0434\u00bb.<\/p>\n<p>  \u0412\u043e\u0442 \u044d\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b  <\/p>\n<pre><code class=\"java\">public interface Accelerometer extends SensorEventListener { \tpublic float GetAccelX(); \tpublic float GetAccelY(); \tpublic float GetAccelZ(); } <\/code><\/pre>\n<pre><code class=\"java\">public interface Keyboard extends OnKeyListener { \tpublic boolean IsKeyPressed(int keyCode); \tpublic List&lt;KeyEvent&gt; GetKeyEvents(); } <\/code><\/pre>\n<pre><code class=\"java\">public interface Touch extends OnTouchListener { \tpublic boolean IsTouchDown(int pointer); \tpublic int GetTouchX(int pointer); \tpublic int GetTouchY(int pointer); \t \tpublic List&lt;TouchEvent&gt; GetTouchEvents(); } <\/code><\/pre>\n<p>  \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e Input \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u0430 \u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0447\u0435\u0441\u0442\u043d\u043e \u0438 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.<\/p>\n<h4>\u0424\u0430\u0439\u043b\u044b<\/h4>\n<p>  \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438. \u041d\u0430\u0448 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f FileIO, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441 File \u0443\u0436\u0435 \u0435\u0441\u0442\u044c.<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 package com.mechanic.fileio \u0438 \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 \u043d\u0435\u043c  <\/p>\n<pre><code class=\"java\">public interface FileIO { \tpublic InputStream ReadAsset(String name) throws IOException; \tpublic InputStream ReadFile(String name) throws IOException; \tpublic OutputStream WriteFile(String name) throws IOException; } <\/code><\/pre>\n<p>  \u041e\u0431\u044b\u0447\u043d\u043e \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0432\u0441\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0437\u0432\u0443\u043a\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043f\u043a\u0435 assets \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u0435\u0440\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0438\u0437 assets, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0439 \u043c\u043e\u0440\u043e\u043a\u0438 \u0441 AssetsManager. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 2 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e. \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0435\u0435 \u00abfile.txt\u00bb, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00ab.mechanicsave\u00bb \u2014 \u0442\u0430\u043a \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e.<\/p>\n<h4>\u0417\u0432\u0443\u043a\u0438<\/h4>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c package com.mechanic.audio \u0438 \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Audio  <\/p>\n<pre><code class=\"java\">public interface Audio { \tpublic Music NewMusic(String name); \tpublic Sound NewSound(String name); } <\/code><\/pre>\n<p>  \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c 2 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2013 \u043e\u0431\u044b\u0447\u043d\u044b\u0439, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0437\u0432\u0443\u043a \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e, \u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0437\u0432\u0443\u043a\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u043e\u0432 \u0438 \u0432\u0437\u0440\u044b\u0432\u043e\u0432, \u0430 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u043c\u0443\u0437\u044b\u043a\u0438 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0437\u0432\u0443\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0437\u0432\u0443\u043a\u043e\u0432, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u044f \u0437\u0432\u0443\u043a\u0438 \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u044f \u0438\u0445. \u0417\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u0437\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b Sound \u0438 Music. \u0412\u043e\u0442 \u0438\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f  <\/p>\n<pre><code class=\"java\">public interface Sound { \tpublic void Play(float volume); \tpublic void Close(); } <\/code><\/pre>\n<pre><code class=\"java\">public interface Music extends OnCompletionListener { \tpublic void Close(); \tpublic boolean IsLooping(); \tpublic boolean IsPlaying(); \tpublic boolean IsStopped(); \tpublic void Play(); \tpublic void SetLooping(boolean loop); \tpublic void SetVolume(float volume); \tpublic void Stop(); } <\/code><\/pre>\n<h4>\u0413\u0440\u0430\u0444\u0438\u043a\u0430<\/h4>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c package com.mechanic.graphics<br \/>  \u0417\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Graphics<br \/>  \u0412\u043e\u0442 \u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435  <\/p>\n<pre><code class=\"java\">public interface Graphics { \tpublic static enum ImageFormat \t{ \t\tARGB_8888, ARGB_4444, RGB_565 \t} \t \tpublic Image NewImage(String fileName); \t \tpublic void Clear(int color); \tpublic void DrawPixel(int x, int y, int color); \tpublic void DrawLine(int x, int y, int x2, int y2, int color); \tpublic void DrawRect(int x, int y, int width, int height, int color); \t \tpublic void DrawImage(Image image, int x, int y, int srcX, int srcY, \t\t\tint srcWidth, int srcHeight); \t \tpublic void DrawImage(Image image, int x, int y); \tpublic int GetWidth(); \tpublic int GetHeight(); } <\/code><\/pre>\n<p>  ImageFormat \u2013 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u044e\u0449\u0435\u0435 \u0432\u044b\u0431\u043e\u0440 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0412\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u043e\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442, \u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u043a\u0443\u0434\u0430 \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442, \u0438\u043c\u0435\u0435\u0442 \u0435\u0449\u0435 \u043a\u0443\u0447\u0443 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 Config, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a.<br \/>  NewImage \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043c\u044b \u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c<br \/>  \u041c\u0435\u0442\u043e\u0434\u044b \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438 Draw\u2026 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0441\u0430\u043c\u0438 \u0437\u0430 \u0441\u0435\u0431\u044f, \u043f\u0440\u0438\u0447\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 DrawImage \u0440\u0438\u0441\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u2013 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e.<br \/>  GetWidth \u0438 GetHeight \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u00ab\u043f\u043e\u043b\u043e\u0442\u043d\u0430\u00bb, \u0433\u0434\u0435 \u043c\u044b \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438<\/p>\n<p>  \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u2013 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a  <\/p>\n<pre><code class=\"java\">public interface Image { \tpublic int GetWidth(); \tpublic int GetHeight(); \tpublic ImageFormat GetFormat(); \tpublic void Dispose(); } <\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u0440\u0430\u0441\u043d\u043e\u0440\u0435\u0447\u0438\u0432\u043e<\/p>\n<h4>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u0439<\/h4>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c package com.mechanic.game<br \/>  \u041e\u0441\u0442\u0430\u043b\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2013 Game  <\/p>\n<pre><code class=\"java\">public interface Game { \tpublic Input GetInput(); \tpublic FileIO GetFileIO(); \tpublic Graphics GetGraphics(); \tpublic Audio GetAudio(); \tpublic void SetScreen(Screen screen); \tpublic Screen GetCurrentScreen(); \tpublic Screen GetStartScreen(); } <\/code><\/pre>\n<p>  \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0445\u0430\u0435\u043c \u0442\u0443\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0441\u044b \u2013 \u0442\u0435\u043c\u044b \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0433\u043b\u0430\u0432.<br \/>  \u041d\u043e \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Screen?<\/p>\n<p>  \u041f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043e\u0442\u0432\u043b\u0435\u0447\u044c\u0441\u044f. \u041f\u043e\u0447\u0442\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0433\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u00ab\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\u00bb \u2014 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e, \u043c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u044d\u043a\u0440\u0430\u043d \u0440\u0435\u043a\u043e\u0440\u0434\u043e\u0432, \u0432\u0441\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 \u0438 \u0442.\u0434. \u0438 \u0442.\u043f. \u041d\u0435\u043c\u0443\u0434\u0440\u0435\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0445\u043e\u0442\u044f \u0431\u044b 5 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0432\u0432\u0435\u0440\u0433\u043d\u0443\u0442\u044c \u043d\u0430\u0441 \u0432 \u043f\u0443\u0447\u0438\u043d\u0443 \u043a\u043e\u0434\u0430. \u041d\u0430\u0441 \u0441\u043f\u0430\u0441\u0430\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Screen  <\/p>\n<pre><code class=\"java\">public abstract class Screen { \tprotected final Game game; \t \tpublic Screen(Game game) \t{ \t\tthis.game = game; \t} \tpublic abstract void Update(float deltaTime); \tpublic abstract void Present(float deltaTime); \tpublic abstract void Pause(); \tpublic abstract void Resume(); \tpublic abstract void Dispose(); } <\/code><\/pre>\n<p>  \u041a\u0430\u0436\u0434\u044b\u0439 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a Screen (MainMenuScreen, SettingsScreen) \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u0430\u043a\u043e\u0435 \u00ab\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u00bb. \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<br \/>  Update \u2013 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435<br \/>  Present \u2013 \u043f\u043e\u043a\u0430\u0437 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 (\u0432\u0432\u0435\u0434\u0435\u043d\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f)<br \/>  Pause \u2013 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0438\u0433\u0440\u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 (\u0431\u043b\u043e\u043a \u044d\u043a\u0440\u0430\u043d\u0430)<br \/>  Resume \u2013 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0443\u0437\u044b<br \/>  Dispose \u2013 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a<\/p>\n<p>  \u0421\u0442\u043e\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 deltaTime, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0432 2 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<br \/>  \u0411\u043e\u043b\u0435\u0435 \u0438\u0441\u043a\u0443\u0448\u0435\u043d\u043d\u044b\u043c \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043a\u043e\u0433\u0434\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u044b (\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430) \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043e\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0442.\u0435. \u0435\u0441\u043b\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e x \u043d\u0430 1 \u043a\u0430\u0436\u0434\u044b\u0439 \u0446\u0438\u043a\u043b, \u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0438 \u043d\u0430 \u043d\u0435\u0442\u0431\u0443\u043a\u0435, \u0438 \u043d\u0430 \u043a\u043e\u043c\u043f\u0435 \u0441 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u043e\u0439.<\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u0440\u0443\u042a-\u0432\u0430\u0440\u0438\u0430\u043d\u0442:  <\/p>\n<pre><code class=\"java\">\t@Override \tpublic void Update(float deltaTime) \t{  \t\tx += 150 * deltaTime;  \t} <\/code><\/pre>\n<p>  \u041d\u0435 \u0442\u0440\u0443\u042a-\u0432\u0430\u0440\u0438\u0430\u043d\u0442:  <\/p>\n<pre><code class=\"java\">\t@Override \tpublic void Update(float deltaTime) \t{  \t\tx += 150;  \t} <\/code><\/pre>\n<p>  \u0415\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u2013 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044f x \u043d\u0430 1.0f*deltaTime, \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0441 \u043d\u0435\u0446\u0435\u043b\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043e\u0442 0 \u0434\u043e 1 \u043d\u0435 \u0434\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0437\u0430\u0441\u0438\u043c x \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c float<\/p>\n<p>  \u041a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u043a\u0440\u0430\u043d\u044b? \u0412\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 Game<br \/>  \u0417\u0430 \u0432\u0441\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f SetScreen. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<p>  \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u0441\u0431\u043e\u0440\u043d\u0438\u043a!<\/p>\n<h4>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0432\u0432\u043e\u0434\u0430<\/h4>\n<p>  \u0412\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 Input \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 GetKeyEvents \u0438 GetTouchEvents, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e \u0441\u043b\u0443\u0447\u0430\u044e \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0435\u043c \u0447\u0438\u0441\u0442\u0438\u0442 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430. \u0421\u043a\u0430\u0436\u0438\u0442\u0435 \u043c\u043d\u0435, \u0432 \u0447\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0442\u043e\u0440\u043c\u043e\u0437\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0430\u043d\u0434\u0440\u043e\u0438\u0434? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u2013 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430! \u041d\u0430\u043c \u043d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e \u043f\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 Pool, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u00abobject pooling\u00bb, \u0441\u043f\u043e\u0441\u043e\u0431, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u041c\u0430\u0440\u0438\u043e \u0426\u0435\u0445\u043d\u0435\u0440\u0430 \u00ab\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0433\u0440 \u0434\u043b\u044f Android\u00bb.<\/p>\n<p>  \u0415\u0433\u043e \u0441\u043c\u044b\u0441\u043b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0434\u0430\u0435\u043c \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0443 \u043c\u0443\u0441\u043e\u0440\u0430 \u043c\u0435\u0448\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0438 \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u043c \u043f\u043e\u043f\u0443\u0441\u0442\u0443 \u043d\u0443\u0436\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b  <\/p>\n<pre><code class=\"java\">public class Pool&lt;T&gt; { \tpublic interface PoolFactory&lt;T&gt; \t{ \t\tpublic T Create(); \t} \t \tprivate final List&lt;T&gt; Objects; \tprivate final PoolFactory&lt;T&gt; Factory; \tprivate final int MaxSize; \t \tpublic Pool(PoolFactory&lt;T&gt; Factory, int MaxSize) \t{ \t\tthis.Factory = Factory; \t\tthis.MaxSize = MaxSize; \t\tObjects = new ArrayList&lt;T&gt;(MaxSize); \t} \t \tpublic T NewObject() \t{ \t\tT obj = null; \t\tif (Objects.size() == 0) \t\t\tobj = Factory.Create(); \t\telse \t\t\tobj = Objects.remove(Objects.size() - 1); \t\t \t\treturn obj; \t} \t \tpublic void Free(T object) \t{ \t\tif (Objects.size() &lt; MaxSize) \t\t\tObjects.add(object); \t} } <\/code><\/pre>\n<p>  \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 Pool pool. \u0412\u043e\u0442 \u0442\u0430\u043a \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c  <\/p>\n<pre><code class=\"java\">\t\tPoolFactory&lt;MechanicTouchEvent&gt; factory = new PoolFactory&lt;MechanicTouchEvent&gt;() \t\t{ \t\t\t@Override \t\t\tpublic MechanicTouchEvent Create() \t\t\t{ \t\t\t\treturn new MechanicTouchEvent(); \t\t\t} \t\t}; \t\t \t\tTouchEventPool = new Pool&lt;MechanicTouchEvent&gt;(factory, 100); <\/code><\/pre>\n<p>  \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0443\u043b\u0430  <\/p>\n<pre><code class=\"java\">TouchEventPool.Free(event); <\/code><\/pre>\n<p>  \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043f\u0443\u043b\u0435  <\/p>\n<pre><code class=\"java\">event = TouchEventPool.NewObject(); <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438\u0437 \u043f\u0443\u043b\u0430. \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u044b \u0435\u0433\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u043f\u0443\u043b \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430.<br \/>  \u041e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0432\u0435\u0449\u044c!<\/p>\n<p>  MechanicAccelerometer  <\/p>\n<pre><code class=\"java\">package com.mechanic.input;  import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorManager;  public class MechanicAccelerometer implements Accelerometer { \tfloat accelX, accelY, accelZ; \t \t \tpublic MechanicAccelerometer(Context context) \t{ \t\tSensorManager manager = (SensorManager) \t\t\t\tcontext.getSystemService(Context.SENSOR_SERVICE); \t\t \t\tif(manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() &gt; 0) \t\t{ \t\t\tSensor accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0); \t\t\tmanager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); \t\t} \t} \t \t@Override \tpublic void onAccuracyChanged(Sensor sensor, int accuracy) \t{  \t}  \t@Override \tpublic void onSensorChanged(SensorEvent event) \t{ \t\taccelX = event.values[0]; \t\taccelY = event.values[1]; \t\taccelZ = event.values[2]; \t}  \t@Override \tpublic float GetAccelX() \t{ \t\treturn accelX; \t}  \t@Override \tpublic float GetAccelY() \t{ \t\treturn accelY; \t}  \t@Override \tpublic float GetAccelZ() \t{ \t\treturn accelZ; \t} } <\/code><\/pre>\n<p>  \u041a\u0440\u043e\u043c\u0435 Accelerometer, \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0435\u0449\u0435 SensorEventListener \u2013 \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0434 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u043e\u043c, \u043d\u043e \u0438 \u043d\u0430\u0434 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u0438\u0433\u0440\u0443\u0448\u043a\u0430\u043c\u0438 \u2013 \u043a\u043e\u043c\u043f\u0430\u0441\u043e\u043c, \u0444\u043e\u043d\u0430\u0440\u0438\u043a\u043e\u043c, \u0447\u0442\u043e-\u0442\u043e \u0435\u0449\u0435. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440.<br \/>  \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u0443. \u0412\u043e\u043e\u0431\u0449\u0435 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 1, \u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e (\u044d\u0442\u043e \u0436\u0435 List, \u0430 \u043d\u0435 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442), \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0436\u0435 \u043e\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0434\u0438\u043d. \u0415\u0441\u043b\u0438 \u0447\u0438\u0441\u043b\u043e \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435 0, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 listener\u2019a (\u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f). onAccuracyChanged \u043d\u0443\u0436\u0435\u043d, \u0435\u0441\u043b\u0438 \u0441\u0431\u0438\u043b\u0430\u0441\u044c \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u043d\u0441\u043e\u0440\u0430, \u043c\u044b \u044d\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c. onSensorChanged \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u0430, \u0442\u0443\u0442-\u0442\u043e \u043c\u044b \u0438 \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f.<\/p>\n<p>  MechanicTouch  <\/p>\n<pre><code class=\"java\">package com.mechanic.input;  import java.util.ArrayList; import java.util.List;  import com.mechanic.input.Input.MechanicTouchEvent; import com.mechanic.input.Pool.PoolFactory;  import android.os.Build.VERSION; import android.view.MotionEvent; import android.view.View;  public class MechanicTouch implements Touch { \tboolean EnableMultiTouch; \tfinal int MaxTouchers = 20; \tboolean[] IsTouched = new boolean[MaxTouchers]; \tint[] TouchX = new int[MaxTouchers]; \tint[] TouchY = new int[MaxTouchers]; \tPool&lt;MechanicTouchEvent&gt; TouchEventPool; \tList&lt;MechanicTouchEvent&gt; TouchEvents = new ArrayList&lt;MechanicTouchEvent&gt;(); \tList&lt;MechanicTouchEvent&gt; TouchEventsBuffer = new ArrayList&lt;MechanicTouchEvent&gt;(); \tfloat ScaleX; \tfloat ScaleY; \t \tpublic MechanicTouch(View view, float scaleX, float scaleY) \t{ \t\tif(Integer.parseInt(VERSION.SDK) &lt; 5) \t\t\tEnableMultiTouch = false; \t\telse \t\t\tEnableMultiTouch = true; \t\t \t\tPoolFactory&lt;MechanicTouchEvent&gt; factory = new PoolFactory&lt;MechanicTouchEvent&gt;() \t\t{ \t\t\t@Override \t\t\tpublic MechanicTouchEvent Create() \t\t\t{ \t\t\t\treturn new MechanicTouchEvent(); \t\t\t} \t\t}; \t\t \t\tTouchEventPool = new Pool&lt;MechanicTouchEvent&gt;(factory, 100); \t\tview.setOnTouchListener(this); \t\t \t\tthis.ScaleX = scaleX; \t\tthis.ScaleY = scaleY; \t} \t \t@Override \tpublic boolean onTouch(View v, MotionEvent event) \t{ \t\tsynchronized (this) \t\t{ \t\t\tint action = event.getAction() & MotionEvent.ACTION_MASK; \t\t\t \t\t\t@SuppressWarnings(&quot;deprecation&quot;) \t\t\tint pointerIndex = (event.getAction() & \t\t\tMotionEvent.ACTION_POINTER_ID_MASK) \t\t\t&gt;&gt; MotionEvent.ACTION_POINTER_ID_SHIFT; \t\t\t \t\t\tint pointerId = event.getPointerId(pointerIndex); \t\t\t \t\t\tMechanicTouchEvent TouchEvent; \t\t\t \t\t\tswitch (action) \t\t\t{ \t\t\t\tcase MotionEvent.ACTION_DOWN: \t\t\t\tcase MotionEvent.ACTION_POINTER_DOWN: \t\t\t\t\tTouchEvent = TouchEventPool.NewObject(); \t\t\t\t\tTouchEvent.Type = MechanicTouchEvent.TOUCH_DOWN; \t\t\t\t\tTouchEvent.Pointer = pointerId; \t\t\t\t\tTouchEvent.X = TouchX[pointerId] = (int)(event.getX(pointerIndex) * ScaleX); \t\t\t\t\tTouchEvent.Y = TouchY[pointerId] = (int)(event.getY(pointerIndex) * ScaleY); \t\t\t\t\tIsTouched[pointerId] = true; \t\t\t\t\tTouchEventsBuffer.add(TouchEvent); \t\t\t\tbreak; \t\t\t\t \t\t\t\tcase MotionEvent.ACTION_UP: \t\t\t\tcase MotionEvent.ACTION_POINTER_UP: \t\t\t\tcase MotionEvent.ACTION_CANCEL: \t\t\t\t\tTouchEvent = TouchEventPool.NewObject(); \t\t\t\t\tTouchEvent.Type = MechanicTouchEvent.TOUCH_UP; \t\t\t\t\tTouchEvent.Pointer = pointerId; \t\t\t\t\tTouchEvent.X = TouchX[pointerId] = (int)(event.getX(pointerIndex) * ScaleX); \t\t\t\t\tTouchEvent.Y = TouchY[pointerId] = (int)(event.getY(pointerIndex) * ScaleY); \t\t\t\t\tIsTouched[pointerId] = false; \t\t\t\t\tTouchEventsBuffer.add(TouchEvent); \t\t\t\tbreak; \t\t\t\t \t\t\t\tcase MotionEvent.ACTION_MOVE: \t\t\t\t\tint pointerCount = event.getPointerCount(); \t\t\t\t\t \t\t\t\t\tfor (int i = 0; i &lt; pointerCount; i++) \t\t\t\t\t{ \t\t\t\t\t\tpointerIndex = i; \t\t\t\t\t\tpointerId = event.getPointerId(pointerIndex); \t\t\t\t\t\tTouchEvent = TouchEventPool.NewObject(); \t\t\t\t\t\tTouchEvent.Type = MechanicTouchEvent.TOUCH_DRAGGED; \t\t\t\t\t\tTouchEvent.Pointer = pointerId; \t\t\t\t\t\tTouchEvent.X = TouchX[pointerId] = (int)(event.getX(pointerIndex) * ScaleX); \t\t\t\t\t\tTouchEvent.Y = TouchY[pointerId] = (int)(event.getY(pointerIndex) * ScaleY); \t\t\t\t\t\tTouchEventsBuffer.add(TouchEvent); \t\t\t\t\t} \t\t\t\tbreak; \t\t\t} \t\t\t \t\t\treturn true; \t\t} \t}  \t@Override \tpublic boolean IsTouchDown(int pointer) \t{ \t\tsynchronized(this) \t\t{ \t\t\tif(pointer &lt; 0 || pointer &gt;= MaxTouchers) \t\t\t\treturn false; \t\t\telse \t\t\t\treturn IsTouched[pointer]; \t\t} \t}  \t@Override \tpublic int GetTouchX(int pointer) \t{ \t\tsynchronized(this) \t\t{ \t\t\tif (pointer &lt; 0 || pointer &gt;= MaxTouchers) \t\t\t\treturn 0; \t\t\telse \t\t\t\treturn TouchX[pointer]; \t\t} \t}  \t@Override \tpublic int GetTouchY(int pointer) \t{ \t\tsynchronized(this) \t\t{ \t\t\tif (pointer &lt; 0 || pointer &gt;= 20) \t\t\t\treturn 0; \t\t\telse \t\t\t\treturn TouchY[pointer]; \t\t} \t}  \t@Override \tpublic List&lt;MechanicTouchEvent&gt; GetTouchEvents() \t{ \t\tsynchronized (this) \t\t{ \t\t\tfor (int i = 0; i &lt; TouchEvents.size(); i++) \t\t\t\tTouchEventPool.Free(TouchEvents.get(i)); \t\t\t \t\t\tTouchEvents.clear(); \t\t\tTouchEvents.addAll(TouchEventsBuffer); \t\t\tTouchEventsBuffer.clear(); \t\t\treturn TouchEvents; \t\t} \t} } <\/code><\/pre>\n<p>  \u041a\u0440\u043e\u043c\u0435 Touch \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0435\u0449\u0435 OnTouchListener<br \/>  EnableMultiTouch \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0430\u043b\u044c\u0446\u0435\u0432. \u0415\u0441\u043b\u0438 VERSION.SDK \u043c\u0435\u043d\u044c\u0448\u0435 5 (\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u044d\u0442\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438), \u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442.<br \/>  MaxTouchers \u2013 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u0430\u043b\u044c\u0446\u0435\u0432. \u0418\u0445 20, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435.<br \/>  \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 onTouch \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u043f\u0430\u043b\u044c\u0446\u0430 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 (\u043d\u0430\u0436\u0430\u0442\u0438\u0435, \u043e\u0442\u0440\u044b\u0432, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a.<br \/>  \u0412 GetTouchEvents \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0447\u0438\u0449\u0430\u0435\u043c. \u0417\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.<br \/>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c, \u0437\u0430 \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 ScaleX \u0438 ScaleY? \u041e\u0431 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435, \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438<\/p>\n<p>  MechanicKeyboard  <\/p>\n<pre><code class=\"java\">package com.mechanic.input;  import java.util.ArrayList; import java.util.List;  import android.view.KeyEvent; import android.view.View;  import com.mechanic.input.Input.MechanicKeyEvent; import com.mechanic.input.Pool.PoolFactory; import com.mechanic.input.Pool;   public class MechanicKeyboard implements Keyboard { \tboolean[] PressedKeys = new boolean[128]; \tPool&lt;MechanicKeyEvent&gt; KeyEventPool; \t \tList&lt;MechanicKeyEvent&gt; KeyEventsBuffer = new ArrayList&lt;MechanicKeyEvent&gt;(); \tList&lt;MechanicKeyEvent&gt; KeyEvents = new ArrayList&lt;MechanicKeyEvent&gt;(); \t \tpublic MechanicKeyboard(View view) \t{ \t\tPoolFactory&lt;MechanicKeyEvent&gt; pool = new PoolFactory&lt;MechanicKeyEvent&gt;() \t\t{ \t\t\t@Override \t\t\tpublic MechanicKeyEvent Create() \t\t\t{ \t\t\t\treturn new MechanicKeyEvent(); \t\t\t} \t\t}; \t\tKeyEventPool = new Pool&lt;MechanicKeyEvent&gt;(pool,100); \t\t \t\tview.setOnKeyListener(this); \t\tview.setFocusableInTouchMode(true); \t\tview.requestFocus(); \t}  \tpublic boolean IsKeyPressed(int KeyCode) \t{ \t\tif(KeyCode &lt; 0 || KeyCode &gt; 127) \t\t\treturn false; \t\treturn PressedKeys[KeyCode]; \t}  \tpublic List&lt;MechanicKeyEvent&gt; GetKeyEvents() \t{ \t\tsynchronized(this) \t\t{ \t\t\tfor(int i = 0; i &lt; KeyEvents.size(); i++) \t\t\t\tKeyEventPool.Free(KeyEvents.get(i)); \t\t\t \t\t\tKeyEvents.clear(); \t\t\tKeyEvents.addAll(KeyEventsBuffer); \t\t\tKeyEventsBuffer.clear(); \t\t\t \t\t\treturn KeyEvents; \t\t} \t}  \t@Override \tpublic boolean onKey(View v, int keyCode, KeyEvent event) \t{ \t\tif(event.getAction() == KeyEvent.ACTION_MULTIPLE) \t\t\treturn false; \t\t \t\tsynchronized(this) \t\t{ \t\t\tMechanicKeyEvent key = KeyEventPool.NewObject(); \t\t\tkey.KeyCode = keyCode; \t\t\tkey.KeyChar = (char)event.getUnicodeChar(); \t\t\t \t\t\tif(event.getAction() == KeyEvent.ACTION_DOWN) \t\t\t{ \t\t\t\tkey.Type = MechanicKeyEvent.KEY_DOWN; \t\t\t\tif(keyCode &gt; 0 && keyCode &lt; 128) \t\t\t\t\tPressedKeys[keyCode] = true; \t\t\t} \t\t\t \t\t\tif(event.getAction() == KeyEvent.ACTION_UP) \t\t\t{ \t\t\t\tkey.Type = MechanicKeyEvent.KEY_UP; \t\t\t\tif(keyCode &gt; 0 && keyCode &lt; 128) \t\t\t\t\tPressedKeys[keyCode] = false; \t\t\t} \t\t\t \t\t\tKeyEventsBuffer.add(key); \t\t} \t\t \t\treturn false; \t} } <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 128 \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e 128 \u043d\u0430\u0436\u0430\u0442\u044b\u0445 \u0438\u043b\u0438 \u043d\u0435 \u043d\u0430\u0436\u0430\u0442\u044b\u0445 \u043a\u043b\u0430\u0432\u0438\u0448\u0430\u0445. \u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 2 \u0441\u043f\u0438\u0441\u043a\u0430. \u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e<\/p>\n<p>  MechanicInput  <\/p>\n<pre><code class=\"java\">package com.mechanic.input;  import java.util.List;  import android.content.Context; import android.view.View;   public class MechanicInput implements Input { \tMechanicKeyboard keyboard; \tMechanicAccelerometer accel; \tMechanicTouch touch; \t \t \tpublic MechanicInput(Context context, View view, float scaleX, float scaleY) \t{ \t\taccel = new MechanicAccelerometer(context); \t\tkeyboard = new MechanicKeyboard(view); \t\ttouch = new MechanicTouch(view, scaleX, scaleY); \t}  \t@Override \tpublic boolean IsKeyPressed(int keyCode) \t{ \t\treturn keyboard.IsKeyPressed(keyCode); \t} \t \t@Override \tpublic boolean IsKeyPressed(char keyChar) \t{ \t\treturn keyboard.IsKeyPressed(keyChar); \t}  \t@Override \tpublic boolean IsTouchDown(int pointer) \t{ \t\treturn touch.IsTouchDown(pointer); \t}  \t@Override \tpublic int GetTouchX(int pointer) \t{ \t\treturn touch.GetTouchX(pointer); \t}  \t@Override \tpublic int GetTouchY(int pointer) \t{ \t\treturn touch.GetTouchY(pointer); \t}  \t@Override \tpublic float GetAccelX() \t{ \t\treturn accel.GetAccelX(); \t}  \t@Override \tpublic float GetAccelY() \t{ \t\treturn accel.GetAccelY(); \t}  \t@Override \tpublic float GetAccelZ() \t{ \t\treturn accel.GetAccelZ(); \t}  \t@Override \tpublic List&lt;MechanicTouchEvent&gt; GetTouchEvents() \t{ \t\treturn touch.GetTouchEvents(); \t}  \t@Override \tpublic List&lt;MechanicKeyEvent&gt; GetKeyEvents() \t{ \t\treturn keyboard.GetKeyEvents(); \t} } <\/code><\/pre>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0424\u0430\u0441\u0430\u0434\u00bb.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438!<\/p>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438<\/h4>\n<p>  MechanicFileIO  <\/p>\n<pre><code class=\"java\">package com.mechanic.fileio;  import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;  import android.content.res.AssetManager; import android.os.Environment;   public class MechanicFileIO implements FileIO { \tAssetManager assets; \tString ExternalStoragePath; \t \tpublic MechanicFileIO(AssetManager assets) \t{ \t\tthis.assets = assets; \t\tExternalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath() +  \t\t\t\tFile.separator; \t} \t \tpublic InputStream ReadAsset(String name) throws IOException \t{ \t\treturn assets.open(name); \t} \t \tpublic InputStream ReadFile(String name) throws IOException \t{ \t\treturn new FileInputStream(ExternalStoragePath + name); \t} \t \tpublic OutputStream WriteFile(String name) throws IOException \t{ \t\treturn new FileOutputStream(ExternalStoragePath + name); \t} } <\/code><\/pre>\n<p>  \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0430\u0441\u0441\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0438\u0437\u044a\u044f\u0442\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 assets, \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0435\u0440\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0430 \u0432\u0442\u043e\u0440\u044b\u0435 2 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0435\u0440\u0443\u0442 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0430\u043d\u0434\u0440\u043e\u0438\u0434, \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0441\u0447\u0435\u0442 \u0438\u0433\u0440\u044b \u2013 \u0440\u0435\u043a\u043e\u0440\u0434\u044b, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. \u041f\u0443\u0442\u044c \u0434\u043e \u044d\u0442\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 \u0431\u0435\u0440\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0437\u0432\u0443\u043a\u0438  <\/p>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0437\u0432\u0443\u043a\u0430\u043c\u0438<\/h4>\n<p>  MechanicSound  <\/p>\n<pre><code class=\"java\">package com.mechanic.audio;  import android.media.SoundPool;  public class MechanicSound implements Sound { \tint id; \tSoundPool pool; \t \tpublic MechanicSound(SoundPool pool, int id) \t{ \t\tthis.pool = pool; \t\tthis.id = id; \t} \t \tpublic void Play(float volume) \t{ \t\tpool.play(id, volume, volume, 0, 0, 1); \t} \t \tpublic void Close() \t{ \t\tpool.unload(id); \t} } <\/code><\/pre>\n<p>  \u0412 MechanicAudio \u0434\u043b\u044f \u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043c\u0435\u043b\u043a\u0438\u0445 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c SoundPool. \u0412 MechanicSound \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0438 \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 SoundPool, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0437\u0432\u0443\u043a<\/p>\n<p>  MechanicMusic  <\/p>\n<pre><code class=\"java\">package com.mechanic.audio;  import java.io.IOException;  import android.content.res.AssetFileDescriptor; import android.media.MediaPlayer;  public class MechanicMusic implements Music { \tMediaPlayer Player; \tboolean IsPrepared = false; \t \tpublic MechanicMusic(AssetFileDescriptor descriptor) \t{ \t\tPlayer = new MediaPlayer(); \t\t \t\ttry \t\t{ \t\t\tPlayer.setDataSource(descriptor.getFileDescriptor(), \t\t\t\t\tdescriptor.getStartOffset(), descriptor.getLength()); \t\t\tPlayer.prepare(); \t\t\tIsPrepared = true; \t\t} \t\tcatch(Exception ex) \t\t{ \t\t\tthrow new RuntimeException(&quot;\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u043c\u0443\u0437\u044b\u043a\u0443&quot;); \t\t} \t} \t \tpublic void Close() \t{ \t\tif(Player.isPlaying()) \t\t\tPlayer.stop(); \t\tPlayer.release(); \t} \t \tpublic boolean IsLooping() \t{ \t\treturn Player.isLooping(); \t} \t \tpublic boolean IsPlaying() \t{ \t\treturn Player.isPlaying(); \t} \t \tpublic boolean IsStopped() \t{ \t\treturn !IsPrepared; \t} \t \tpublic void Play() \t{ \t\tif(Player.isPlaying()) \t\t\treturn; \t\t \t\ttry \t\t{ \t\t\tsynchronized(this) \t\t\t{ \t\t\t\tif(!IsPrepared) \t\t\t\t\tPlayer.prepare(); \t\t\t\tPlayer.start(); \t\t\t} \t\t} \t\tcatch(IllegalStateException ex) \t\t{ \t\t\tex.printStackTrace(); \t\t} \t\tcatch(IOException ex) \t\t{ \t\t\tex.printStackTrace(); \t\t} \t} \t \tpublic void SetLooping(boolean loop) \t{ \t\tPlayer.setLooping(loop); \t} \t \tpublic void SetVolume(float volume) \t{ \t\tPlayer.setVolume(volume, volume); \t} \t \tpublic void Stop() \t{ \t\tPlayer.stop(); \t\tsynchronized(this) \t\t{ \t\t\tIsPrepared = false; \t\t} \t} \t \t@Override \tpublic void onCompletion(MediaPlayer player) \t{ \t\tsynchronized(this) \t\t{ \t\t\tIsPrepared = false; \t\t} \t} } <\/code><\/pre>\n<p>  \u041c\u044b \u0441\u0442\u0430\u0432\u0438\u043c \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u0444\u0430\u0439\u043b \u043d\u0430 \u043f\u043e\u0442\u043e\u043a \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0435\u0433\u043e.<br \/>  IsPrepared \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0433\u043e\u0442\u043e\u0432 \u043b\u0438 \u0437\u0432\u0443\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f.<br \/>  \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u0430\u043c\u043e\u043c\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435.<\/p>\n<p>  \u041c\u044b \u0434\u043e\u0448\u043b\u0438 \u0434\u043e MechanicAudio  <\/p>\n<pre><code class=\"java\">package com.mechanic.audio;  import java.io.IOException;  import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.media.AudioManager; import android.media.SoundPool;  public class MechanicAudio implements Audio { \tAssetManager assets; \tSoundPool pool; \t \tpublic MechanicAudio(Activity activity) \t{ \t\tactivity.setVolumeControlStream(AudioManager.STREAM_MUSIC); \t\tthis.assets = activity.getAssets(); \t\tpool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0); \t} \t \tpublic Music NewMusic(String name) \t{ \t\ttry \t\t{ \t\t\tAssetFileDescriptor descriptor = assets.openFd(name); \t\t\treturn new MechanicMusic(descriptor); \t\t} \t\tcatch(IOException ex) \t\t{ \t\t\tthrow new RuntimeException(&quot;\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u043c\u0443\u0437\u044b\u043a\u0443 &quot; + name); \t\t} \t} \t \tpublic Sound NewSound(String name) \t{ \t\ttry \t\t{ \t\t\tAssetFileDescriptor descriptor = assets.openFd(name); \t\t\tint id = pool.load(descriptor, 0); \t\t\treturn new MechanicSound(pool, id); \t\t} \t\tcatch(IOException ex) \t\t{ \t\t\tthrow new RuntimeException(&quot;\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 &quot; + name); \t\t} \t} } <\/code><\/pre>\n<p>  \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0443\u0437\u044b\u043a\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c, \u0431\u0435\u0440\u0435\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0430\u0441\u0441\u0435\u0442\u043e\u0432 \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c SoundPool, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 20 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0437\u0430 \u0440\u0430\u0437. \u0414\u0443\u043c\u0430\u044e, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0438\u0433\u0440 \u044d\u0442\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0438\u0442.<br \/>  \u0412 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 Music \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 MechanicMusic \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430, \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 Sound \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0437\u0432\u0443\u043a \u0432 soundPool \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 MechanicSound \u0441\u0430\u043c \u043f\u0443\u043b \u0438 \u043d\u043e\u043c\u0435\u0440 \u0437\u0432\u0443\u043a\u0430, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0438\u0434\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a, \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u0414\u0435\u043b\u0430\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u044c\u0449\u0438\u043a<\/p>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439<\/h4>\n<p>  MechanicImage  <\/p>\n<pre><code class=\"java\">package com.mechanic.graphics;  import com.mechanic.graphics.Graphics.ImageFormat;  import android.graphics.Bitmap;  public class MechanicImage implements Image { \tBitmap bitmap; \tImageFormat format; \t \tpublic MechanicImage(Bitmap bitmap, ImageFormat format) \t{ \t\tthis.bitmap = bitmap; \t\tthis.format = format; \t} \t \t@Override \tpublic int GetWidth() \t{ \t\treturn bitmap.getWidth(); \t} \t \t@Override \tpublic int GetHeight() \t{ \t\treturn bitmap.getHeight(); \t} \t \t@Override \tpublic ImageFormat GetFormat() \t{ \t\treturn format; \t} \t \t@Override \tpublic void Dispose() \t{ \t\tbitmap.recycle(); \t} } <\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u2013 \u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041d\u0438\u0447\u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043d \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442, \u0432\u0432\u0435\u0434\u0435\u043d \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430.<\/p>\n<p>  MechanicGraphics  <\/p>\n<pre><code class=\"java\">package com.mechanic.graphics;  import java.io.IOException; import java.io.InputStream;  import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Rect;  public class MechanicGraphics implements Graphics { \tAssetManager assets; \tBitmap buffer; \tCanvas canvas; \tPaint paint; \tRect srcRect = new Rect(), dstRect = new Rect(); \t \tpublic MechanicGraphics(AssetManager assets, Bitmap buffer) \t{ \t\tthis.assets = assets; \t\tthis.buffer = buffer; \t\tthis.canvas = new Canvas(buffer); \t\tthis.paint = new Paint(); \t} \t \t@Override \tpublic Image NewImage(String fileName) \t{ \t\tImageFormat format; \t\tInputStream file = null; \t\tBitmap bitmap = null; \t\t \t\ttry \t\t{ \t\t\tfile = assets.open(fileName); \t\t\tbitmap = BitmapFactory.decodeStream(file); \t\t\t \t\t\tif (bitmap == null) \t\t\t\tthrow new RuntimeException(&quot;\u041d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 '&quot; \t\t\t\t\t\t+ fileName + &quot;'&quot;); \t\t} \t\tcatch (IOException e) \t\t{ \t\t\tthrow new RuntimeException(&quot;\u041d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 '&quot; \t\t\t\t\t+ fileName + &quot;'&quot;); \t\t} \t\tfinally \t\t{ \t\t\t\ttry \t\t\t\t{ \t\t\t\t\tif(file != null) \t\t\t\t\t\tfile.close(); \t\t\t\t} \t\t\t\tcatch(IOException e) \t\t\t\t{ \t\t\t\t\t \t\t\t\t} \t\t} \t\t \t\tif (bitmap.getConfig() == Config.RGB_565) \t\t\tformat = ImageFormat.RGB_565; \t\telse if (bitmap.getConfig() == Config.ARGB_4444) \t\t\tformat = ImageFormat.ARGB_4444; \t\telse \t\t\tformat = ImageFormat.ARGB_8888; \t\t \t\treturn new MechanicImage(bitmap, format); \t}  \t@Override \tpublic void Clear(int color) \t{ \t\tcanvas.drawRGB((color & 0xff0000) &gt;&gt; 16, (color & 0xff00) &gt;&gt; 8, (color & 0xff)); \t}  \t@Override \tpublic void DrawPixel(int x, int y, int color) \t{ \t\tpaint.setColor(color); \t\tcanvas.drawPoint(x, y, paint); \t}  \t@Override \tpublic void DrawLine(int x, int y, int x2, int y2, int color) \t{ \t\tpaint.setColor(color); \t\tcanvas.drawLine(x, y, x2, y2, paint); \t}  \t@Override \tpublic void DrawRect(int x, int y, int width, int height, int color) \t{ \t\tpaint.setColor(color); \t\tpaint.setStyle(Style.FILL); \t\tcanvas.drawRect(x, y, x + width - 1, y + width - 1, paint); \t}  \t@Override \tpublic void DrawImage(Image image, int x, int y, int srcX, int srcY, \t\t\tint srcWidth, int srcHeight) \t{ \t\tsrcRect.left = srcX; \t\tsrcRect.top = srcY; \t\tsrcRect.right = srcX + srcWidth - 1; \t\tsrcRect.bottom = srcY + srcHeight - 1; \t\tdstRect.left = x; \t\tdstRect.top = y; \t\tdstRect.right = x + srcWidth - 1; \t\tdstRect.bottom = y + srcHeight - 1; \t\tcanvas.drawBitmap(((MechanicImage)image).bitmap, srcRect, dstRect, \t\t\t\tnull); \t}  \t@Override \tpublic void DrawImage(Image image, int x, int y) \t{ \t\tcanvas.drawBitmap(((MechanicImage)image).bitmap, x, y, null); \t}  \t@Override \tpublic int GetWidth() \t{ \t\treturn buffer.getWidth(); \t} \t \t@Override \tpublic int GetHeight() \t{ \t\treturn buffer.getHeight(); \t} } <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u041c\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b Paint \u0438 Rect \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u0435\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430.<br \/>  \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043c\u044b \u0431\u0435\u0440\u0435\u043c Bitmap \u2014 \u0431\u0443\u0444\u0435\u0440, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u0432\u0441\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c, \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 canvas.<br \/>  \u041f\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438\u0437 \u0430\u0441\u0441\u0435\u0442\u043e\u0432, \u0430 \u043f\u043e\u0442\u043e\u043c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0435\u0435 \u0432 Bitmap. \u0411\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043f\u043e\u0442\u043e\u043c \u0444\u0430\u0439\u043b \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u0434 \u043a\u043e\u043d\u0435\u0446 \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 MechanicImage, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 Bitmap \u0438 ImageFormat. \u0422\u0430\u043a\u0436\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 DrawImage, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0438\u0441\u0443\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u042d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0432 \u0438\u0433\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0430\u0442\u043b\u0430\u0441\u043e\u043c. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0433\u043e \u0430\u0442\u043b\u0430\u0441\u0430<br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/e79\/99b\/f1d\/e7999bf1dc77f727fd70e3e45b75cca1.gif\" alt=\"image\"\/><br \/>  (\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0437\u044f\u0442\u043e \u0438\u0437 \u0432\u0435\u0431-\u0440\u0435\u0441\u0443\u0440\u0441\u0430 interesnoe.info)<br \/>  \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441 32,32 \u043f\u043e 48,48, \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 1,1; \u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a  <\/p>\n<pre><code class=\"java\">DrawImage(image, 1, 1, 32, 32, 16, 16); <\/code><\/pre>\n<p>  \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442.<\/p>\n<p>  \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 Game \u0438 Screen!<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0438 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u043e\u0442\u043e\u043a.<br \/>  \u0412\u0441\u0442\u0440\u0435\u0447\u0430\u0439\u0442\u0435 \u043a\u043b\u0430\u0441\u0441 SurfaceView, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a\u0443. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043a\u043b\u0430\u0441\u0441 Runner  <\/p>\n<pre><code class=\"java\">package com.mechanic.game;  import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Rect; import android.view.SurfaceHolder; import android.view.SurfaceView;   public class Runner extends SurfaceView implements Runnable { \tMechanicGame game; \tCanvas canvas; \tBitmap buffer; \tThread thread = null; \tSurfaceHolder holder; \tvolatile boolean running = false; \t \tpublic Runner(Object context, MechanicGame game, \t\t\tBitmap buffer) \t{ \t\tsuper(game); \t\tthis.game = game; \t\tthis.buffer = buffer; \t\tthis.holder = getHolder(); \t}  \tpublic void Resume() \t{ \t\trunning = true; \t\tthread = new Thread(this); \t\tthread.start(); \t} \t \tpublic void run() \t{ \t\tRect dstRect = new Rect(); \t\tlong startTime = System.nanoTime(); \t\t \t\twhile(running) \t\t{ \t\t\tif(!holder.getSurface().isValid()) \t\t\t\tcontinue; \t\t\t \t\t\tfloat deltaTime = (System.nanoTime()-startTime) \/ 1000000000.0f; \t\t\tstartTime = System.nanoTime(); \t\t\t \t\t\tgame.GetCurrentScreen().Update(deltaTime); \t\t\tgame.GetCurrentScreen().Present(deltaTime); \t\t\t \t\t\tcanvas = holder.lockCanvas(); \t\t\tcanvas.getClipBounds(dstRect); \t\t\tcanvas.drawBitmap(buffer, null, dstRect, null); \t\t\tholder.unlockCanvasAndPost(canvas); \t\t} \t} \t \tpublic void Pause() \t{ \t\trunning = false; \t\t \t\twhile(true) \t\t{ \t\t\ttry \t\t\t{ \t\t\t\tthread.join(); \t\t\t\tbreak; \t\t\t} \t\t\tcatch (InterruptedException e) \t\t\t{  \t\t\t} \t\t} \t} } <\/code><\/pre>\n<p>  \u041a\u043b\u0430\u0441\u0441 MechanicGame \u0441\u043a\u043e\u0440\u043e \u0431\u0443\u0434\u0435\u0442, \u043d\u0435 \u0432\u043e\u043b\u043d\u0443\u0439\u0442\u0435\u0441\u044c.<br \/>  \u0414\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u043d\u0435 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043e\u0431\u044a\u0435\u043a\u0442 SurfaceHolder. \u0415\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2013 lockCanvas \u0438 unlockCanvasAndPost. \u041f\u0435\u0440\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 Surface \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Canvas, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2013 \u0431\u0443\u0444\u0435\u0440 Bitmap, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u0440\u043e\u043b\u0438 \u0445\u043e\u043b\u0441\u0442\u0430).<br \/>  \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Resume \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441 \u044d\u0442\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c.<br \/>  \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 run, \u043f\u043e\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0441 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 (System.nanoTime \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u044b) \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Update \u0438 Present \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e Screen\u2019\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u0431\u0443\u0444\u0435\u0440.<\/p>\n<p>  \u0412\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 MechanicGame  <\/p>\n<pre><code class=\"java\">package com.mechanic.game;  import com.mechanic.audio.Audio; import com.mechanic.audio.MechanicAudio; import com.mechanic.fileio.FileIO; import com.mechanic.fileio.MechanicFileIO; import com.mechanic.graphics.Graphics; import com.mechanic.graphics.MechanicGraphics; import com.mechanic.input.Input; import com.mechanic.input.MechanicInput;  import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.view.Window; import android.view.WindowManager;  public abstract class MechanicGame extends Activity implements Game { \tRunner runner; \tGraphics graphics; \tAudio audio; \tInput input; \tFileIO fileIO; \tScreen screen; \tWakeLock wakeLock;  \tstatic final int SCREEN_WIDTH = 80; \tstatic final int SCREEN_HEIGHT = 128; \t \t@Override \tpublic void onCreate(Bundle savedInstanceState) \t{ \t\tsuper.onCreate(savedInstanceState); \t\t \t\trequestWindowFeature(Window.FEATURE_NO_TITLE); \t\tgetWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, \t\t\t\tWindowManager.LayoutParams.FLAG_FULLSCREEN); \t\t \t\tboolean IsLandscape = (getResources().getConfiguration().orientation == \t\t\t\tConfiguration.ORIENTATION_LANDSCAPE); \t\t \t\tint frameBufferWidth = IsLandscape ? SCREEN_HEIGHT : SCREEN_WIDTH; \t\tint frameBufferHeight = IsLandscape ? SCREEN_WIDTH : SCREEN_HEIGHT; \t\t \t\tBitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth, \t\t\t\tframeBufferHeight, Config.RGB_565); \t\t \t\tfloat scaleX = (float) frameBufferWidth \/ \t\t\t\tgetWindowManager().getDefaultDisplay().getWidth(); \t\tfloat scaleY = (float) frameBufferHeight \/ \t\t\tgetWindowManager().getDefaultDisplay().getHeight(); \t\t \t\trunner = new Runner(null, this, frameBuffer); \t\tgraphics = new MechanicGraphics(getAssets(), frameBuffer); \t\tfileIO = new MechanicFileIO(getAssets()); \t\taudio = new MechanicAudio(this); \t\tinput = new MechanicInput(this, runner, scaleX, scaleY); \t\tscreen = GetStartScreen(); \t\tsetContentView(runner); \t\t \t\tPowerManager powerManager = (PowerManager) \t\tgetSystemService(Context.POWER_SERVICE); \t\twakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, \t\t\t\t&quot;Game&quot;); \t}  \t@Override \tpublic Input GetInput() \t{ \t\treturn input; \t} \t \t@Override \tpublic FileIO GetFileIO() \t{ \t\treturn fileIO; \t} \t \t@Override \tpublic Graphics GetGraphics() \t{ \t\treturn graphics; \t} \t \t@Override \tpublic Audio GetAudio() \t{ \t\treturn audio; \t} \t \t@Override \tpublic void SetScreen(Screen screen) \t{ \t\tif (screen == null) \t\t\tthrow new IllegalArgumentException(&quot;Screen \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c null&quot;); \t\t \t\tthis.screen.Pause(); \t\tthis.screen.Dispose(); \t\t \t\tscreen.Resume(); \t\tscreen.Update(0); \t\t \t\tthis.screen = screen; \t}  \t@Override \tpublic Screen GetCurrentScreen() \t{ \t\treturn screen; \t}  \t@Override \tpublic Screen GetStartScreen() \t{ \t\treturn null; \t} \t \t@Override \tpublic void onResume() \t{ \t\tsuper.onResume(); \t\twakeLock.acquire(); \t\tscreen.Resume(); \t\trunner.Resume(); \t} \t \t@Override \tpublic void onPause() \t{ \t\tsuper.onPause(); \t\twakeLock.release(); \t\trunner.Pause(); \t\tscreen.Pause(); \t\t \t\tif(isFinishing()) \t\t\tscreen.Dispose(); \t} } <\/code><\/pre>\n<p>  \u0423 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b Runner, \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442 WakeLock (\u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043d\u0435 \u0437\u0430\u0441\u044b\u043f\u0430\u043b, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0438\u0433\u0440\u0430)<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c 2 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u2013 SCREEN_WIDTH \u0438 SCREEN_HEIGHT, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b!<br \/>  \u0423 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0442.\u0434. \u0438 \u0442.\u043f. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u043a\u043e\u0448\u043a\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 80&#215;128 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 (\u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u044b\u0448\u0435\u043d\u0430\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442). \u041c\u044b \u0432 \u044d\u0442\u043e\u043c \u043e\u043a\u043e\u0448\u043a\u0435 \u0440\u0438\u0441\u0443\u0435\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u041d\u043e \u0432\u0434\u0440\u0443\u0433 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u043a\u0440\u0430\u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u044d\u0442\u043e\u043c\u0443 \u043e\u043a\u043e\u0448\u043a\u0443. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c? \u0412\u0441\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u2013 \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0448\u0438\u0440\u0438\u043d\u044b \u0438 \u0434\u043b\u0438\u043d\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043a\u043e\u0448\u043a\u0430 \u043a \u0448\u0438\u0440\u0438\u043d\u0435 \u0438 \u0434\u043b\u0438\u043d\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u0432\u0441\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u044d\u0442\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435.<br \/>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0430\u043c\u043e \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043f\u043e\u0434 \u044d\u043a\u0440\u0430\u043d \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>  \u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f Activity \u0438 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b onCreate, onResume \u0438 onPause.<br \/>  \u0412 onCreate \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c (\u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e \u0437\u0430\u0440\u044f\u0434\u043a\u0438 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u0432\u0435\u0440\u0445\u0443). \u041f\u043e\u0442\u043e\u043c \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u2013 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u043d\u0430\u044f \u0438\u043b\u0438 \u043f\u043e\u0440\u0442\u0440\u0435\u0442\u043d\u0430\u044f (\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0436\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 .xml \u0444\u0430\u0439\u043b\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438). \u041f\u043e\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441 \u044d\u0442\u043e \u0432\u043e\u0442 \u043e\u043a\u043e\u0448\u043a\u043e 80&#215;128 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u043e\u0448\u043a\u0430 \u043a \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 MechanicInput, \u043e\u043d, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0432 MechanicTouch. \u0418 \u0442\u0443\u0442 \u2013 \u0431\u0438\u043d\u0433\u043e! \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u0441\u0430\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0443\u043c\u043d\u043e\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<br \/>  \u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c Runner \u0438 WakeLock.<br \/>  \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 SetScreen \u043c\u044b \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 Screen \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439 Screen.<br \/>  \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442.<\/p>\n<p>  <b>\u041d\u0435\u0443\u0436\u0435\u043b\u0438 \u044d\u0442\u043e \u0432\u0441\u0435?<\/b><\/p>\n<p>  \u0414\u0430, \u0433\u043e\u0441\u043f\u043e\u0434\u0430, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432!<br \/>  When it\u2019s done.<\/p>\n<p>  <b>\u0410 \u043a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0441 MyGame?<\/b><\/p>\n<p>  \u00ab\u0413\u043b\u0430\u0432\u043d\u044b\u0439\u00bb \u043a\u043b\u0430\u0441\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a  <\/p>\n<pre><code class=\"java\">public class MyGame extends Activity {  \t@Override \tprotected void onCreate(Bundle savedInstanceState) { \t\tsuper.onCreate(savedInstanceState); \t\tsetContentView(R.layout.activity_my_game); \t}  \t@Override \tpublic boolean onCreateOptionsMenu(Menu menu) { \t\t\/\/ Inflate the menu; this adds items to the action bar if it is present. \t\tgetMenuInflater().inflate(R.menu.my_game, menu); \t\treturn true; \t}  } <\/code><\/pre>\n<p>  \u0412\u0438\u0434\u043e\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0434\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430  <\/p>\n<pre><code class=\"java\">package com.mechanic;  import com.mechanic.game.MechanicGame; import com.mechanic.game.Screen;  public class MyGame extends MechanicGame { \t@Override \tpublic Screen GetStartScreen() \t{ \t\treturn new GameScreen(this); \t} }  <\/code><\/pre>\n<p>  Java \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043a\u0430\u043a \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 \u043e\u0442 Activity, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0430\u043c MechanicGame \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a \u043e\u0442 Activity. onCreate \u0443\u0436\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d, \u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2013 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c GetStartScreen(), \u0442\u0430\u043a \u043a\u0430\u043a \u0432 MechanicGame \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 null, \u0430 \u044d\u0442\u043e \u043a\u0438\u0434\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443.<br \/>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 GameScreen \ud83d\ude42  <\/p>\n<pre><code class=\"java\">package com.mechanic;  import com.mechanic.game.Game; import com.mechanic.game.Screen; import com.mechanic.graphics.Graphics; import com.mechanic.graphics.Image;  public class GameScreen extends Screen { \tGraphics g = game.GetGraphics(); \tImage wikitan; \t \tfloat x = 0.0f; \t \tpublic GameScreen(Game game) \t{ \t\tsuper(game); \t\twikitan = g.NewImage(&quot;wikipetan.png&quot;); \t}   \t@Override \tpublic void Update(float deltaTime) \t{ \t\tif(game.GetInput().IsTouchDown(0)) \t\t\tx += 1.0f * deltaTime; \t}  \t@Override \tpublic void Present(float deltaTime) \t{ \t\tg.Clear(0); \t\tg.DrawImage(wikitan, (int)x, 0); \t}  \t@Override \tpublic void Pause() \t{  \t}  \t@Override \tpublic void Resume() \t{  \t}  \t@Override \tpublic void Dispose() \t{ \t\twikitan.Dispose(); \t} } <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Screen, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0412\u0438\u043a\u0438\u043f\u0435-\u0442\u0430\u043d \u0438 \u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d.<br \/>   <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/0ee\/1f8\/471\/0ee1f847170ce96f09f1b3e48b59359b.png\" alt=\"image\"\/><br \/>  (\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0437\u044f\u0442\u043e \u0438\u0437 \u0432\u0435\u0431-\u0440\u0435\u0441\u0443\u0440\u0441\u0430 ru.wikipedia.org)<\/p>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/2cb\/7bc\/728\/2cb7bc728ccb1d52fda390cdaf405b59.png\" alt=\"image\"\/><\/p>\n<p>  \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f x \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043a\u0430\u043a float, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u0435\u043b \u043e\u0442 0 \u0434\u043e 1 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0430\u0435\u0442, \u0438\u0434\u0435\u0442 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435.<br \/>  \u0412\u0438\u043a\u0438\u043f\u0435-\u0442\u0430\u043d \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0448\u0435\u0433\u043e \u0445\u043e\u043b\u0441\u0442\u0430 80&#215;128 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439<\/p>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b:<\/h4>\n<p>  <b> \u2014 \u0423 \u043c\u0435\u043d\u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u2013 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0439 \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432!<\/b><br \/>   \u2014 \u042d\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0434\u0430\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 xml \u0444\u0430\u0439\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0443 7 \u0432 \u043f\u0440\u0430\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b<br \/>  <b> \u2014 \u042f \u0447\u0435\u0441\u0442\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u044e x += 1.0f * deltaTime, \u043d\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c?<\/b><br \/>   \u2014 \u042d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u2013 \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435.<\/p>\n<p>  <b>Have fun!<\/b><\/p>\n<p>  <b>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438:<\/b><br \/>  <a href=\"http:\/\/rghost.ru\/49052713\">rghost.ru\/49052713<\/a><br \/>  <b>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430:<\/b><br \/>  <a href=\"http:\/\/developer.alexanderklimov.ru\/android\/\">developer.alexanderklimov.ru\/android\/<\/a><br \/>  <a href=\"http:\/\/habrahabr.ru\/post\/109944\/\">habrahabr.ru\/post\/109944\/<\/a><br \/>  \u041a\u043d\u0438\u0433\u0430 \u041c\u0430\u0440\u0438\u043e \u0426\u0435\u0445\u043d\u0435\u0440\u0430 \u00ab\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0433\u0440 \u043f\u043e\u0434 Android\u00bb<\/p>\n<p>  <habracut\/> \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/195830\/\"> http:\/\/habrahabr.ru\/post\/195830\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c, \u0436\u0438\u0442\u0435\u043b\u0438 \u0425\u0430\u0431\u0440\u0430!<br \/>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c Mechanic Framework \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0433\u0440 \u043f\u043e\u0434 \u0430\u043d\u0434\u0440\u043e\u0438\u0434.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/e01\/494\/b86\/e01494b86e1d1ad52fb3dff6540d7d9d.png\" alt=\"image\"\/><\/p>\n<h4>\u0427\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f:<\/h4>\n<p>  <\/p>\n<ul>\n<li> \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 Eclipse \u0438 Android SDK<\/li>\n<li> \u041f\u0440\u0438\u043b\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u043d\u0438\u0435 Java \u043b\u0438\u0431\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0421-\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430. \u041b\u0443\u0447\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2013 C#<\/li>\n<li> \u0422\u0435\u0440\u043f\u0435\u043d\u0438\u0435<\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-195830","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/195830","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=195830"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/195830\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=195830"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=195830"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=195830"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}