рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ Pacman рд▓рд┐рдЦрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЖрдпрд╛ред рднрд╛рдЧ 1

рд╣реИрд▓реЛ, рдкреНрд░рд┐рдп рд╣реЗрдмреНрд░рд╛рд▓рдо!
рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рд╕реЗ, рдЕрдкрдиреЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ, рдореИрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд┐рджреНрдз рдкрдЪрдореИрди рдЧреЗрдо рдХрд╛ рдПрдХ рдХреНрд▓реЛрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдХреИрд╕рд╛ рдерд╛, рдФрд░ рдпрд╣ рдХреНрдпрд╛ рдЖрдпрд╛, рдореИрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред


рдкреИрдорд╛рдирд╛ рдХреНрдпреЛрдВ?

рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдкрд╛рдардХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рдЭрд┐рд▓рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рд╣реИред рд╣рд╛рдВ, рдпрд╣ рд╕рд╣реА рд╣реИ, рдпрд╣ ZeptoLab рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рдерд╛ред рдЗрд╕ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╕реЗ, рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдг рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ: Android NDK, C ++, OpenGLред

Pacman: рд╢реБрд░реБрдЖрдд

рддреЛ, рдирд┐рд░реНрдгрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдкрдХрд░рдг рдЪреБрдиреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ? рдПрдВрдбреНрд░реЙрдЗрдб рдПрдирдбреАрдХреЗ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИ, рдУрдкрдирдЬреАрдПрд▓ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ 2011 рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рд╕реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдХрд╛рдо рддрдХ рд╕реАрдорд┐рдд рд╣реИред C ++ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЦреЗрд▓ рджреЗрд╡ рдореЗрдВ рдирд╣реАрдВред рдЕрдЪреНрдЫрд╛, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдореИрдВрдиреЗ рд╕реНрдерд╛рдкрд┐рдд рдХреА рдереА, рд╡рд╣ рдПрдирдбреАрдХреЗ (рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рд╡рд┐рджреЗрд╢реА рдФрд░ рд░рдирд╡реЗ рджреЛрдиреЛрдВ рдкрд░ рд╡рд┐рд╕реНрддреГрдд рд╣реИ) рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рддрд░рдг рд╕реЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП: рдкрд╣рд▓рд╛, GL2JNI рдЙрджрд╛рд╣рд░рдг, рдФрд░ рджреВрд╕рд░рд╛ рд╕реИрди рд╕реЗрдВрдЬреЗрд▓реНрд╕ред рдкрд╣рд▓рд╛ OpenGL ES 2.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рддреНрд░рд┐рднреБрдЬ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ OpenGL ES рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдЗрдореЗрдЯ рд╕реЗ рдЗрдХрдЯреНрдареЗ рдПрдХ 3D рдлрд┐рд▓реНрдо рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдХреЛрдб рдбрд░рд╛рд╡рдирд╛ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рдБ, рдФрд░ рджреВрд╕рд░рд╛ рднреАред рджрд░рдЕрд╕рд▓, GL2JNI рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА gl_code.cpp рдлрд╛рдЗрд▓ рдореЗрд░реЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдереАред

OpenGL ES 2.0 рдХреНрдпреЛрдВ?

рдмреЗрд╢рдХ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг 2 рдбреА рдЧреЗрдо рдХреЗ рд▓рд┐рдП, рдУрдкрдирдЬреАрдПрд▓ рдИрдПрд╕ рд╕реНрдерд┐рд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдХреЛрдИ рд╢реЗрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ? рдЬрд╡рд╛рдм: рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкрд░ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдХреЗ рдХрд╛рдо рдореЗрдВ, рд╢реЗрдбреНрд╕ рдХреЛ рдЫреВрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рддреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛?

