Ноя
9

Пишем игру для Android. Знакомство с AndEngine

logo_100Я делаю уже 3-ю игру на Android, используя движок AndEngine.

Движок мне нравится и пока полностью устраивает как по функционалу, так и по скорости работы. Поэтому решил показать, как с ним работать и делать игры для Андроида.

Надеюсь у вас установлен Eclipse, скачан Android SDK и плагин ADT для Eclipse (как всё это установить?).

Ссылки на AndEngine:

Другие полезные ссылки:

Сам я не считаю себя великим программером и не особо разбираюсь во всех тонкостях многих технологий, поэтому пишу так, как понимаю сам.

Начну с общих моментов:

1. Графика.

openglAndEngine использует для вывода графики библиотеку OpenGL. OpenGL использует для своей работы так называемые Текстуры или Атласы изображений.

Вся графика в играх – растровая. Создавать спрайты можно в чём угодно – от Max 3D и Flash до Фотошопа и Paint.

AndEngine позволяет загружать графику в формате PNG и JPG (ещё есть SVG – векторный формат, но это другая история)

2. Звуки и музыка.

iTunes oggЛучше всего все звуки и музыку для игры конвертировать в формат OGG.

 

 

 

В данный момент AndEngine развивается в версии GLES2 (использует OpenGL ES 2.0). Другая версия (default) неактивна и использует OpenGL ES 1.0.

Я пока работаю с OpenGL ES 1.0 из-за возможности запуска игр на большем количестве реальных девайсов (с версией Android 2.2+) (с версией Android 1.6+).

В игре, которую я сейчас делаю, я использую исходники движка, дабы видеть его внутренности и понимать принципы работы каких-нибудь классов. Бывают случаи, когда приходится немного изменять движок под себя.

Ладно, приступим.

 

В Eclipse жмем CTRL+N для создания нового проекта. Выбираем Android Project.

New_2011-11-09_21-30-57

Обзываем проект как-нибудь.

New Android Project_2011-11-09_21-35-24

Выбираем Android 2.2 или выше. Позже, в манифесте, можно прописать совместимость с Android 1.6.

New Android Project_2011-11-09_21-39-29

Далее прописываем имя пакета (package name). Правила написания – адрес сайта в обратном порядке + имя приложения (хотя и не обязательно так писать). В моём случае я пишу com.drderico.<имя приложения>.

New Android Project_2011-11-09_21-41-33

Теперь в папку src проекта кидаем исходники AndEngine. И открываем наш единственный файл Activity:

Java - AndEngineExampleAndroidManifest

Видим такой код:

package com.drderico.example;

import android.app.Activity;
import android.os.Bundle;
public class AndEngineExampleActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Заменяем весь код на такой:

package com.drderico.example;

import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.ui.activity.BaseGameActivity;

import android.os.Bundle;

public class AndEngineExampleActivity extends BaseGameActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

	@Override
	public Engine onLoadEngine() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onLoadResources() {
		// TODO Auto-generated method stub

	}

	@Override
	public Scene onLoadScene() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onLoadComplete() {
		// TODO Auto-generated method stub
	}
}

Мы сделали наше Activity потомком класса BaseGameActivity (этот класс принадлежит AndEngine) и унаследовали 4 обязательных метода:

  • Engine onLoadEngine () – метод вызывается при загрузке самого движка AndEngine. Он требует от нас создания движка с некоторыми параметрами;
  • void onLoadResources () – вызывается для загрузки необходимых ресурсов – графики, музыки и т.д. В нём мы должны будем загрузить ресурсы игры в память;
  • Scene onLoadScene () – когда все ресурсы загружены и создан движок, от нас требуется создать главную сцену (Scene), на которой будет рисоваться графика и выводиться на экран девайса;
  • void onLoadComplete () – этот метод вызывается, когда всё успешно загружено и создано. Движок готов к работе.

Что писать дальше, я расскажу во второй части. А теперь ещё нужно отредактировать файл AndroidManifest.xml. На данный момент имеем:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.drderico.example"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".AndEngineExampleActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Я использую такой вариант этого манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.drderico.example"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:debuggable="true" android:icon="@drawable/icon" android:label="ЗДЕСЬ ПИШЕМ ИМЯ ПРИЛОЖЕНИЯ/ИГРЫ" >
  		<activity android:name=".AndEngineExampleActivity"
                  android:label="ЗДЕСЬ ПИШЕМ ИМЯ ПРИЛОЖЕНИЯ/ИГРЫ"
                  android:theme="@style/Theme.NoBackground"
                  android:configChanges="keyboardHidden|orientation"
                  android:screenOrientation="landscape" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-sdk android:minSdkVersion="4" />
	<uses-permission android:name="android.permission.VIBRATE"/>
	<uses-permission android:name="android.permission.WAKE_LOCK"/>
	<uses-permission android:name="android.permission.READ_PHONE_STATE" />
	<uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

Обратите внимание на свойство android:icon="@drawable/icon" (строка 7) — в первом варианте было android:icon="@drawable/ic_launcher". Можете написать любое имя файла с иконкой приложения. Только не забудьте сам файл назвать также. Иконки лежат в папках res/drawable-hdpi, res/drawable-ldpi и res/drawable-mdpi.

В строке 9 написано свойство android:theme="@style/Theme.NoBackground". Насколько я помню, это немного ускоряет приложение, т.к. отключает отрисовку системой заднего фона, который даже не виден. На форуме пишут, что после такого ускорения ФПС выросло с 45 до 60!!! Сам файл с темой называется theme.xml и лежит в папке res/values. Создайте его там и вставьте следующие строки:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <style name="Theme.NoBackground" parent="android:Theme">
        <item name="android:windowBackground">@null</item>
</style>
</resources>

В строке 11 указана ориентация приложения — в данном случае android:screenOrientation="landscape" — горизонтальная. Ещё может быть вертикальная (portrait).

Свойство android:configChanges="keyboardHidden|orientation" в строке 10 запрещает запускать Activity заново при смене орентации экрана. Если его не написать, то Activity будет создаваться каждый раз, как только вы выключите/включите телефон или ваше приложение перекроет другое приложение.

UPDATE: Если хотите прописать совместимость с Андроид 1.6+, то впишите в android:minSdkVersion="4" вместо android:minSdkVersion="8". Хотя для компиляции игры движок требует Андроид 2.2+, но игра также успешно запустится и на 1.6+.

На этом пока всё.




17 коммент. к записи “Пишем игру для Android. Знакомство с AndEngine”

  • Добавил в закладку, ГОСы сдам, из социальщика в смартфонщика переквалифицироваться буду.

  • Урок прекрасно подходит и для других сред разработки, и мало чем отличается. Я например делал в InteliJ IDEA. Правда не компилируется, нужно следующий урок выполнить. И не забываем о том, что андроид сдк надо ставить в корень а не в program files >_<.

  • Боже! Какие же это тормоза — Eclipse+AndroidEmulator! Простейшее приложение компилится полгода! А эта настройка либов, FlashDevelop — кинул swc, нажал — export и все, работай, компиль! Но тут просто такая бяка, в общем грустно.

    • та не говори, надо писать на Ruby, там даже компилировать ненадо 🙂

  • Не получается запустить проект, все сделал как здесь, при запуске logcat разрывается от красноты с не очень понятными ошибками

    FATAL EXEPTION: main

    не знаете что это может быть???

  • Аналогичная ситуация

  • И у меня не запускается, с той же ошибкой!

    ???

  • Отличная статья, спасибо! Но вот беда: при запуске на avd выдает ошибку:

    The application (process ) has stopped unexpectedly. Please try again.

    С чем это может быть связано?

    • Попробуй встроить ACRA Reports, чтобы узнать подробности ошибки

  • При запуске crash выяснилось что с эмулятором оно не работает, причем еще не каждый телефон тянет. Так что движок дрянь и юзать не рекомендую.

    Пруф github.com/nicolasgramlic...ngine/issues/126

    Пруф2: www.andengine.org/forums/...found-t6129.html

    • Ну это давно известно 🙂

      • Вам может быть и известно, но в статье ни слова, а я убил кучу времени на движок, который слишком глючен.

  • Ты бы написал статью о том, как это всё дело подключать, ибо на русском гугл ничего не выдаёт, а английский знают не многие. Благо я нашёл видео, где вполне доступно показано что да как, но представь новичка...

  • Спасибо. Попробую. Давно искал замену для платформеров вместо Юнити.

  • мне-очень-понравилось

  • *android:label="@string/app_name"

    на

    *android:label="ЗДЕСЬ ПИШЕМ ИМЯ ПРИЛОЖЕНИЯ/ИГРЫ" ??

    Не учи плохому 🙂 Это считается хардкодингом, название игры изменяют в string.xml в соответствующей вкладке

    • Дети, не учитесь плохому 🙂

Прокомментировать



ЗАДАЙ СВОЙ ВОПРОС