рд╢реБрдн рджреЛрдкрд╣рд░, рд╣реЗрдмреНрд░ рдХреЗ рдирд┐рд╡рд╛рд╕рд┐рдпреЛрдВ!
рдЖрдЬ рд╣рдо рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдЧреЗрдореНрд╕ рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдореИрдХреЗрдирд┐рдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдирд╛рдордХ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓рд┐рдЦреЗрдВрдЧреЗред

рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП:
- рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЧреНрд░рд╣рдг рдФрд░ Android рдПрд╕рдбреАрдХреЗ
- рдЬрд╛рд╡рд╛ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реА-рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ рдЬреНрдЮрд╛рди рдХрд╛ рдирд┐рд░реНрдгрдпред рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдЙрджрд╛рд╣рд░рдг - C #
- рдзреИрд░реНрдп
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдБред
рдлрд╝рд╛рдЗрд▓ - рдирдпрд╛ - рдЕрдиреНрдп - рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓реАрдХреЗрд╢рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ

рдирдИ Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдХреЛрдИ рднреА рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдХреЗрдирд┐рдХ), рдЕрдкрдирд╛ рдирд╛рдо рдкреИрдХреЗрдЬ рдХрд░реЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд▓рдХреНрд╖реНрдп рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП Android рдХреЗ рдиреНрдпреВрдирддрдо рд╕рдВрднрд╡ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдЕрдЧрд▓рд╛ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

рдЕрдЧрд▓рд╛ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

рдЖрдЗрдХрди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ (рдпрджрд┐ рдЖрдкрдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдЖрдЗрдХрди рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрд▓рд┐рдкрдЖрд░реНрдЯ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ - рдЪреБрдиреЗрдВ рдФрд░ рдХреБрдЫ рдЪреБрдиреЗрдВ, рдпрд╛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдЖрдЗрдХрди рдбрд╛рд▓реЗрдВ)ред

рдЕрдЧрд▓рд╛ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рдЪреБрдиреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MyGame, рд╕рдорд╛рдкреНрдд рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред
.Xml рджреГрд╢реНрдп рд╕рдВрдкрд╛рджрди рд╡рд┐рдВрдбреЛ рдЦреБрд▓ рдЬрд╛рдПрдЧреА, рдЗрд╕реЗ рдмрдВрдж рдХрд░реЗрдВред
AndroidManifest.xml рдЦреЛрд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░реЗрдВред