рдУрдкрдирдЬреАрдПрд▓ рдИрдПрд╕ 2.0 рдХрд╛ рдЕрдзреНрдпрдпрди рдпрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ, рд╣рдмреНрдмрд░рдмреНрд░ рдХреЗ рд╕рд╛рде, рд▓реЗрдЦ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╕рднреА рдУрдкрдирдЧреЗрд▓ рдИрдПрд╕ 2.x рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - (рднрд╛рдЧ 1/3) ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдЕрдм рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдЦреЛрдЬ рд╕рдХрддрд╛, рд╢рд╛рдпрдж рд▓реЗрдЦрдХ рдиреЗ рдЗрд╕реЗ рдорд╕реМрджрд╛ рдкреНрд░рддрд┐рдпреЛрдВ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рд╣реИред рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ iOS рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ OpenGL ES 2.x рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓рдЧрднрдЧ рд╕рднреА Android рдХреЗ рд▓рд┐рдП рд╕рдЪ рд╣реИред рд░реВрд╕реА рдореЗрдВ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЕрдВрдЧреНрд░реЗрдЬреА-рднрд╛рд╖рд╛ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рд▓реЗрдЦ рдХреЗ рднрд╛рдЧ 2 рдФрд░ 3, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдпрд╛, рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдУрдкрдирдЬреАрдПрд▓ рдИрдПрд╕ 2.0 рдкрд░ рд╕рднреА рдЬреНрдЮрд╛рди рдорд┐рд▓рд╛, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред

рдпрд╣ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╣реИ

рдпрд╣ рдореЗрд░реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЦреЗрд▓ рдХреЗ рдкрд╣рд▓реЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдХреНрд░реАрди рдереЗ, рддреНрд░рд┐рдХреЛрдг рдФрд░ рд░рд╕реНрддрдордг рддреНрд░рд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдкреНрд░рд╢рд╕реНрдд, рдХрд╛рд▓реНрдкрдирд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓рддреЗ рд░рдВрдЧред
рдЗрд╕ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдЖрджрд┐рдо рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
  1. рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдмрдирд╛рд╡рдЯред рд╣рд╛рдВ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдХрджрдо рдерд╛;
  2. рдорд╛рдирдЪрд┐рддреНрд░ред рдпрд╣ рд╣реИ, рдЙрд╕ рдкрд░ рджреАрд╡рд╛рд░реЗрдВ, рднреЛрдЬрди рдФрд░ рдЦрд╛рд▓реА рдЬрдЧрд╣ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╣реИрдВ;
  3. рдЬреАрдпреВрдЖрдИред рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдБ рдХреЛрдиреЗ рдореЗрдВ рдПрдХ рдмрдЯрди рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рд╣рд╛рдВ, рдпрд╣ рдкрд╣рд▓рд╛ рдмрдЯрди рдерд╛ред

рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд░рдг:

рдмрдирд╛рд╡рдЯ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ

Android NDK рдореЗрдВ рдмрдирд╛рд╡рдЯ рд▓реЛрдбрд┐рдВрдЧ рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ:

рд╢рд╛рдпрдж рдЕрднреА рднреА рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдкрд╛рдпрд╛ рд╣реИред рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╕рдмрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд▓рдЧрд╛; рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред

рдЬрд╛рд╡рд╛ рдХреЛрдб рдХрд╛ рдПрдХ рдмрд┐рдЯ
import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; /*   Bitmap,       jni*/ public class PngManager { private AssetManager amgr; public PngManager(AssetManager manager){ amgr = manager; } public Bitmap open(String path){ try{ return BitmapFactory.decodeStream(amgr.open(path)); }catch (Exception e) { } return null; } public int getWidth(Bitmap bmp) { return bmp.getWidth(); } public int getHeight(Bitmap bmp) { return bmp.getHeight(); } public void getPixels(Bitmap bmp, int[] pixels){ int w = bmp.getWidth(); int h = bmp.getHeight(); bmp.getPixels(pixels, 0, w, 0, 0, w, h); } public void close(Bitmap bmp){ bmp.recycle(); } } 


C ++ рдХреЛрдб рдХрд╛ рдПрдХ рдмрд┐рдЯ
 /*    */ struct Texture{ char* pixels; /*should be allocated with new[width*height*4]; RGBA*/ int width; int height; Texture(): pixels(NULL), width(0), height(0){} Texture(char* p, int w, int h): pixels(p), width(w), height(h){}; ~Texture(){ if(pixels){ delete[] pixels; pixels = NULL; } } }; /* ,     .    jni  Java */ void Art::init(JNIEnv* env, jint _screenWidth, jint _screenHeight, jobject _pngManager, jobject javaAssetManager){ LOGI("Art::init"); free(env); /*  - */ pngManager = env->NewGlobalRef(_pngManager); pmEnv = env; pmClass = env->GetObjectClass(pngManager); pmOpenId = env->GetMethodID(pmClass, "open", "(Ljava/lang/String;)Landroid/graphics/Bitmap;"); pmCloseId = env->GetMethodID(pmClass, "close", "(Landroid/graphics/Bitmap;)V"); pmGetWidthId = env->GetMethodID(pmClass, "getWidth", "(Landroid/graphics/Bitmap;)I"); pmGetHeightId = env->GetMethodID(pmClass, "getHeight", "(Landroid/graphics/Bitmap;)I"); pmGetPixelsId = env->GetMethodID(pmClass, "getPixels", "(Landroid/graphics/Bitmap;[I)V"); /*...*/ } /* jni     */ Texture* Art::loadPng(const char* filename){ LOGI("Art::loadPng(%s)", filename); Texture* result = new Texture(); jstring name = pmEnv->NewStringUTF(filename); jobject png = pmEnv->CallObjectMethod(pngManager, pmOpenId, name); pmEnv->DeleteLocalRef(name); pmEnv->NewGlobalRef(png); jint width = pmEnv->CallIntMethod(pngManager, pmGetWidthId, png); jint height = pmEnv->CallIntMethod(pngManager, pmGetHeightId, png); jintArray array = pmEnv->NewIntArray(width * height); pmEnv->NewGlobalRef(array); pmEnv->CallVoidMethod(pngManager, pmGetPixelsId, png, array); jint *pixels = pmEnv->GetIntArrayElements(array, 0); result->pixels = argb2rgba((unsigned int*)pixels, width, height); result->width = width; result->height = height; pmEnv->ReleaseIntArrayElements(array, pixels, 0); pmEnv->CallVoidMethod(pngManager, pmCloseId, png); return result; } 


Art рдХреНрд▓рд╛рд╕ рдореЗрдВ рд░реБрдХрдиреЗ рд▓рд╛рдпрдХ рд╣реИред рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ Notch (рдЙрдирдХреЗ рдУрдкрди рд╕реЛрд░реНрд╕ рдЧреЗрдореНрд╕ рдореЗрдВ рд╕реЗ) рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдХрдХреНрд╖рд╛ рдХрд╛ рдирд╛рдо рдерд╛ред рдпрд╣ рдХрд▓рд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ: рдмрдирд╛рд╡рдЯ, рд╕рдВрдЧреАрдд, рдЖрд╡рд╛рдЬрд╝, рдЖрджрд┐ред рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ init(), free(), getTexture(int id) рдФрд░ init(), free(), getTexture(int id) рдПрдХ init(), free(), getTexture(int id) ред

рдпрд╣ рдирдХреНрд╢реЗ

рд╡рд┐рдХрд╛рд╕ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ, рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд▓реЛрдбрд┐рдВрдЧ рд╕реНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред "рд╣рд╛рд░реНрдбрдХреЛрдб" рдФрд░ "рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрдврд╝рд╛" рд╡рд┐рдХрд▓реНрдк рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рдХрд╛рд░реНрдб рдХреЗ рдХрд┐рд╕реА рднреА рдЖрд╕рд╛рди рд╕рдВрдкрд╛рджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕реНрддрд░ рдХреЗ рд╕рдВрдкрд╛рджрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд▓реЗрдЦ рджреЗрдЦрд╛ ... рдирд╣реАрдВ! рддреЛ рдЬрдВрдЧрд▓ рдХреЗ рд╡реГрдХреНрд╖ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рдкрдбрд╝реЗрдВрдЧреЗред рдореИрдВ рдЦреБрдж рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд▓рдХреНрд╖реНрдп рдкрдЪрдорди рдФрд░ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл png рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╕реАрдЦ рдЧрдпрд╛! рд╡рд┐рднрд┐рдиреНрди рд░рдВрдЧреЛрдВ рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рджреАрд╡рд╛рд░реЛрдВ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ, рднреЛрдЬрди, рдЦрд╛рд▓реА рдЬрдЧрд╣, рдкреИрдХрдореИрди рдЖрджрд┐ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдФрд░ рдкреЗрдВрдЯ рдПрдХ рд╕реНрддрд░ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИред рдХрд╛рд░реНрдб рдХрд╛ рдЖрдХрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, 32x32 рддрдХред
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг 100% рд╣реА рд╕рд╛рдмрд┐рдд рд╣реБрдЖ рд╣реИред рдореБрдЭреЗ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рдЧрднрдЧ рдореБрдлреНрдд рдореЗрдВ рд╕рдВрдкрд╛рджрди рдпреЛрдЧреНрдп рд╕реНрддрд░ рдорд┐рд▓ рдЧрдпрд╛ред

рдЬреАрдпреВрдЖрдИ

рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдереАред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдмрдЯрди рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпрд╛ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреИрд╕реЗ рджреЗрдВ? рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ? рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рднрд╛рдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ? рдЕрдкрдиреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдЦреБрдж рджрд┐рдПред рд╡рд░реНрдЧ рдЖрд░реЗрдЦ рдореЗрдВ, рдореЗрд░рд╛ рдЙрддреНрддрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдПрдХ рдореВрд▓ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣реИ IRenderable , рдЬрд┐рд╕рдореЗрдВ рд╕реЗ Control рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ Label, Button, CheckBox рдФрд░ Menu ( Contro рдПрдХ рд╕реВрдЪреА рдХреЛ Contro ) рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред рдЕрдиреНрдп рд╕рднреА рдореЗрдиреВ ( Pause/Game/GameOver , рдЖрджрд┐) Menu рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред рд╡реЗ рд╕рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдмрдирд╛рддреЗ рд╕рдордп, рдирд┐рдпрдВрддреНрд░рдг ( Button, Label , рдЖрджрд┐) рдХреА рдПрдХ рд╕реВрдЪреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдореЗрдиреВ рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, GameMenu рд╕реНрд╡рд╛рдЗрдк рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ)ред render() рдкрджреНрдзрддрд┐ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓реА рдХрдХреНрд╖рд╛ рдХреЛ рдмреБрд▓рд╛рддреА рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ Engine рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЦреЗрд▓ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдореЗрдиреВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЖрджрд┐ред рдЗрд╕рдореЗрдВ Menu* currentMenu , рдЬрд┐рд╕реЗ рд╡рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред Engine рднреА Menu::onShow() рдХрд╣рддрд╛ рд╣реИред

рдЦреЗрд▓ рддрд░реНрдХ


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

StupidMonster рдФрд░ StupidMonster , newDirectionEvent() рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВ: StupidMonster рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, Pacman 'a рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддрд╛ред CleverMonster рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рдорд╛рд░реНрдЧ рдкрд░ CleverMonster рдкреАрдЫрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд░реВрдк рд╕реЗ "рд░рдгрдиреАрддрд┐" рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВред

рдЪреВрдВрдХрд┐ рдирдХреНрд╢рд╛ рдПрдХ рд╕рд░рдгреА рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрде рдЦреЛрдЬ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рддрд░рдВрдЧ рдореЛрд░реНрдЪреЗ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рддрд░рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдЖрдк рджрд┐рд╢рд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ 4 рдореЗрдВ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИред
CleverMonster рд╡рд░реНрдЧ рдореЗрдВ рдирдХреНрд╢реЗ CleverMonster рдПрдХ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рд░реНрдбреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА (рдЖрдХрд╛рд░ рдирдХреНрд╢реЗ рдХрд╛ рдЖрдХрд╛рд░) рд╣реИред CleverMonster рдХрд╛ рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп, рдЗрд╕ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдЬрдм рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореЗрдореЛрд░реА рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдордп рдкрд░ рд╣рд░ рдкрд▓ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо:
  1. Pacman (pX, pY) рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ;
  2. рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд░ рдирдХреНрд╢реЗ рдХреА рд╕рд░рдгреА рджреЗрдЦреЗрдВ: рдирдХреНрд╢реЗ [pX, pY];
    • рдпрджрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдирдЪрд┐рддреНрд░ рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛ рд╣реИ (NULL), рддреЛ рдЪрд░рдг 3 рдкрд░ рдЬрд╛рдПрдВ;
    • рдЕрдиреНрдпрдерд╛ рдЪрд░рдг 5 рдкрд░ рдЬрд╛рдПрдВ

  3. рдореВрд▓ рдХреЗ рд╕рдорд╛рди рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдПрдВ, рдирдХреНрд╢реЗ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ [pX, pY];
  4. рд╕реЗрд▓ (pX, pY) рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рд▓рд╣рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдмрдирд╛рдП рдЧрдП рдирдХреНрд╢реЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднрд░реЗрдВ;
  5. рдирдХреНрд╢реЗ рдХреЗ рдирдХреНрд╢реЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдкрде рдмрдирд╛рдПрдВ [pX, pY];

