Пишемо гру для android c допомогою andengine

Всім привіт.
Сьогодні я розповім вам як за допомогою AndEngine написати невелику гру. Стаья вийшла досить велика і, щоб не втомлювати читача, поки ми зупинимося на першій її частині. Все що потрібно від читача - це знання java, ООП і уміння поводитися з Eclipse і Android SDK. Забігаючи вперед, у нас вийде щось схоже на Mirrors Maze або Laser Logic.
Друга частина статті.
Третя частина статті.

Як встановлювати Eclipse, Android SDK, створювати проекти і підключати бібліотеки я не буду, так що відразу перейдемо до справи.

Крок 1: На любителя. Можна завантажити вихідні AndEngine і підключити до проекту як Android бібліотеку. Або взяти із прикладів уже готовий .jar. В обох випадках вам знадобиться Mercurial. на ньому ми теж не будемо зупинятися.
Крок 2: Проект створений, всі бібліотеки підключені. Тепер нам потрібні зображення. Сздаем в проекті папку:

Ну або кому як подобається і кидаємо туди 2 зображення. Одне фонове і наш лазер.
Більше ніяких зображень не потрібно. Бувай.
Крок 3: Ну і якщо вже ми почали з зображень то напишемо невеликий клас який будемо нам їх форматувати.
public class Textures

private Texture mTexture;
private TextureRegion mLaserGunTextureRegion, mBackgroundTextureRegion;

public Textures (final BaseGameActivity activity, final Engine engine) Log.i ( "Laser Logic". "onLoadResources");
this .mTexture = new Texture (1024, 512,
TextureOptions.BILINEAR_PREMULTIPLYALPHA);
this .mLaserGunTextureRegion = TextureRegionFactory.createFromAsset (
this .mTexture, activity, "gfx / laser_gun.png". 800, 0);
this .mBackgroundTextureRegion = TextureRegionFactory.createFromAsset (
this .mTexture, activity, "gfx / laser_logic_background.png". 0, 0);
engine.getTextureManager (). loadTexture (this .mTexture);
>

public TextureRegion getBackground () return mBackgroundTextureRegion;
>

public TextureRegion getLaserGun () return mLaserGunTextureRegion;
>

* This source code was highlighted with Source Code Highlighter.

Що взагалі відбувається в цьому коді? Для початку ми створюємо mTexture, це буде наш атлас. Дуже важливо щоб його розміри були кратні ступеням двійки, так як OpenGL не розуміє інші розміри текстур. Далі ми додаємо на наш атлас зображення. І уважно стежимо за тим щоб вони не перетиналися. Для нашого лазера дуже важливий прозорий фон, так що для нього в будь-якому випадку ми використовуємо PNG. А для background'a байдуже в якому форматі його зберігати. Ну і після всіх маніпуляцій викликаємо метод loadTexture () після чого ми можемо використовувати наш атлас.

Крок 4: Текстура ми завантажили, тепер подивимося що у нас вийшло.

public class StageActivity extends BaseGameActivity

private static final int CAMERA_WIDTH = 800;
private static final int CAMERA_HEIGHT = 480;
private static final int NUMBER_OF_LAYERS = 2;

private Camera mCamera;
private Textures mTextures;

@Override
public void onLoadComplete () <>

@Override
public Engine onLoadEngine () this .mCamera = new Camera (0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
final EngineOptions options = new EngineOptions (true,
ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy (
getScreenResolutionRatio ()), this .mCamera);
return new Engine (options);
>

@Override
public void onLoadResources () mTextures = new Textures (this. getEngine ());
>

@Override
public Scene onLoadScene () Ln.i ( "OnLoadScene");
this .mEngine.registerUpdateHandler (new FPSLogger ());

final Scene scene = new Scene (NUMBER_OF_LAYERS);
scene.setBackground (new SpriteBackground (new Sprite (0, 0, mTextures
.getBackground ())));
scene.getFirstChild (). attachChild (new Sprite (0, 0, mTextures.getLaserGun ()));
return scene;
>

private float getScreenResolutionRatio () DisplayMetrics dm = new DisplayMetrics ();
getWindowManager (). getDefaultDisplay (). getMetrics (dm);
return ((float) dm.widthPixels) / ((float) dm.heightPixels);
>

* This source code was highlighted with Source Code Highlighter.
Це наше головне Activity, сподіваюся не потрібно пояснювати що це, яке ми без зволікання повинні успадкувати від BaseGameActivity, інакше у нас нічого не вийде. Після цього IDE нам запропонує перевизначити 4 методу. Викликаються які в порядку onLoadEngine-> onLoadResources-> onLoadScene-> onLoadComplete. Почнемо з початку ланцюжка тут ми инициализируем камеру і сам движок. Особливу увагу хочу звернути на метод getScreenResolutionRatio (). Завдяки йому вийшла у нас картинка буде розтягуватися на весь екран. При цьому пропорції не будуть дотримуватися. Або можемо залишити пропорції камери і тоді наша гра не буде займати весь екран на деяких пристроях. Є звичайно й третій варіант - писати ініціалізацію для всіх розмірів екранів, але ми цього, звичайно, не будемо робити зараз.

Далі, завантажуємо наші текстури, які потім використовуємо в onLoadScene. FPSLogger - буде виводити фреймрейт в логи. А дивна конструкція scene.getFirstChild () поверне нам посилання на верхній шар нашої сцени. Ми звичайно можемо обійтися і без верхнього шару додаючи об'єкти прямо в сцену, але знати на який шар добавляеш об'єкт все-таки зручніше.
Тепер ми можемо побачити що у нас вийшло.

Пишемо гру для android c допомогою andengine

Для першої частини досить. Код проекту ви можете знайти на SourceForge.
Дякуємо за увагу.

Схожі статті