рдЧреЗрдо рдореЗрдВ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рд╕рдВрднрд╡ рд╣реЛ, рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдЖрдВрддрд░рд┐рдХ рдореЗрдореЛрд░реА рдХреЛ рджреВрд╖рд┐рдд рди рдХрд░реЗрдВ, рддреЛ рд╣рдо рдЬреЛ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЙрд╕рдореЗрдВ
android:installLocation="preferExternal"
рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реБрд▓рдн рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦреЗрдВ
android:debuggable="true"
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкреЛрд░реНрдЯреНрд░реЗрдЯ рдпрд╛ рд▓реИрдВрдбрд╕реНрдХреЗрдк рдореЛрдб (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓реИрдВрдбрд╕реНрдХреЗрдк рдореЛрдб) рдореЗрдВ, рдЬрд┐рд╕ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
android:screenOrientation="landscape"
рдХреАрдмреЛрд░реНрдб рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрд╕реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
android:configChanges="keyboard|keyboardHidden|orientation"
рдЬрдм рдЖрдк Google Play рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб / рдЗрдВрдЯрд░рдиреЗрдЯ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкрд╛рдиреЗ рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдкрд░ рд╕реНрдХреНрд░реАрди рд▓реЙрдХ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>
рдкреНрд░рдХрдЯ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.frame" android:versionCode="1" android:versionName="1.0" android:installLocation="preferExternal"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:debuggable="true" > <activity android:name="com.frame.MyGame" android:screenOrientation="landscape" android:configChanges="keyboard|keyboardHidden|orientation" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> </manifest>
рдкреНрд░рдХрдЯ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ
рдЕрдм рдЖрдкрдХреЛ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреЛ рдЗрдирдкреБрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдФрд░ рдЕрдзрд┐рдХ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдж рдореЗрдВ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
Com.mechanic.input рдирд╛рдордХ рдПрдХ рдирдпрд╛ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдБ
рд╣рдо рдЗрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рдЗрдирдкреБрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдЗрд╕ рд░реВрдк рдореЗрдВ рд▓рд╛рддреЗ рд╣реИрдВ
public interface Input { public static class MechanicKeyEvent { public static final int KEY_DOWN = 0, KEY_UP = 1; public int Type; public int KeyCode; public char KeyChar; } public static class MechanicTouchEvent { public static final int TOUCH_DOWN = 0, TOUCH_UP = 1, TOUCH_DRAGGED = 2; public int Type; public int X, Y; public int Pointer; } public boolean IsKeyPressed(int KeyCode); public boolean IsKeyPressed(char KeyChar); public boolean IsTouchDown(int pointer); public int GetTouchX(int pointer); public int GetTouchY(int pointer); public float GetAccelX(); public float GetAccelY(); public float GetAccelZ(); public List<MechanicTouchEvent> GetTouchEvents(); public List<MechanicKeyEvent> GetKeyEvents(); }
GetKeyDown - рдмреВрд▓рд┐рдпрди рдорд╛рди, рдХреБрдВрдЬреА рдХреЛрдб рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╕рд╣реА рд╣реИ
GetTouchDown - рдПрдХ рдмреВрд▓рд┐рдпрди рдорд╛рди, рдЕрдЧрд░ рд╕реНрдХреНрд░реАрди рдХреЛ рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рд╣реА рд╣реИ рдФрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдХреНрд░реАрди рдХреЛ рджрдмрд╛рдиреЗ рд╡рд╛рд▓реА рдЙрдВрдЧрд▓реА рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд▓реЗрддрд╛ рд╣реИред рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдорд▓реНрдЯреАрдЯрдЪ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
GetTouchX - рджрдмрд╛рдП рдЧрдП рдХреБрдВрдЬреА рдХрд╛ рдПрдХреНрд╕-рд╕рдордиреНрд╡рдп рд▓реМрдЯрд╛рддрд╛ рд╣реИ
GetTouchY - рджрдмрд╛рдП рдЧрдП рдХреБрдВрдЬреА рдХрд╛ Y- рд╕рдордиреНрд╡рдп рд▓реМрдЯрд╛рддрд╛ рд╣реИ
рджреЛрдиреЛрдВ рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдп рдЙрдВрдЧрд▓реА рд╕рдВрдЦреНрдпрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ
GetAccelX, GetAccelY, GetAccelZ - рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдордиреНрд╡рдп рдкрд░ рд╡рд╛рдкрд╕реА рддреНрд╡рд░рдгред рдЬрдм рд╣рдо рдлреЛрди рдХреЛ рдкреЛрд░реНрдЯреНрд░реЗрдЯ рдореЛрдб рдореЗрдВ рд▓рдВрдмрд╡рдд рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ Y рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рддреНрд╡рд░рдг 9.6 m / s2 рд╣реЛрдЧрд╛, рд╕рд╛рде X рдФрд░ Z рдЕрдХреНрд╖ 0 m / s2ред
рдмрд╛рд╣рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдкреНрд░рдореБрдЦ рдШрдЯрдирд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЯрд╛рдЗрдк рд╣рдореЗрд╢рд╛ рдпрд╛ рддреЛ KEY_DOWN рдпрд╛ KEY_UP рд╣реЛрдЧрд╛ред KeyCode рдФрд░ KeyChar рдХреНрд░рдорд╢рдГ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдФрд░ рдЪрд░рд┐рддреНрд░ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХреБрдВрдЬреА рдореВрд▓реНрдп рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред
рджреВрд╕рд░реА рдХрдХреНрд╖рд╛ рдореЗрдВ, X рдФрд░ Y рд╕реНрдХреНрд░реАрди рдХреЛ рджрдмрд╛рдиреЗ рд╡рд╛рд▓реА рдЙрдВрдЧрд▓реА рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВ, рдкреЙрдЗрдВрдЯрд░ рдЙрдВрдЧрд▓реА рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред TOUCH_DRAGGED рдХрд╛ рдЕрд░реНрде рд╣реИ рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рд╣рд┐рд▓рд╛рдирд╛ред
рдпрд╣ рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреИрд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░, рдХреАрдмреЛрд░реНрдб рдФрд░ рд╕реНрдХреНрд░реАрди рдЯреИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд╣ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╡рд░реНрдЧ рдЬреЛ рдХреНрд░рдорд╢рдГ рдПрдХреНрд╕реАрд▓реЗрд░реЛрдореАрдЯрд░, рдХреАрдмреЛрд░реНрдб рдФрд░ рдЯрдЪ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдЗрдирдкреБрдЯ рд╕рд┐рд░реНрдл рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рд░рд▓ "рдореБрдЦреМрдЯрд╛" рдкреИрдЯрд░реНрди рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ
public interface Accelerometer extends SensorEventListener { public float GetAccelX(); public float GetAccelY(); public float GetAccelZ(); }
public interface Keyboard extends OnKeyListener { public boolean IsKeyPressed(int keyCode); public List<KeyEvent> GetKeyEvents(); }
public interface Touch extends OnTouchListener { public boolean IsTouchDown(int pointer); public int GetTouchX(int pointer); public int GetTouchY(int pointer); public List<TouchEvent> GetTouchEvents(); }
рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдХреЗрд╡рд▓ рдЕрдиреНрдп рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред
рдлрд╝рд╛рдЗрд▓реЗрдВ
рдпрд╣ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рд╣рдорд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ FileIO рдХрд╣рд▓рд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрдЧ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред
рдПрдХ рдирдпрд╛ рдкреИрдХреЗрдЬ com.mechanic.fileio рдФрд░ рдЙрд╕рдореЗрдВ рдПрдХ рдирдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдБ
public interface FileIO { public InputStream ReadAsset(String name) throws IOException; public InputStream ReadFile(String name) throws IOException; public OutputStream WriteFile(String name) throws IOException; }
рдЖрдорддреМрд░ рдкрд░ рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрд╕реЗрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА рдЪрд┐рддреНрд░реЛрдВ, рдзреНрд╡рдирд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддрд╛ рд╣реИ, рдПрд╕реЗрдЯреНрд╕рдореИрдиреЗрдЬрд░ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкрд░реЗрд╢рд╛рдиреА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо 2 рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬрдм рд╣рдо рдбреЗрдЯрд╛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╛рдЗрд▓ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВред рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, "file.txt" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ".mechanicsave" - тАЛтАЛрдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИред
рдЖрд╡рд╛рдЬрд╝
рдкреИрдХреЗрдЬ com.mechanic.audio рдФрд░ рдирдпрд╛ рдСрдбрд┐рдпреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдБ
public interface Audio { public Music NewMusic(String name); public Sound NewSound(String name); }
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднрдВрдбрд╛рд░рдг рдФрд░ рдзреНрд╡рдирд┐ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП 2 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЬрдм рд╣рдо рдПрдХ рдзреНрд╡рдирд┐ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмрдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╢реЙрдЯреНрд╕ рдФрд░ рд╡рд┐рд╕реНрдлреЛрдЯ рдЬреИрд╕реА рдЫреЛрдЯреА рдзреНрд╡рдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рд╕рдВрдЧреАрдд рдЬреИрд╕реА рдмрдбрд╝реА рдзреНрд╡рдирд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдирд┐ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдзреНрд╡рдирд┐ рдЙрддреНрдкрд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдзреНрд╡рдирд┐ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрдЬрд╛рдирд╛ред рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП, рдзреНрд╡рдирд┐ рдФрд░ рд╕рдВрдЧреАрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреНрд░рдорд╢рдГ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдпрд╣рд╛рдБ рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВ
public interface Sound { public void Play(float volume); public void Close(); }
public interface Music extends OnCompletionListener { public void Close(); public boolean IsLooping(); public boolean IsPlaying(); public boolean IsStopped(); public void Play(); public void SetLooping(boolean loop); public void SetVolume(float volume); public void Stop(); }
рдЧреНрд░рд╛рдлрд┐рдХреНрд╕
рдкреИрдХреЗрдЬ com.mechanic.graphics рдмрдирд╛рдПрдБ
рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
рдпрд╣рд╛рдБ рдЙрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ
public interface Graphics { public static enum ImageFormat { ARGB_8888, ARGB_4444, RGB_565 } public Image NewImage(String fileName); public void Clear(int color); public void DrawPixel(int x, int y, int color); public void DrawLine(int x, int y, int x2, int y2, int color); public void DrawRect(int x, int y, int width, int height, int color); public void DrawImage(Image image, int x, int y, int srcX, int srcY, int srcWidth, int srcHeight); public void DrawImage(Image image, int x, int y); public int GetWidth(); public int GetHeight(); }
ImageFormat рдПрдХ рдЧрдгрди рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдЪреБрдирдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдХреА рдЧрдгрдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд╛рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╣реЛрдиреЗ рджреЗрдВред
NewImage рдПрдХ рдирдИ рдЫрд╡рд┐ рджреЗрддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рд░рдЦреЗрдВрдЧреЗ рдФрд░ рдбреНрд░рд╛ рдХрд░реЗрдВрдЧреЗ
рдбреНрд░рд╛ рдХреЗ рдирд╛рдо рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпрд╛рдБ ... рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓реЗрдВ, рдФрд░ рдкрд╣рд▓рд╛ рдбреНрд░рд╛рдЗрдореЗрдЬ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдЫрд╡рд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ - рд╕рдВрдкреВрд░реНрдг рдЫрд╡рд┐ред
рдЧреЗрдЯрд╡рд╛рдЗрдЯ рдФрд░ рдЧреЗрдЯрд╣рд╛рдЗрдЯ "рдХреИрдирд╡рд╛рд╕" рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдЪрд┐рддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ
рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ -
public interface Image { public int GetWidth(); public int GetHeight(); public ImageFormat GetFormat(); public void Dispose(); }
рд╕рдм рдХреБрдЫ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ
рдХреЗрдВрджреНрд░реАрдХреГрдд рдЦреЗрд▓ рдкреНрд░рдмрдВрдзрди
рдкреИрдХреЗрдЬ com.mechanic.game рдмрдирд╛рдПрдБ
рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ - рдЧреЗрдо
public interface Game { public Input GetInput(); public FileIO GetFileIO(); public Graphics GetGraphics(); public Audio GetAudio(); public void SetScreen(Screen screen); public Screen GetCurrentScreen(); public Screen GetStartScreen(); }
рд╣рдо рд╕рд┐рд░реНрдл рд╡рд╣рд╛рдВ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ - рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдпреЛрдВ рдХреЗ рд╡рд┐рд╖рдпред
рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░реАрди рдХреНрдпрд╛ рд╣реИ?
рдореБрдЭреЗ рд╡рд┐рдЪрд▓рд┐рдд рдХрд░ рджреЛред рд▓рдЧрднрдЧ рд╣рд░ рдЦреЗрд▓ рдореЗрдВ рдХрдИ "рд░рд╛рдЬреНрдп" рд╣реЛрддреЗ рд╣реИрдВ - рдореБрдЦреНрдп рдореЗрдиреВ, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдиреВ, рд╣рд╛рдИрд╕реНрдХреЛрд░ рд╕реНрдХреНрд░реАрди, рд╕рднреА рд╕реНрддрд░, рдЖрджрд┐ред рдЖрджрд┐ рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рдХрд┐ рдХрдо рд╕реЗ рдХрдо 5 рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣рдореЗрдВ рдХреЛрдб рдХреЗ рд░рд╕рд╛рддрд▓ рдореЗрдВ рдбреБрдмреЛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдХреНрд░реАрди рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣рдореЗрдВ рдмрдЪрд╛рддрд╛ рд╣реИ
public abstract class Screen { protected final Game game; public Screen(Game game) { this.game = game; } public abstract void Update(float deltaTime); public abstract void Present(float deltaTime); public abstract void Pause(); public abstract void Resume(); public abstract void Dispose(); }
рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░реАрди рд╡рдВрд╢рдЬ (рдореЗрдирдореЗрдиреНрдпреВрд╕реНрдХреНрд░реАрди, рд╕реЗрдЯрд┐рдВрдЧреНрд╕рд╕реНрдХреНрд░реАрди) рдЗрд╕ "рд░рд╛рдЬреНрдп" рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░реНрдп рд╣реИрдВред
рдЕрджреНрдпрддрди - рдЕрджреНрдпрддрди
рд╡рд░реНрддрдорд╛рди - рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди (рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддрд░рд╣ рд╣реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)
рд░реЛрдХреЗрдВ - рд╣рд░ рдмрд╛рд░ рдЦреЗрд▓ рд░реБрдХрдиреЗ рдкрд░ (рд╕реНрдХреНрд░реАрди рдмреНрд▓реЙрдХ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ - рдПрдХ рдард╣рд░рд╛рд╡ рдХреЗ рдмрд╛рдж рдЦреЗрд▓ рдХреА рдирд┐рд░рдВрддрд░рддрд╛
рдирд┐рдкрдЯрд╛рди - рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЬрд╛рд░реА рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпрд╛рдВ
рдпрд╣ рдбреЗрд▓реНрдЯрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ, 2 рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рдЧреЗрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬрдм рдЦреЗрд▓ рдХреА рдЧрддрд┐ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рдЪрд╛рд▓) рд╕реАрдзреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдЧрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдЕрд░реНрдерд╛рддред рдЕрдЧрд░ рд╣рдо рд╣рд░ рдЪрдХреНрд░ рдореЗрдВ рдЪрд░ x рдХреЛ 1 рд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдЧреЗрдо рдиреЗрдЯрдмреБрдХ рдкрд░ рдФрд░ рд╡рд┐рд╢рд╛рд▓ рд░реИрдо рд╡рд╛рд▓реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЯреНрд░реВ рд╕рдВрд╕реНрдХрд░рдг:
@Override public void Update(float deltaTime) { x += 150 * deltaTime; }
рдЯреНрд░реВ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ:
@Override public void Update(float deltaTime) { x += 150; }
рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рддреНрд░реБрдЯрд┐ рд╣реИ - рдмрд╣реБрдд рдмрд╛рд░, 1.0f * рдПрдХреНрд╕рдЯреНрд░реАрдордЯрд╛рдЗрдо рд╕реЗ рдмрдврд╝рддреЗ рдПрдХреНрд╕, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ 0 рд╕реЗ 1 рддрдХ рдПрдХ рдЧреИрд░-рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, x рдХреЛ рдлреНрд▓реЛрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рд╣рдо рд╕реНрдХреНрд░реАрди рдХреИрд╕реЗ рдмрджрд▓реЗрдВрдЧреЗ? рдЧреЗрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ
рд╕реЗрдЯрд╕реНрдХреНрд░реАрди рдлрд╝рдВрдХреНрд╢рди рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╡рд░реНрддрдорд╛рди рдФрд░ рдкреНрд░рд╛рд░рдВрдн рд╕реНрдХреНрд░реАрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рднреА рд╣реИрдВред
рдпрд╣ рдЗрд╕ рдкреВрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!
рдЯрд╛рдЗрдк рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ
рдЖрдкрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЗрдирдкреБрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ GetKeyEvents рдФрд░ GetTouchEvents рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬреЛ рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдПрдХ рдШрдЯрдирд╛ рдХреЗ рдЕрд╡рд╕рд░ рдкрд░, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рддрдм рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдмрддрд╛рдПрдВ, рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмреНрд░реЗрдХ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рд╕рд╣реА рд╣реИ - рдпрд╣ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ! рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкреВрд▓ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ, "рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓рд┐рдВрдЧ" рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдорд╛рд░рд┐рдпреЛ рддреНрд╕реЗрдирд░ рдХреА рдЙрддреНрдХреГрд╖реНрдЯ рдкреБрд╕реНрддрдХ "рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЧреЗрдореНрд╕" рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдзрд┐ред
рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЛ рдЖрд╡реЗрджрди рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ
public class Pool<T> { public interface PoolFactory<T> { public T Create(); } private final List<T> Objects; private final PoolFactory<T> Factory; private final int MaxSize; public Pool(PoolFactory<T> Factory, int MaxSize) { this.Factory = Factory; this.MaxSize = MaxSize; Objects = new ArrayList<T>(MaxSize); } public T NewObject() { T obj = null; if (Objects.size() == 0) obj = Factory.Create(); else obj = Objects.remove(Objects.size() - 1); return obj; } public void Free(T object) { if (Objects.size() < MaxSize) Objects.add(object); } }
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреВрд▓ рдкреВрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
PoolFactory<MechanicTouchEvent> factory = new PoolFactory<MechanicTouchEvent>() { @Override public MechanicTouchEvent Create() { return new MechanicTouchEvent(); } }; TouchEventPool = new Pool<MechanicTouchEvent>(factory, 100);
рдкреВрд▓ рдХреА рдШреЛрд╖рдгрд╛
TouchEventPool.Free(event);
рдПрдХ рдкреВрд▓ рдореЗрдВ рдПрдХ рдШрдЯрдирд╛ рдХреЛ рд╕рд╣реЗрдЬрдирд╛
event = TouchEventPool.NewObject();
рдкреВрд▓ рд╕реЗ рдШрдЯрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдпрджрд┐ рд╕реВрдЪреА рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдпрд╣ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдШрдЯрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдЕрдЧрд▓реЗ рдХреЙрд▓ рддрдХ рдкреВрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рд░рдЦ рджреЗрддреЗ рд╣реИрдВред
рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ!
MechanicAccelerometer
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 { float accelX, accelY, accelZ; public MechanicAccelerometer(Context context) { SensorManager manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); if(manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() > 0) { Sensor accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0); manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { accelX = event.values[0]; accelY = event.values[1]; accelZ = event.values[2]; } @Override public float GetAccelX() { return accelX; } @Override public float GetAccelY() { return accelY; } @Override public float GetAccelZ() { return accelZ; } }
рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╡рд░реНрдЧ SensorEventListener рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ - рдЗрд╕реЗ рди рдХреЗрд╡рд▓ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рдЦрд┐рд▓реМрдиреЛрдВ рдкрд░ рднреА - рдПрдХ рдХрдореНрдкрд╛рд╕, рдПрдХ рдЯреЙрд░реНрдЪ, рдФрд░ рдХреБрдЫ рдФрд░ред рдЕрдм рддрдХ, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдореЗрдВ рд╕реЗрдВрд╕рд░ рдореИрдиреЗрдЬрд░ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ (рдпрд╣ рдПрдХ рд╕реВрдЪреА рд╣реИ, рдПрдХ рд╡рд╕реНрддреБ рдирд╣реАрдВ), рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ 0 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рдПрдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдПрдХ рд╢реНрд░реЛрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред onAccuracyChanged рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрджрд┐ рд╕реЗрдВрд╕рд░ рдХреА рд╕рдЯреАрдХрддрд╛ рдЦреЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред onSensorChanged рдХреЛ рд╣рдореЗрд╢рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдПрдХреНрд╕реАрд▓рд░реЛрдореАрдЯрд░ рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдБ рд╣рдо рд░реАрдбрд┐рдВрдЧ рд▓реЗрддреЗ рд╣реИрдВред
MechanicTouch
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 { boolean EnableMultiTouch; final int MaxTouchers = 20; boolean[] IsTouched = new boolean[MaxTouchers]; int[] TouchX = new int[MaxTouchers]; int[] TouchY = new int[MaxTouchers]; Pool<MechanicTouchEvent> TouchEventPool; List<MechanicTouchEvent> TouchEvents = new ArrayList<MechanicTouchEvent>(); List<MechanicTouchEvent> TouchEventsBuffer = new ArrayList<MechanicTouchEvent>(); float ScaleX; float ScaleY; public MechanicTouch(View view, float scaleX, float scaleY) { if(Integer.parseInt(VERSION.SDK) < 5) EnableMultiTouch = false; else EnableMultiTouch = true; PoolFactory<MechanicTouchEvent> factory = new PoolFactory<MechanicTouchEvent>() { @Override public MechanicTouchEvent Create() { return new MechanicTouchEvent(); } }; TouchEventPool = new Pool<MechanicTouchEvent>(factory, 100); view.setOnTouchListener(this); this.ScaleX = scaleX; this.ScaleY = scaleY; } @Override public boolean onTouch(View v, MotionEvent event) { synchronized (this) { int action = event.getAction() & MotionEvent.ACTION_MASK; @SuppressWarnings("deprecation") int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; int pointerId = event.getPointerId(pointerIndex); MechanicTouchEvent TouchEvent; switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_POINTER_DOWN: TouchEvent = TouchEventPool.NewObject(); TouchEvent.Type = MechanicTouchEvent.TOUCH_DOWN; TouchEvent.Pointer = pointerId; TouchEvent.X = TouchX[pointerId] = (int)(event.getX(pointerIndex) * ScaleX); TouchEvent.Y = TouchY[pointerId] = (int)(event.getY(pointerIndex) * ScaleY); IsTouched[pointerId] = true; TouchEventsBuffer.add(TouchEvent); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: case MotionEvent.ACTION_CANCEL: TouchEvent = TouchEventPool.NewObject(); TouchEvent.Type = MechanicTouchEvent.TOUCH_UP; TouchEvent.Pointer = pointerId; TouchEvent.X = TouchX[pointerId] = (int)(event.getX(pointerIndex) * ScaleX); TouchEvent.Y = TouchY[pointerId] = (int)(event.getY(pointerIndex) * ScaleY); IsTouched[pointerId] = false; TouchEventsBuffer.add(TouchEvent); break; case MotionEvent.ACTION_MOVE: int pointerCount = event.getPointerCount(); for (int i = 0; i < pointerCount; i++) { pointerIndex = i; pointerId = event.getPointerId(pointerIndex); TouchEvent = TouchEventPool.NewObject(); TouchEvent.Type = MechanicTouchEvent.TOUCH_DRAGGED; TouchEvent.Pointer = pointerId; TouchEvent.X = TouchX[pointerId] = (int)(event.getX(pointerIndex) * ScaleX); TouchEvent.Y = TouchY[pointerId] = (int)(event.getY(pointerIndex) * ScaleY); TouchEventsBuffer.add(TouchEvent); } break; } return true; } } @Override public boolean IsTouchDown(int pointer) { synchronized(this) { if(pointer < 0 || pointer >= MaxTouchers) return false; else return IsTouched[pointer]; } } @Override public int GetTouchX(int pointer) { synchronized(this) { if (pointer < 0 || pointer >= MaxTouchers) return 0; else return TouchX[pointer]; } } @Override public int GetTouchY(int pointer) { synchronized(this) { if (pointer < 0 || pointer >= 20) return 0; else return TouchY[pointer]; } } @Override public List<MechanicTouchEvent> GetTouchEvents() { synchronized (this) { for (int i = 0; i < TouchEvents.size(); i++) TouchEventPool.Free(TouchEvents.get(i)); TouchEvents.clear(); TouchEvents.addAll(TouchEventsBuffer); TouchEventsBuffer.clear(); return TouchEvents; } } }
рдЯрдЪ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо OnTouchListener рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП EnableMultiTouch рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдХрдИ рдлрд┐рдВрдЧрд░ рдкреНрд░реЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ VERSION.SDK 5 рд╕реЗ рдХрдо рд╣реИ (рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рдЪрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рддреЛ рдпрд╣ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдореИрдХреНрд╕рдЯрдЪрд░реНрд╕ - рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ред рдЙрдирдореЗрдВ рд╕реЗ 20 рд╣реИрдВ, рд╢рд╛рдпрдж рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ред
рдСрдирдЯрдЪ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдореЗрдВ рдЙрдВрдЧрд▓реА рдирдВрдмрд░ рдФрд░ рдПрдХреНрд╢рди (рджрдмрд╛рдиреЗ, рдЙрдард╛рдиреЗ, рд╣рд┐рд▓рд╛рдиреЗ) рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдИрд╡реЗрдВрдЯ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдИрд╡реЗрдВрдЯ рдХреЛ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
GetTouchEvents рдореЗрдВ рд╣рдо рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдо рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдШрдЯрдирд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕реВрдЪреА рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ ScaleX рдФрд░ ScaleY рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ? рдпрд╣ рдмрд╛рдж рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
MechanicKeyboard
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 { boolean[] PressedKeys = new boolean[128]; Pool<MechanicKeyEvent> KeyEventPool; List<MechanicKeyEvent> KeyEventsBuffer = new ArrayList<MechanicKeyEvent>(); List<MechanicKeyEvent> KeyEvents = new ArrayList<MechanicKeyEvent>(); public MechanicKeyboard(View view) { PoolFactory<MechanicKeyEvent> pool = new PoolFactory<MechanicKeyEvent>() { @Override public MechanicKeyEvent Create() { return new MechanicKeyEvent(); } }; KeyEventPool = new Pool<MechanicKeyEvent>(pool,100); view.setOnKeyListener(this); view.setFocusableInTouchMode(true); view.requestFocus(); } public boolean IsKeyPressed(int KeyCode) { if(KeyCode < 0 || KeyCode > 127) return false; return PressedKeys[KeyCode]; } public List<MechanicKeyEvent> GetKeyEvents() { synchronized(this) { for(int i = 0; i < KeyEvents.size(); i++) KeyEventPool.Free(KeyEvents.get(i)); KeyEvents.clear(); KeyEvents.addAll(KeyEventsBuffer); KeyEventsBuffer.clear(); return KeyEvents; } } @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if(event.getAction() == KeyEvent.ACTION_MULTIPLE) return false; synchronized(this) { MechanicKeyEvent key = KeyEventPool.NewObject(); key.KeyCode = keyCode; key.KeyChar = (char)event.getUnicodeChar(); if(event.getAction() == KeyEvent.ACTION_DOWN) { key.Type = MechanicKeyEvent.KEY_DOWN; if(keyCode > 0 && keyCode < 128) PressedKeys[keyCode] = true; } if(event.getAction() == KeyEvent.ACTION_UP) { key.Type = MechanicKeyEvent.KEY_UP; if(keyCode > 0 && keyCode < 128) PressedKeys[keyCode] = false; } KeyEventsBuffer.add(key); } return false; } }
рд╣рдо 128 рдмреВрд▓рд┐рдпрди рдЪрд░ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рджрдмрд╛рдП рдЧрдП рдпрд╛ рджрдмрд╛рдП рдЧрдП 128 рдХреБрдВрдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд░рдЦреЗрдЧрд╛ред рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдФрд░ 2 рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдкреВрд▓ рднреА рдмрдирд╛рддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ
MechanicInput
package com.mechanic.input; import java.util.List; import android.content.Context; import android.view.View; public class MechanicInput implements Input { MechanicKeyboard keyboard; MechanicAccelerometer accel; MechanicTouch touch; public MechanicInput(Context context, View view, float scaleX, float scaleY) { accel = new MechanicAccelerometer(context); keyboard = new MechanicKeyboard(view); touch = new MechanicTouch(view, scaleX, scaleY); } @Override public boolean IsKeyPressed(int keyCode) { return keyboard.IsKeyPressed(keyCode); } @Override public boolean IsKeyPressed(char keyChar) { return keyboard.IsKeyPressed(keyChar); } @Override public boolean IsTouchDown(int pointer) { return touch.IsTouchDown(pointer); } @Override public int GetTouchX(int pointer) { return touch.GetTouchX(pointer); } @Override public int GetTouchY(int pointer) { return touch.GetTouchY(pointer); } @Override public float GetAccelX() { return accel.GetAccelX(); } @Override public float GetAccelY() { return accel.GetAccelY(); } @Override public float GetAccelZ() { return accel.GetAccelZ(); } @Override public List<MechanicTouchEvent> GetTouchEvents() { return touch.GetTouchEvents(); } @Override public List<MechanicKeyEvent> GetKeyEvents() { return keyboard.GetKeyEvents(); } }
рд╣рдо "рдореБрдЦреМрдЯрд╛" рдкреИрдЯрд░реНрди рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ!
рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
MechanicFileIO
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 { AssetManager assets; String ExternalStoragePath; public MechanicFileIO(AssetManager assets) { this.assets = assets; ExternalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator; } public InputStream ReadAsset(String name) throws IOException { return assets.open(name); } public InputStream ReadFile(String name) throws IOException { return new FileInputStream(ExternalStoragePath + name); } public OutputStream WriteFile(String name) throws IOException { return new FileOutputStream(ExternalStoragePath + name); } }
рд╣рдореЗрдВ рдПрд╕реЗрдЯ рдореИрдиреЗрдЬрд░ рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд╕реЗрдЯ рдореИрдиреЗрдЬрд░ рдорд┐рд▓рддрд╛ рд╣реИ, рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ 2 рдлрд╝рдВрдХреНрд╢рди рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдлрд╛рдЗрд▓реЗрдВ рд▓реЗрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдВ рд╣рдо рдЧреЗрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рдкрдврд╝рддреЗ рд╣реИрдВ - рд░рд┐рдХреЙрд░реНрдб, рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрде рд▓реЗрддреЗ рд╣реИрдВред
рдЕрдм рдЖрд╡рд╛рдЬ рдкреИрджрд╛ рдХрд░реЛ
рдзреНрд╡рдирд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛
MechanicSound
package com.mechanic.audio; import android.media.SoundPool; public class MechanicSound implements Sound { int id; SoundPool pool; public MechanicSound(SoundPool pool, int id) { this.pool = pool; this.id = id; } public void Play(float volume) { pool.play(id, volume, volume, 0, 0, 1); } public void Close() { pool.unload(id); } }
рдореИрдХреЗрдирд┐рдХрдСрдбрд┐рдпреЛ рдореЗрдВ, рд╣рдо рд╕рд╛рдЙрдВрдбрдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫреЛрдЯреЗ рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдореИрдХреЗрдирд┐рдХрд╕рд╛рдЙрдВрдб рдореЗрдВ, рд╣рдо рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕рд╛рдЙрдВрдбрдкреВрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдо рдзреНрд╡рдирд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ
MechanicMusic
package com.mechanic.audio; import java.io.IOException; import android.content.res.AssetFileDescriptor; import android.media.MediaPlayer; public class MechanicMusic implements Music { MediaPlayer Player; boolean IsPrepared = false; public MechanicMusic(AssetFileDescriptor descriptor) { Player = new MediaPlayer(); try { Player.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength()); Player.prepare(); IsPrepared = true; } catch(Exception ex) { throw new RuntimeException(" "); } } public void Close() { if(Player.isPlaying()) Player.stop(); Player.release(); } public boolean IsLooping() { return Player.isLooping(); } public boolean IsPlaying() { return Player.isPlaying(); } public boolean IsStopped() { return !IsPrepared; } public void Play() { if(Player.isPlaying()) return; try { synchronized(this) { if(!IsPrepared) Player.prepare(); Player.start(); } } catch(IllegalStateException ex) { ex.printStackTrace(); } catch(IOException ex) { ex.printStackTrace(); } } public void SetLooping(boolean loop) { Player.setLooping(loop); } public void SetVolume(float volume) { Player.setVolume(volume, volume); } public void Stop() { Player.stop(); synchronized(this) { IsPrepared = false; } } @Override public void onCompletion(MediaPlayer player) { synchronized(this) { IsPrepared = false; } } }
рд╣рдордиреЗ рдзреНрд╡рдирд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдкрд░ рд░рдЦрд╛ рдФрд░ рдЗрд╕реЗ рдмрдЬрд╛рдпрд╛ред
IsPrepared рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдзреНрд╡рдирд┐ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдореИрдВ рдЦреБрдж рдХреЛ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рд╣рдореЗрдВ рдореИрдХреЗрдирд┐рдХрдСрдбрд┐рдпреЛ рдорд┐рд▓рд╛
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 { AssetManager assets; SoundPool pool; public MechanicAudio(Activity activity) { activity.setVolumeControlStream(AudioManager.STREAM_MUSIC); this.assets = activity.getAssets(); pool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0); } public Music NewMusic(String name) { try { AssetFileDescriptor descriptor = assets.openFd(name); return new MechanicMusic(descriptor); } catch(IOException ex) { throw new RuntimeException(" " + name); } } public Sound NewSound(String name) { try { AssetFileDescriptor descriptor = assets.openFd(name); int id = pool.load(descriptor, 0); return new MechanicSound(pool, id); } catch(IOException ex) { throw new RuntimeException(" " + name); } } }
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреАрдд рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛, рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рд▓реЗрдирд╛ рдФрд░ рд╕рд╛рдЙрдВрдбрдкреВрд▓ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ 20 рд╕реЗ рдЕрдзрд┐рдХ рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЦреЗрд▓реЛрдВ рдореЗрдВ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИредрдореНрдпреВрдЬрд┐рдХ рдмрдирд╛рдиреЗ рдореЗрдВ, рд╣рдо рдореИрдХреЗрдирд┐рдХрдореНрдпреВрдЬрд┐рдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдПрдХ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рдЙрдВрдб рдореЗрдВ рд╣рдо рд╕рд╛рдЙрдВрдбрдкреВрд▓ рдореЗрдВ рд╕рд╛рдЙрдВрдб рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреВрд▓ рдФрд░ рд╕рд╛рдЙрдВрдб рдирдВрдмрд░ рдХреЛ рдореЗрдХреИрдирд┐рдХрд╕рд╛рдЙрдВрдб рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдмрдирддрд╛ рд╣реИредрд╣рдо рдПрдХ рдбреНрд░рд╛рдлреНрдЯреНрд╕рдореИрди рдмрдирд╛рддреЗ рд╣реИрдВрдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
MechanicImage package com.mechanic.graphics; import com.mechanic.graphics.Graphics.ImageFormat; import android.graphics.Bitmap; public class MechanicImage implements Image { Bitmap bitmap; ImageFormat format; public MechanicImage(Bitmap bitmap, ImageFormat format) { this.bitmap = bitmap; this.format = format; } @Override public int GetWidth() { return bitmap.getWidth(); } @Override public int GetHeight() { return bitmap.getHeight(); } @Override public ImageFormat GetFormat() { return format; } @Override public void Dispose() { bitmap.recycle(); } }
рдпрд╣ рд╡рд░реНрдЧ рдПрдХ рдЫрд╡рд┐ рдзрд╛рд░рдХ рд╣реИред рд╡рд╣ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛редMechanicGraphics 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 { AssetManager assets; Bitmap buffer; Canvas canvas; Paint paint; Rect srcRect = new Rect(), dstRect = new Rect(); public MechanicGraphics(AssetManager assets, Bitmap buffer) { this.assets = assets; this.buffer = buffer; this.canvas = new Canvas(buffer); this.paint = new Paint(); } @Override public Image NewImage(String fileName) { ImageFormat format; InputStream file = null; Bitmap bitmap = null; try { file = assets.open(fileName); bitmap = BitmapFactory.decodeStream(file); if (bitmap == null) throw new RuntimeException(" '" + fileName + "'"); } catch (IOException e) { throw new RuntimeException(" '" + fileName + "'"); } finally { try { if(file != null) file.close(); } catch(IOException e) { } } if (bitmap.getConfig() == Config.RGB_565) format = ImageFormat.RGB_565; else if (bitmap.getConfig() == Config.ARGB_4444) format = ImageFormat.ARGB_4444; else format = ImageFormat.ARGB_8888; return new MechanicImage(bitmap, format); } @Override public void Clear(int color) { canvas.drawRGB((color & 0xff0000) >> 16, (color & 0xff00) >> 8, (color & 0xff)); } @Override public void DrawPixel(int x, int y, int color) { paint.setColor(color); canvas.drawPoint(x, y, paint); } @Override public void DrawLine(int x, int y, int x2, int y2, int color) { paint.setColor(color); canvas.drawLine(x, y, x2, y2, paint); } @Override public void DrawRect(int x, int y, int width, int height, int color) { paint.setColor(color); paint.setStyle(Style.FILL); canvas.drawRect(x, y, x + width - 1, y + width - 1, paint); } @Override public void DrawImage(Image image, int x, int y, int srcX, int srcY, int srcWidth, int srcHeight) { srcRect.left = srcX; srcRect.top = srcY; srcRect.right = srcX + srcWidth - 1; srcRect.bottom = srcY + srcHeight - 1; dstRect.left = x; dstRect.top = y; dstRect.right = x + srcWidth - 1; dstRect.bottom = y + srcHeight - 1; canvas.drawBitmap(((MechanicImage)image).bitmap, srcRect, dstRect, null); } @Override public void DrawImage(Image image, int x, int y) { canvas.drawBitmap(((MechanicImage)image).bitmap, x, y, null); } @Override public int GetWidth() { return buffer.getWidth(); } @Override public int GetHeight() { return buffer.getHeight(); } }
рдзреНрдпрд╛рди рджреЛ!
рд╣рдо рд╣рд░ рдмрд╛рд░ рдбреНрд░рд╛ рдХрд░рддреЗ рд╕рдордп рдкреЗрдВрдЯ рдФрд░ рд░реЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдЪрд░рд╛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдкрд░рд╛рдз рд╣реИредрдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдо рдмрд┐рдЯрдореИрдк рд▓реЗрддреЗ рд╣реИрдВ - рдПрдХ рдмрдлрд░ рдЬрд┐рд╕ рдкрд░ рд╣рдо рд╕рдм рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдХреИрдирд╡рд╛рд╕ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдкрд░, рд╣рдо рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдЫрд╡рд┐ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдмрд┐рдЯрдореИрдк рдореЗрдВ рдЗрд╕реЗ рдбрд┐рдХреЛрдб рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдЪрд┐рддреНрд░ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдмрдВрдж рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЫрд╡рд┐ рдкреНрд░рд╛рд░реВрдк рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдирдП рдореИрдХреЗрдирд┐рдХрдЗрдореЗрдЬ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдмрд┐рдЯрдореИрдк рдФрд░ рдЗрдореЗрдЬрдлрд╝реЙрд░реНрдореЗрдЯ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрд╛рд╕ рднреЗрдЬрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдкрд╣рд▓рд╛ рдбреНрд░рд╛рдЗрдореЗрдЬ рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдПрдХ рддрд╕реНрд╡реАрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдпрд╣ рддрдм рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЦреЗрд▓ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЪрд┐рддреНрд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдПрдЯрд▓рд╕ рдирд╛рдордХ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рдореВрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдЯрд▓рд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
(interesnoe.info рд╡реЗрдм рд╕рдВрд╕рд╛рдзрди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдЪрд┐рддреНрд░)рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдЪрд┐рддреНрд░ 1.1 рдХрд╛ рд╕реНрдерд╛рди 32.32 рд╕реЗ 48.48 рддрдХ, 1.1 рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рддреЛ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ DrawImage(image, 1, 1, 32, 32, 16, 16);
рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддреА рд╣реИрдВ рдФрд░ рдмреНрдпрд╛рдЬ рдХреА рдирд╣реАрдВ рд╣реИрдВредрдпрд╣ рдЦреЗрд▓ рдФрд░ рд╕реНрдХреНрд░реАрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╣реИ!рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛редрд╕рд░реНрдлреЗрд╕ рд╡реНрдпреВ рд╡рд░реНрдЧ рд╕реЗ рдорд┐рд▓реЛ, рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЦреАрдВрдЪрдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИред рд░рдирд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ 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 { MechanicGame game; Canvas canvas; Bitmap buffer; Thread thread = null; SurfaceHolder holder; volatile boolean running = false; public Runner(Object context, MechanicGame game, Bitmap buffer) { super(game); this.game = game; this.buffer = buffer; this.holder = getHolder(); } public void Resume() { running = true; thread = new Thread(this); thread.start(); } public void run() { Rect dstRect = new Rect(); long startTime = System.nanoTime(); while(running) { if(!holder.getSurface().isValid()) continue; float deltaTime = (System.nanoTime()-startTime) / 1000000000.0f; startTime = System.nanoTime(); game.GetCurrentScreen().Update(deltaTime); game.GetCurrentScreen().Present(deltaTime); canvas = holder.lockCanvas(); canvas.getClipBounds(dstRect); canvas.drawBitmap(buffer, null, dstRect, null); holder.unlockCanvasAndPost(canvas); } } public void Pause() { running = false; while(true) { try { thread.join(); break; } catch (InterruptedException e) { } } } }
рдореИрдХреЗрдирд┐рдХрдЧреЗрдо рд╡рд░реНрдЧ рдЬрд▓реНрдж рд╣реА рдЖ рд░рд╣рд╛ рд╣реИ, рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВредрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдирд╣реАрдВ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд░рдлреЗрд╕рд╣рд╛рд░реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реИрдВ LockCanvas рдФрд░ unlockCanvasAndPostред рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рд╕рд░рдлреЗрд╕ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдХреИрдирд╡рд╕ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд┐рдЯрдореИрдк рдмрдлрд░, рдЬреЛ рдПрдХ рдХреИрдирд╡рд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ)редрд░рд┐рдЬреНрдпреВрдореЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВредрд░рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рдЪрдХреНрд░ рд╕реЗ рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (System.nanoTime рд░рд┐рдЯрд░реНрди nanoseconds) рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдХреНрд░реАрди рдХреЗ рдЕрдкрдбреЗрдЯ рдФрд░ рдкреНрд░реЗрдЬреЗрдВрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ рдмрдлрд░ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИредрдпрд╣рд╛рдВ рдореИрдХреЗрдирд┐рдХрдЧреЗрдо рдХреНрд▓рд╛рд╕ рд╣реИ 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 { Runner runner; Graphics graphics; Audio audio; Input input; FileIO fileIO; Screen screen; WakeLock wakeLock; static final int SCREEN_WIDTH = 80; static final int SCREEN_HEIGHT = 128; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); boolean IsLandscape = (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE); int frameBufferWidth = IsLandscape ? SCREEN_HEIGHT : SCREEN_WIDTH; int frameBufferHeight = IsLandscape ? SCREEN_WIDTH : SCREEN_HEIGHT; Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth, frameBufferHeight, Config.RGB_565); float scaleX = (float) frameBufferWidth / getWindowManager().getDefaultDisplay().getWidth(); float scaleY = (float) frameBufferHeight / getWindowManager().getDefaultDisplay().getHeight(); runner = new Runner(null, this, frameBuffer); graphics = new MechanicGraphics(getAssets(), frameBuffer); fileIO = new MechanicFileIO(getAssets()); audio = new MechanicAudio(this); input = new MechanicInput(this, runner, scaleX, scaleY); screen = GetStartScreen(); setContentView(runner); PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "Game"); } @Override public Input GetInput() { return input; } @Override public FileIO GetFileIO() { return fileIO; } @Override public Graphics GetGraphics() { return graphics; } @Override public Audio GetAudio() { return audio; } @Override public void SetScreen(Screen screen) { if (screen == null) throw new IllegalArgumentException("Screen null"); this.screen.Pause(); this.screen.Dispose(); screen.Resume(); screen.Update(0); this.screen = screen; } @Override public Screen GetCurrentScreen() { return screen; } @Override public Screen GetStartScreen() { return null; } @Override public void onResume() { super.onResume(); wakeLock.acquire(); screen.Resume(); runner.Resume(); } @Override public void onPause() { super.onPause(); wakeLock.release(); runner.Pause(); screen.Pause(); if(isFinishing()) screen.Dispose(); } }
рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рд░рдирд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕, рд╣рдорд╛рд░реЗ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдПрдХ рд╡реЗрдХреЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯ (рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЧреЗрдо рдЪрд▓рдиреЗ рдкрд░ рдлреЛрди рд╕реЛ рди рдЬрд╛рдП)рдЗрд╕рдореЗрдВ 2 рд╕реНрдерд┐рд░рд╛рдВрдХ рднреА рд╣реИрдВ - SCREEN_WIDTH рдФрд░ SCREEN_HEIGHT, рдЬреЛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ!рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рдХрдИ рд╕рдВрдХрд▓реНрдк рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ, рд╕реНрдерд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдпрд╣ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рдФрд░ рд╡реНрдпрд░реНрде рд╣реИред рдЖрджрд┐
рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 80x128 рдкрд┐рдХреНрд╕реЗрд▓ (рджреЛ рдКрдкрд░ рд╡рд╛рд▓реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ) рд╕реЗ рдорд╛рдкрдиреЗ рд╡рд╛рд▓реА рдПрдХ рдЦрд┐рдбрд╝рдХреА рд╣реИред рд╣рдо рдЗрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЫреЛрдЯреА рддрд╕реНрд╡реАрд░реЗрдВ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЪрд╛рдирдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рд╕реНрдХреНрд░реАрди рдЖрдХрд╛рд░ рдЗрд╕ рд╡рд┐рдВрдбреЛ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдХрд░реЗрдВ?
рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - рд╣рдо рдЕрдкрдиреА рдЦрд┐рдбрд╝рдХреА рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рд▓рдВрдмрд╛рдИ рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рд▓рдВрдмрд╛рдИ рддрдХ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдЕрдиреБрдкрд╛рдд рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╕рднреА рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВредрдирддреАрдЬрддрди, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рдпрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рд╕реНрдХреНрд░реАрди рдХреЗ рдиреАрдЪреЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдлреИрд▓рд╛рддрд╛ рд╣реИредрдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ onCreate, onResume рдФрд░ onPause рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВредрдСрдирдХреНрд░рд┐рдПрдЯ рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд╣рд▓реЗ рдлрд╝реБрд▓-рд╕реНрдХреНрд░реАрди рдореЛрдб рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рддрд╛рдХрд┐ рдЪрд╛рд░реНрдЬрд┐рдВрдЧ рдФрд░ рд╕рдордп рд╢реАрд░реНрд╖ рдкрд░ рджрд┐рдЦрд╛рдИ рди рджреЗ)ред рдлрд┐рд░ рдпрд╣ рдлреЛрди - рдкрд░рд┐рджреГрд╢реНрдп рдпрд╛ рдЪрд┐рддреНрд░ (рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ .xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЗ рдЙрдиреНрдореБрдЦреАрдХрд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдмрдлрд░ 80x128 рдкрд┐рдХреНрд╕рд▓ рдХреА рдЗрд╕ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рд╡рд┐рдВрдбреЛ рдХрд╛ рдЖрдХрд╛рд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдореИрдХреЗрдирд┐рдХрдЗрдиреНрдкреБрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ рдореИрдХреЗрдирд┐рдХрдЯрдЪ рд╕реЗ рд╕рдВрдмрдВрдз рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ - рдмрд┐рдВрдЧреЛ! рд╕реНрдХреНрд░реАрди рдкрд░ рдкрд░рд┐рдгрд╛рдореА рд╕реНрдкрд░реНрд╢ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЗрд╕ рдЕрдиреБрдкрд╛рдд рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрддреЗ рд╣реИрдВредрдЕрдЧрд▓рд╛, рд╣рдо рдЕрдкрдирд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рд░рдирд░ рдФрд░ рд╡реЗрдХреЙрдХ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВредрд╕реЗрдЯрд╕реНрдХреНрд░реАрди рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рд╡рд░реНрддрдорд╛рди рд╕реНрдХреНрд░реАрди рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░реА рд╕реНрдХреНрд░реАрди рд▓рд┐рдЦрддреЗ рд╣реИрдВредрдмреНрдпрд╛рдЬ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВредрдХреНрдпрд╛ рд╡рд╣ рд╕рдм рд╣реИ?рд╣рд╛рдБ, рд╕рдЬреНрдЬрдиреЛрдВ, рдврд╛рдВрдЪрд╛ рддреИрдпрд╛рд░ рд╣реИ!рдЬрдм рд╣реЛ рдЧрдпрд╛редрдФрд░ рдЕрдм рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MyGame рдХреЗ рд╕рд╛рде?"рдореБрдЦреНрдп" рд╡рд░реНрдЧ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ public class MyGame extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_game); } @Override public boolean onCreateOptionsMenu(Menu menu) {
рд╣рдо рдЗрд╕реЗ рдЗрд╕ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ package com.mechanic; import com.mechanic.game.MechanicGame; import com.mechanic.game.Screen; public class MyGame extends MechanicGame { @Override public Screen GetStartScreen() { return new GameScreen(this); } }
рдЬрд╛рд╡рд╛ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдХреЗрдирд┐рдХрдЧреЗрдо рд╕реНрд╡рдпрдВ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред onCreate рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрдВрдЬреАрдХреГрдд рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рд╣реИ GetStartScreen () рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдореИрдХреЗрдирд┐рдХрдЧреЗрдо рдореЗрдВ рдЕрд╢рдХреНрдд рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИредGameScreen рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВ :) 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 { Graphics g = game.GetGraphics(); Image wikitan; float x = 0.0f; public GameScreen(Game game) { super(game); wikitan = g.NewImage("wikipetan.png"); } @Override public void Update(float deltaTime) { if(game.GetInput().IsTouchDown(0)) x += 1.0f * deltaTime; } @Override public void Present(float deltaTime) { g.Clear(0); g.DrawImage(wikitan, (int)x, 0); } @Override public void Pause() { } @Override public void Resume() { } @Override public void Dispose() { wikitan.Dispose(); } }
рдпрд╣ рдПрдХ рд╕реНрдХреНрд░реАрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛-рдЯреИрди рдЫрд╡рд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
(рдЫрд╡рд┐ ru.wikipedia.org рд╡реЗрдм рд╕рдВрд╕рд╛рдзрди рд╕реЗ рд▓реА рдЧрдИ рд╣реИ)рдкрд░рд┐рдгрд╛рдо
рдЪрд░ x рдХреЛ рдПрдХ рдлреНрд▓реЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 0 рд╕реЗ 1 рддрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЧреЛрд▓рд╛рдИ рдЪрд▓ рд░рд╣реА рд╣реИредрд╡рд┐рдХрд┐рдкреНрдк-рдЯреИрди рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЖрдХрд╛рд░ 80x128 рдкрд┐рдХреНрд╕рд▓ рд╣реИрдкреНрд░рд╢реНрди рдФрд░ рдЙрддреНрддрд░:
- рдореЗрд░реА рддрд╕реНрд╡реАрд░ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рд╣реИ - 90 рдбрд┐рдЧреНрд░реА рдШреБрдорд╛рдпрд╛ рдЧрдпрд╛!- рдпрд╣ рд╕рдм рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрдорд╛рдВрдб рдХреЗрд╡рд▓ рд▓реИрдВрдбрд╕реНрдХреЗрдк рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреА рдереАред рдореЛрдб рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреАрдмреЛрд░реНрдб рдХреЗ рджрд╛рдИрдВ рдУрд░ рдХреБрдВрдЬреА 7 рджрдмрд╛рдПрдВ- рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ x + = 1.0f * рдбреЗрд▓реНрдЯрд╛ рдмрджрд▓ рджреЗрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЪрд┐рддреНрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИред рдХреНрдпрд╛ рдХрд░реЗрдВ?- рдПрдореБрд▓реЗрдЯрд░ рдмрд╣реБрдд рдзреАрдореА рдЪреАрдЬ рд╣реИред рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВредрдордЬрд╛ рдЖ рдЧрдпрд╛!рд╕реНрд░реЛрдд:rghost.ru/49052713github.com/Izaron/MechanicFrameworkрд╕рд╛рд╣рд┐рддреНрдп:developer.alexanderklimov.ru/androidhabrahabr.ru/post/109944рдорд╛рд░рд┐рдпреЛ рдЯреЗрдВрдЪрд░ рдХреА рдкреБрд╕реНрддрдХ "рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЧреЗрдореНрд╕"