рдПрдХ рд╣реА рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдирд╣реАрдВ рдЧрд┐рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред рд╕рднреА рд╕реНрдорд╛рд░реНрдЯ рд░рд╛рдХреНрд╖рд╕ рдПрдХ рд╣реА рдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдирдХреНрд╢рд╛ рдПрдХ рдмрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдб рдХрднреА рднреА рдирд╣реАрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдкреАрдХрдорд╛рди рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ)ред
рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ 20x20 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдорд╛рдкрдиреЗ рд╡рд╛рд▓реА рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП, 20 * 20 * 20 * 20 * 4 = 640,000 рдмрд╛рдЗрдЯреНрд╕ рдпрд╛ 625 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рджреАрд╡рд╛рд░реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рдЫреЛрдЯреА рд╣реИред


рдкрд╣рд▓реЗ рднрд╛рдЧ рдХрд╛ рдкрд░рд┐рдгрд╛рдо

рдпрд╣ рд▓рдЧрднрдЧ рддреАрди рд╕рдкреНрддрд╛рд╣ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдерд╛ред Pacman рдХреЗ рдмрд╛рдж рд░рд╛рдХреНрд╖рд╕ рджреМрдбрд╝рддреЗ рд╣реИрдВ, Pacman рдЦрд╛рдирд╛ рдЦрд╛рддреЗ рд╣реИрдВ рдФрд░ рддреАрди рдмрд╛рд░ рдорд░рдирд╛ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧреЗрдо рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ, рдЬреАрддрдиреЗ рдкрд░ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдкрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдореЗрдиреВ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрд▓рдЧ рд╕реНрддрд░ рдЪреБрди рд╕рдХрддрд╛ рд╣реИред Pacman 'рдПрдирд┐рдореЗрдЯреЗрдб рд╣реИ, рд░рд╛рдХреНрд╖рд╕ рдирд╣реАрдВ рд╣реИрдВред рдореИрдВ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ Pacman рдПрдиреАрдореЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рд┐рдЦреВрдВрдЧрд╛ред
рдЗрд╕ рд░реВрдк рдореЗрдВ, ZeptoLab рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдЪ рдХрд╣реВрдБ рддреЛ - рди рддреЛ рдкрд╣рд▓реЗ рдФрд░ рди рд╣реА рдмрд╛рдж рдореЗрдВ рдореИрдВ рдЗрддрдирд╛ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рдерд╛ рдФрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рд╡рд╛рд▓реЛрдВ рдкрд░ рдмреЗрд╡рдХреВрдл рдирд╣реАрдВ рдерд╛ред рдпрд╣ рдПрдХ рдорд╣рд╛рдХрд╛рд╡реНрдп рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЕрд╕рдлрд▓ред рдореБрдЭреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рд╕реА ++ рдкрд░ рдХрдИ рдХрд┐рддрд╛рдмреЗрдВ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЧрдИ, рдлрд░рд╡рд░реА рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдорд┐рд▓рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЧрдИред рдЦреЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдЪрдЖрд░ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдереА: "рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рд╕реНрддреБрддрд┐рдпрд╛рдБред" рдФрд░ рд╡реИрд╕реЗ, рдореИрдВ рдЕрднреА рднреА рдХрд╛рдо рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реВрдВред

рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдФрд░ Google Play Market рд▓рд┐рдВрдХ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░реЛрдлрд╛рдЗрд▓ рд╣рдм рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЬреНрдЮрд╛рдкрди рди рд╣реЛред

рджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рд▓рд┐рдВрдХ

Source: https://habr.com/ru/post/In178037/


All Articles