Вашему вниманию предлагается следующий код.
На черном фоне создается спрайт (картинка-самолетик). Этот спрайт можно двигать пальцем по экрану. Так же он связан с акселерометром. Если наклонить аппарат влево, то самолетик на экране движется влево. Чем сильнее наклоняешь - тем быстрее движется.
На черном фоне создается спрайт (картинка-самолетик). Этот спрайт можно двигать пальцем по экрану. Так же он связан с акселерометром. Если наклонить аппарат влево, то самолетик на экране движется влево. Чем сильнее наклоняешь - тем быстрее движется.
package ru.sapfil.andengine.test1;
import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.engine.camera.ZoomCamera;
import org.anddev.andengine.engine.handler.IUpdateHandler;
import org.anddev.andengine.engine.options.EngineOptions;
import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation;
import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.sprite.Sprite;
import org.anddev.andengine.entity.util.FPSLogger;
import org.anddev.andengine.input.touch.TouchEvent;
import org.anddev.andengine.opengl.texture.Texture;
import org.anddev.andengine.opengl.texture.TextureOptions;
import org.anddev.andengine.opengl.texture.region.TextureRegion;
import org.anddev.andengine.opengl.texture.region.TextureRegionFactory;
import org.anddev.andengine.ui.activity.BaseGameActivity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
/** пример работы с движком andengine
* на экране создается 1 спрайт методами движка
* спрайт предвигается акселерометром
* так же спрайт можно двигать перетаскиванием
* @author Sapfil
* @link русскоязычный тутор по выводу анимированного спрайта на экран
* http://korzh.net/2011-04-andengine.-pervyj-opyt.html
* @link основной список туторов на форуме andengine
* http://www.andengine.org/forums/tutorials/mimminito-s-tutorial-list-t417.html
* @link тутор по использованию акселерометра
* http://www.andengine.org/forums/post30254.html?hilit=accelerometer#p30254
* @link мой ЖЖ-блог
* http://sapfil-proger.livejournal.com/6779.html
*/
public class AE_Test1_Activity extends BaseGameActivity implements SensorEventListener {
// размеры окна отображения
static final int CAMERA_WIDTH = 320;
static final int CAMERA_HEIGHT = 480;
// класс Camera определяет текущую область видимости на экране
private ZoomCamera mCamera;
//Хранение текстуры в памяти.
private Texture mTexture;
//Координаты нужной части текстуры для спрайта
private TextureRegion mSpriteTextureRegion;
//спрайт
Sprite mSprite;
//Управление сенсорами
private SensorManager sensorManager;
// текущие состояния акселерометра;
private int accellerometerSpeedX;
private int accellerometerSpeedY;
// текущие координаты спрайта;
private int sX, sY;
/** Первая функция загрузки движка - создание объекта Engine
* При создании задаются опции движка - EngineOptions
*/
//@Override
public Engine onLoadEngine() {
//Создадим новый объект камеры, с размерами нашего экрана.
this.mCamera = new ZoomCamera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
//Класс RatioResolutionPolicy отвечает за пропорции ширины и высоты экрана.
//Чтобы пропорции соответствовали нашему экрану, в качестве параметров введем размеры экрана.
RatioResolutionPolicy Resolution = new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT);
//Класс EngineOptions является хранилищем настроек для основного класса движка Engine.
//Первый параметр равен конструктора pFullscreen = true,
//выставляем таким образом полноэкранный режим.
//Второй параметр - ориентация экрана, будем использовать ландшафный режим.
//Третий параметр - пропорции экрана, мы его инициализировали выше.
//Последний четвертый параметр - наша камера.
EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.PORTRAIT, Resolution, this.mCamera);
//в результате, нам необходимо вернуть объект класса Engine,
//параметром конструктора класса являются настройки.
return new Engine(engineOptions);
}
/** вторая функция - загрузка ресурсов
* Здесь мы загружаем текстуры(картинки), звуки и прочие внешине файлы
*/
//@Override
public void onLoadResources() {
//Создаем текстуру размерами 64*64
//Обратите внимание, каждый размер текстуры должен равняться значению 2 в n-ой степени!
this.mTexture = new Texture(64, 64, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
//Установим путь по умолчанию для файлов
TextureRegionFactory.setAssetBasePath("gfx/");
//Загружаем графические данные из файла.
//Первый параметр - наша текстура.
//Второй - текущий контекст, ресурсы из нашего приложения.
//Третий параметр - имя файла.
//Четвертый и пятый - начальные координаты хранения графики в текстуре.
// (Для анимации): Шестой и седьмой - количество кадров по горизонтали и вертикали соответственно
this.mSpriteTextureRegion = TextureRegionFactory.createFromAsset(this.mTexture, this, "ship.png", 0, 0);
//Загружаем текстурy
this.mEngine.getTextureManager().loadTexture(this.mTexture);
}
/** третья функция - создание сцены */
//@Override
public Scene onLoadScene() {
//Создаем объект класса Scene. Это и есть наш хранитель всей отображаемой графической информации,
//такой как спрайты, шрифты, линии, прямоугольники и т.п.
final Scene mScene = new Scene(1);
// 1 в скобочках - количество слове в сцене
return mScene;
}
//@Override
public void onLoadComplete() {
// объявление и последующая регистрация акселерометра
sensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
sensorManager.registerListener(this, sensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
//Добавляем спрайт на сцену
sX = (CAMERA_WIDTH - this.mSpriteTextureRegion.getWidth()) / 2;
sY = (CAMERA_HEIGHT - this.mSpriteTextureRegion.getHeight()) / 2;
createSprite(sX, sY);
// дебаг-регистратор ФПС (я пока с ним не разобрался)
this.mEngine.registerUpdateHandler(new FPSLogger()
{
public void onUpdate(float pSecondsElapsed) {
// TODO Auto-generated method stub
}
});
/** ***********************************************************
* ОСНОВНОЙ ЦИКЛ ИГРЫ!!!
************************************************************ */
// основной цикл игры!
this.mEngine.registerUpdateHandler(new IUpdateHandler() {
public void onUpdate(float pSecondsElapsed) {
updateSpritePosition();
}
public void reset() {
// TODO Auto-generated method stub
}
});
}
/**
* Создание спрайта в заданной точке X,Y
*/
private void createSprite(float x, float y) {
// создаем спрайт по координатам и текстурной области
this.mSprite = new Sprite(x, y, this.mSpriteTextureRegion)
{
// функция перемещения спрайта вручную (перетягивание пальцем)
@Override
public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
float pTouchAreaLocalX, float pTouchAreaLocalY)
{
sX = (int) (pSceneTouchEvent.getX() - this.getWidth()/2);
sY = (int) (pSceneTouchEvent.getY() - this.getHeight()/2);
mSprite.setPosition(sX, sY);
return true;
}
};
// регистрируем область, реагирущую на касания (для перетягивания спрайта вручную)
this.mEngine.getScene().registerTouchArea(this.mSprite);
// добавляем спрайт в сцену
// getScene - получить сцену нашего движка
// getLastChild - получить последний слой сцены
// attachChild - добавить в полученный слой то что в скобках (this.mSprite) - наш спрайт
this.mEngine.getScene().getLastChild().attachChild(this.mSprite);
}
// обработка данных с акселерометра
public void onSensorChanged(SensorEvent event) {
synchronized (this) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
accellerometerSpeedX = (int) event.values[1];
accellerometerSpeedY = (int) event.values[0];
break;
}
}
}
// тоже какие-то данные с акселерометра - пока не разобрался
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//
}
// функция движения спрайта в зависимости от данных с акселерометра
private void updateSpritePosition() {
if ((accellerometerSpeedX != 0) || (accellerometerSpeedY != 0)) {
// Set the Boundary limits
int tL = 0;
int lL = 0;
int rL = CAMERA_WIDTH - (int) mSprite.getWidth();
int bL = CAMERA_HEIGHT - (int) mSprite.getHeight();
// вычисление новых координат и проверка касания с краем экрана
if (sX >= lL)
sX -= accellerometerSpeedY;
else
sX = lL;
if (sX <= rL)
sX -= accellerometerSpeedY;
else
sX = rL;
if (sY >= tL)
sY += accellerometerSpeedX;
else
sY = tL;
if (sY <= bL)
sY += accellerometerSpeedX;
else
sY = bL;
mSprite.setPosition(sX, sY);
};
}
}
Ваши вопросы, предложения и комментарии - приветствуются :)
Надо бы заменить onLoadResources.
ОтветитьУдалитьВот так работает:
public void onLoadResources() {
//Создаем текстуру размерами 64*64
//Обратите внимание, каждый размер текстуры должен равняться значению 2 в n-ой степени!
//Установим путь по умолчанию для файлов
BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
//this.mTexture = new Texture(64, 64, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
this.mBitmapTextureAtlas = new BitmapTextureAtlas(64, 64, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
//Загружаем графические данные из файла.
//Первый параметр - наша текстура.
//Второй - текущий контекст, ресурсы из нашего приложения.
//Третий параметр - имя файла.
//Четвертый и пятый - начальные координаты хранения графики в текстуре.
// (Для анимации): Шестой и седьмой - количество кадров по горизонтали и вертикали соответственно
this.mSpriteTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset((BitmapTextureAtlas) this.mBitmapTextureAtlas, this, "ship.png", 0, 0);
//Загружаем текстурy
this.mEngine.getTextureManager().loadTexture(this.mBitmapTextureAtlas);
}
И импорт:
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
Спасибо что зашли.
УдалитьВ свое время этот код точно работал. Дело в том, что я окончательно перешел на GLES2. И по-этому в данный момент не могу проверить код. Возможно, у меня была более старая версия движка, а у Вас более новая. В моем коде есть TextureRegionFactory, а в Вашем варианте BitmapTextureAtlasTextureRegionFactory. В движке, основанном на GLES2 эта функция называется точно так же, как и у Вас - это еще один довод в пользу предположения, что у Вас другая, более свежая версия.
Где то я уже говорил о том, что движок постоянно меняется, но это не всегда хорошо. В нашем случае произошел конфликт версий. Но я рад, что Вы смогли справиться с этой проблемой и даже нашли время сообщить об этом. Спасибо. :)
У меня на глес2 не запустился :( можно проапгрейдить примерчик под глес2. только начал изучать данный движок.
УдалитьЗ.Ы.Ж. Я выражаю свою надежду то, что вы выложите рабочий проект-еклипс на гитхабе.
З.З.Ы.Ж. Заранее благодарен.