Пишем игру для Android c помощью AndEngine. Часть 3

    Всем привет!
    Вот и долгоданное продолжение цикла статей о том как создать для андроид не очень простую игру с помощью AndEngine.

    Уже ознакомились с предыдущими статьями?
    Часть 1
    Часть 2
    Тогда продолжим.

    Сегодня мы займемся картой игровых объектов. Что она из себя представляет? Двумерный массив игровых объектов размерами 13х7. Размер немного странный но при размерах клеток 64х64 он начинет казаться вполне логичным.
    Шаг 1. Задаем необходимые констаны и поля.
    public class GameObjectsMap {
      public static final int HEIGHT = 7;
      public static final int WIDTH = 13;
      public static final float CELL_SIZE_X = 64f;
      public static final float CELL_SIZE_Y = 64f;

      public static final int LASER_LAYER = 0;
      public static final int GAME_OBJECTS_LAYER = LASER_LAYER + 1;

      private GameObject[][] mMap = new GameObject[WIDTH][HEIGHT];
      private Textures mTextures;
      GameObjectsMap(final Textures textures) {
        mTextures = textures;
      }
    }


    * This source code was highlighted with Source Code Highlighter.

    Шаг 2. Добавление объектов.
    Для большего удобства нам необходим метод для добавления объектов на поле:
    public void add(Type type, final int posH, final int posW, final int angle) {
        GameObject object = null;
        switch (type) {
        case lasergun:
          object = new LaserGun(posH, posW, angle, mTextures
              .getLaserGun());
          break;
        case mirror:
          break;
        case target:
          break;
        default:
          break;
        }
        mMap[posH][posW] = object;
      }


    * This source code was highlighted with Source Code Highlighter.

    Шаг 3. Отображение объектов.
    Enum Type внимательный читатель мог увидеть в предыдущем посте в описании класса GameObject. В метод add мы передаем тип объекта, его позицию и угол поворота, после чего он появляется в нашем массиве, но все еще не отображается. Для отображения игровых объектов нам потребуется следующий метод:
    public void addToScene(Scene scene) {
        for (int i = 0; i < mMap.length; i++) {
          for (int j = 0; j < mMap[i].length; j++) {
            GameObject o = mMap[i][j];
            if (o != null) {
              o.attachTo(scene);
            }
          }
        }
      }


    * This source code was highlighted with Source Code Highlighter.

    Довольно просто. Ну и на всякий случай:
    public void clear() {
        for (int i = 0; i < mMap.length; i++) {
          Arrays.fill(mMap[i], null);
        }
      }


    * This source code was highlighted with Source Code Highlighter.

    Теперь мы можем для добавления объектов на сцену использовать простую и понятную конструкцию типа:

    mGameObjectsMap.add(Type.lasergun, 0, 0, 3);

    Шаг 4. Обработка прикосновений.
    Все таки игру делаем и без взаимодействия с пользователем нам никак нельзя. К сожалению для класса Entity нет стандартных обработчиков, поэтому будем действовать по старинке.

    scene.setOnSceneTouchListener(mGameObjectsController);

    Где mGameObjectsController реализует интерфейс IOnSceneTouchListener. На самом деле мало чем отличается от обычного OnTouchListener. И в моем случае он выглядит примерно так:
    public boolean onSceneTouchEvent(final Scene pScene, TouchEvent pSceneTouchEvent) {
        if (pSceneTouchEvent.isActionDown()) {
          float x = pSceneTouchEvent.getX();
          float y = pSceneTouchEvent.getY();
          int cellNumX = (int) ((x - x % GameObjectsMap.CELL_SIZE_X)
              / GameObjectsMap.CELL_SIZE_X);
          int cellNumY = (int) ((y - y % GameObjectsMap.CELL_SIZE_X)
              / GameObjectsMap.CELL_SIZE_X);
          DynamicGameObject object = (DynamicGameObject)mMap.getMap()[cellNumX][cellNumY];
          if (object != null) {
            //Делаем что угодно с нашим объектом
          }
        }
        return false;
      }


    * This source code was highlighted with Source Code Highlighter.


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

    На сегодня это все. Некоторые мои проекты вы можете найти здесь. Вопросы, пожелания и конструктивная критика как всегда приветствуются.
    P.S. Исходный код все там же.
    P.P.S. Продолжение.
    • +18
    • 16,1k
    • 4
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 4

      +1
      Помучаю вас:)
      Насколько быстр движок? Вроде как libgdx побыстрее говорят.
      А не пробовали другие движки?
      Например вариант: cocos2dx(собранный С/С++ код под NDK). То бишь идея в том, чтобы написать графическую часть на плюсах(си) и потом делать вставки в Java-код. И получаем, что можно графику юзать и под айфон и под андроид, чтобы не переписывать?

      Я для себя вижу следующие варианты:
      -Andengine
      -libgdx
      -cocos2dx, cocos2d-android
      при чем склоняюсь к первому, но если игра будет писаться и под ios, то нужно кроссплатформенное решение
      Хотя есть и другие:
      stackoverflow.com/questions/4227759/android-game-engine-for-2d-and-3d-games
      например jMonkeyEngine.

      P.S. Слежу за ваши туториалами, продолжайте писать. Спасибо:)
        0
        По поводу скорости, меня самого волнует этот вопрос:) Есть идея используя код с этих туториалов написать тоже самое для Libgdx и сравнить.
        По поводу других движков, работал некоторое время с LibGdx, тогда мне он показался не очень быстрым. Cocos2d-android собираюсь попробовать, есть знакомые которые сейчас пишут на нем свою игру.
        jMonkeyEngine на сколько мне известно еще в альфе для андроида да и минимальная версия ОС пока не подходит для меня.
          0
          Cocos2d-android еще не доработан, есть проблемы с недозагрузкой текстур — иногда вылетают белые квадраты спонтанно
        0
        stepango,
        Спасибо за статьи!

        Подскажите, сколько у вас заняло времени создание игры, которую вы здесь описываете. И, если можно, как-то укажите свой уровень знаний в разработке под android и java в отдельности (хочу посчитать сколько времени это должно занять у меня :) ).

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое