v 0. Pasted by Sapfil as java at 2012-04-21 10:39:10 MSK and set expiration to never.

Paste will expire never.

  1. package ru.sapfil.andengine.test1;
  2.  
  3.  
  4.  
  5. import org.anddev.andengine.engine.Engine;
  6. import org.anddev.andengine.engine.camera.ZoomCamera;
  7. import org.anddev.andengine.engine.handler.IUpdateHandler;
  8. import org.anddev.andengine.engine.options.EngineOptions;
  9. import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation;
  10. import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
  11. import org.anddev.andengine.entity.scene.Scene;
  12. import org.anddev.andengine.entity.sprite.Sprite;
  13. import org.anddev.andengine.entity.util.FPSLogger;
  14. import org.anddev.andengine.input.touch.TouchEvent;
  15. import org.anddev.andengine.opengl.texture.Texture;
  16. import org.anddev.andengine.opengl.texture.TextureOptions;
  17. import org.anddev.andengine.opengl.texture.region.TextureRegion;
  18. import org.anddev.andengine.opengl.texture.region.TextureRegionFactory;
  19. import org.anddev.andengine.ui.activity.BaseGameActivity;
  20. import android.content.Context;
  21. import android.hardware.Sensor;
  22. import android.hardware.SensorEvent;
  23. import android.hardware.SensorEventListener;
  24. import android.hardware.SensorManager;
  25.  
  26. /** пример работы с движком andengine
  27. * на экране создается 1 спрайт методами движка
  28. * спрайт предвигается акселерометром
  29. * так же спрайт можно двигать перетаскиванием
  30. * @author Sapfil
  31. * @link русскоязычный тутор по выводу анимированного спрайта на экран
  32. * http://korzh.net/2011-04-andengine.-pervyj-opyt.html
  33. * @link основной список туторов на форуме andengine 
  34. * http://www.andengine.org/forums/tutorials/mimminito-s-tutorial-list-t417.html
  35. * @link тутор по использованию акселерометра 
  36. * http://www.andengine.org/forums/post30254.html?hilit=accelerometer#p30254
  37. * @link мой ЖЖ-блог
  38. * http://sapfil-proger.livejournal.com/6779.html
  39. */
  40. public class AE_Test1_Activity extends BaseGameActivity implements SensorEventListener {
  41.    
  42.     // размеры окна отображения
  43.     static final int CAMERA_WIDTH = 320;
  44.     static final int CAMERA_HEIGHT = 480;   
  45.     // класс Camera определяет текущую область видимости на экране
  46.     private ZoomCamera mCamera;
  47.     //Хранение текстуры в памяти.
  48.     private Texture mTexture;
  49.     //Координаты нужной части текстуры для спрайта
  50.     private TextureRegion mSpriteTextureRegion;
  51.     //спрайт 
  52.     Sprite mSprite;
  53.     //Управление сенсорами
  54.     private SensorManager sensorManager;
  55.     // текущие состояния акселерометра;
  56.     private int accellerometerSpeedX;
  57.     private int accellerometerSpeedY;
  58.     // текущие координаты спрайта;
  59.     private int sX, sY;
  60.  
  61. /** Первая функция загрузки движка - создание объекта Engine
  62. * При создании задаются опции движка - EngineOptions
  63. */
  64. //@Override
  65. public Engine onLoadEngine() { 
  66.     //Создадим новый объект камеры, с размерами нашего экрана.
  67.     this.mCamera = new ZoomCamera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
  68.     //Класс RatioResolutionPolicy отвечает за пропорции ширины и высоты экрана.
  69.     //Чтобы пропорции соответствовали нашему экрану, в качестве параметров введем размеры экрана.
  70.     RatioResolutionPolicy Resolution = new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT);
  71.     //Класс EngineOptions является хранилищем настроек для основного класса движка Engine.
  72.     //Первый параметр равен конструктора pFullscreen = true,
  73.     //выставляем таким образом полноэкранный режим.
  74.     //Второй параметр - ориентация экрана, будем использовать ландшафный режим.
  75.     //Третий параметр - пропорции экрана, мы его инициализировали выше.
  76.     //Последний четвертый параметр - наша камера.
  77.     EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.PORTRAIT, Resolution, this.mCamera);
  78.     //в результате, нам необходимо вернуть объект класса Engine,
  79.     //параметром конструктора класса являются настройки.
  80.     return new Engine(engineOptions);
  81. }
  82.  
  83. /** вторая функция - загрузка ресурсов
  84. * Здесь мы загружаем текстуры(картинки), звуки и прочие внешине файлы
  85. */
  86. //@Override
  87. public void onLoadResources() {
  88.     //Создаем текстуру размерами 64*64
  89.     //Обратите внимание, каждый размер текстуры должен равняться значению 2 в n-ой степени!
  90.     this.mTexture = new Texture(64, 64, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
  91.     //Установим путь по умолчанию для файлов
  92.     TextureRegionFactory.setAssetBasePath("gfx/");
  93.     //Загружаем графические данные из файла.
  94.     //Первый параметр - наша текстура.
  95.     //Второй - текущий контекст, ресурсы из нашего приложения.
  96.     //Третий параметр - имя файла.
  97.     //Четвертый и пятый - начальные координаты хранения графики в текстуре.
  98.     // (Для анимации): Шестой и седьмой - количество кадров по горизонтали и вертикали соответственно
  99.     this.mSpriteTextureRegion = TextureRegionFactory.createFromAsset(this.mTexture, this, "ship.png", 0, 0);
  100.     //Загружаем текстурy
  101.     this.mEngine.getTextureManager().loadTexture(this.mTexture);
  102. }
  103.  
  104. /** третья функция - создание сцены */
  105. //@Override
  106. public Scene onLoadScene() {
  107.     //Создаем объект класса Scene. Это и есть наш хранитель всей отображаемой графической информации,
  108.     //такой как спрайты, шрифты, линии, прямоугольники и т.п.
  109.     final Scene mScene = new Scene(1);
  110.     // 1 в скобочках - количество слове в сцене
  111.     return mScene;
  112. }
  113.  
  114. //@Override
  115. public void onLoadComplete() {
  116.     // объявление и последующая регистрация акселерометра
  117.         sensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE)
  118.         sensorManager.registerListener(this, sensorManager
  119.                 .getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
  120.                 SensorManager.SENSOR_DELAY_GAME);   
  121.     //Добавляем спрайт на сцену
  122.     sX = (CAMERA_WIDTH - this.mSpriteTextureRegion.getWidth()) / 2;
  123.     sY = (CAMERA_HEIGHT - this.mSpriteTextureRegion.getHeight()) / 2;
  124.     createSprite(sX, sY);
  125.    
  126.     // дебаг-регистратор ФПС (я пока с ним не разобрался)
  127.     this.mEngine.registerUpdateHandler(new FPSLogger()
  128.     {
  129.         public void onUpdate(float pSecondsElapsed) {
  130.             // TODO Auto-generated method stub
  131.         }
  132.     });
  133.     /** ***********************************************************
  134.      * ОСНОВНОЙ ЦИКЛ ИГРЫ!!!
  135.      ************************************************************ */
  136.     // основной цикл игры!
  137.     this.mEngine.registerUpdateHandler(new IUpdateHandler() {
  138.             public void onUpdate(float pSecondsElapsed) {           
  139.                     updateSpritePosition();
  140.             }
  141.             public void reset() {
  142.                     // TODO Auto-generated method stub
  143.             }
  144.     });
  145. }
  146.  
  147. /**
  148. * Создание спрайта в заданной точке X,Y
  149. */
  150. private void createSprite(float x, float y) {
  151.        
  152.         // создаем спрайт по координатам и текстурной области
  153.         this.mSprite = new Sprite(x, y, this.mSpriteTextureRegion)
  154.         {
  155.             // функция перемещения спрайта вручную (перетягивание пальцем)
  156.             @Override
  157.             public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
  158.                             float pTouchAreaLocalX, float pTouchAreaLocalY)
  159.             {
  160.                 sX = (int) (pSceneTouchEvent.getX() - this.getWidth()/2);
  161.                 sY = (int) (pSceneTouchEvent.getY() - this.getHeight()/2);
  162.                 mSprite.setPosition(sX, sY);
  163.                 return true;
  164.             }
  165.            
  166.         };       
  167.        
  168.         // регистрируем область, реагирущую на касания (для перетягивания спрайта вручную)
  169.         this.mEngine.getScene().registerTouchArea(this.mSprite);       
  170.         // добавляем спрайт в сцену
  171.         // getScene - получить сцену нашего движка
  172.         // getLastChild - получить последний слой сцены
  173.         // attachChild - добавить в полученный слой то что в скобках (this.mSprite) - наш спрайт
  174.         this.mEngine.getScene().getLastChild().attachChild(this.mSprite);
  175. }
  176.  
  177. // обработка данных с акселерометра
  178. public void onSensorChanged(SensorEvent event) {
  179.     synchronized (this) {
  180.             switch (event.sensor.getType()) {
  181.             case Sensor.TYPE_ACCELEROMETER:
  182.                     accellerometerSpeedX = (int) event.values[1];
  183.                     accellerometerSpeedY = (int) event.values[0];
  184.                     break;
  185.             }
  186.     }
  187. }
  188.  
  189. // тоже какие-то данные с акселерометра - пока не разобрался
  190. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  191.     //
  192. }
  193.  
  194. // функция движения спрайта в зависимости от данных с акселерометра
  195. private void updateSpritePosition() {
  196.     if ((accellerometerSpeedX != 0) || (accellerometerSpeedY != 0)) {
  197.             // Set the Boundary limits
  198.             int tL = 0;
  199.             int lL = 0;
  200.             int rL = CAMERA_WIDTH - (int) mSprite.getWidth();
  201.             int bL = CAMERA_HEIGHT - (int) mSprite.getHeight();
  202.  
  203.             // вычисление новых координат и проверка касания с краем экрана
  204.             if (sX >= lL)
  205.                     sX -= accellerometerSpeedY;
  206.             else
  207.                     sX = lL;
  208.             if (sX <= rL)
  209.                     sX -= accellerometerSpeedY;
  210.             else
  211.                     sX = rL;
  212.             if (sY >= tL)
  213.                     sY += accellerometerSpeedX;
  214.             else
  215.                     sY = tL;
  216.             if (sY <= bL)
  217.                     sY += accellerometerSpeedX;
  218.             else
  219.                     sY = bL;
  220. /**
  221.             // вторичная проверка - возврат спрайта в пределы экрана, если он вышел за пределы
  222.             if (sX < lL)
  223.                     sX = lL;
  224.             else if (sX > rL)
  225.                     sX = rL;
  226.             if (sY < tL)
  227.                     sY = tL;
  228.             else if (sY > bL)
  229.                     sY = bL;
  230. */
  231.             mSprite.setPosition(sX, sY);
  232.  
  233.     };
  234. }
  235. }


Editing is locked.