четверг, 1 марта 2012 г.

AndEngine. Основы.

В сегодняшней статье я расскажу о простых компонентах для написания игр для Android
используя  AndEngine. Покажу как добавить sprite и score-текст на экран.

Пожалуй начнем.

Прежде всего нам необходимо заменить Activity на  BaseGameActivity и переопределить методы.
После этого наш класс должен выглядеть вот так:

AndEnginePart2Activity.java
 package com.lunevich.andengine;
  
 import org.anddev.andengine.engine.Engine;  
 import org.anddev.andengine.entity.scene.Scene;  
 import org.anddev.andengine.ui.activity.BaseGameActivity;
  
 public class AndEnginePart2Activity extends BaseGameActivity { 
 
      // В onLoadEngine мы инициализируем движок  
      @Override  
      public Engine onLoadEngine() {  
           // TODO Auto-generated method stub  
           return null;  
      }  

      // В onLoadResources мы будем загружать ресурсы, 
      // необходимые для нашего приложения, картинки, музыка, и т.д...  
      @Override  
      public void onLoadResources() {  
           // TODO Auto-generated method stub  
      }  

      // В onLoadScene мы создаем сцену  
      @Override  
      public Scene onLoadScene() {  
           // TODO Auto-generated method stub  
           return null;  
      }  

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


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

Для начала добавим ещё один класс Monster.java. Функционала в него никакого добавлять не будем, только наследуем его от класса Sprite.

Monster.java
 package com.lunevich.andengine;
  
 import org.anddev.andengine.entity.sprite.Sprite;  
 import org.anddev.andengine.opengl.texture.region.TextureRegion;  

 public class Monster extends Sprite {  

      public Monster(float pX, float pY, TextureRegion pTextureRegion) {  
           super(pX, pY, pTextureRegion);  
           // TODO Auto-generated constructor stub  
      }  
 }  


Теперь изменим наш AndEnginePart2Activity.java класс. Выглядеть он будет вот так:

 package com.lunevich.andengine;  

 import org.anddev.andengine.engine.Engine;  
 import org.anddev.andengine.engine.camera.Camera;  
 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.scene.background.ColorBackground;  
 import org.anddev.andengine.entity.text.ChangeableText; 
 import org.anddev.andengine.entity.util.FPSLogger;  
 import org.anddev.andengine.opengl.font.Font; 
 import org.anddev.andengine.opengl.texture.TextureOptions;  
 import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;  
 import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;  
 import org.anddev.andengine.opengl.texture.region.TextureRegion;  
 import org.anddev.andengine.ui.activity.BaseGameActivity;
  
 import android.content.Context;  
 import android.graphics.Color;  
 import android.graphics.Typeface;
 import android.view.Display;  
 import android.view.WindowManager;  

 public class AndEnginePart2Activity extends BaseGameActivity { 
 
      private Display display;  

      private static int CAMERA_WIDTH = 0;       
      private static int CAMERA_HEIGHT = 0;   

      private Camera mCamera;  
      private Scene mScene;

      private BitmapTextureAtlas mFontTexture;  
      private Font mFont;   
      private BitmapTextureAtlas mBitmapTextureAtlas;       
      private TextureRegion monsterTexture;  

      private Monster monster; 
      private ChangeableText scoreText;  

      // В onLoadEngine мы инициализируем движок  
      @Override  
      public Engine onLoadEngine() {  
           // TODO Auto-generated method stub 

           WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);  
           display = wm.getDefaultDisplay(); 
 
           // Получаем ширину и высоту нашего экрана  
           CAMERA_WIDTH = display.getWidth();  
           CAMERA_HEIGHT = display.getHeight(); 
 
           // Создаем камеру 
           this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 
           
           // Создаем движок 
           return new Engine(new EngineOptions(true, ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), this.mCamera));  
      }  

      // В onLoadResources мы будем загружать ресурсы, 
      // необходимые для нашего приложения, картинки, музыка, и т.д...  
      @Override  
      public void onLoadResources() {  
           // TODO Auto-generated method stub 
 
           // Создаем новую текстуру 256х256, помните её размер должен быть кратный 2
           this.mBitmapTextureAtlas = new BitmapTextureAtlas(256, 256, TextureOptions.BILINEAR_PREMULTIPLYALPHA);

           // Создаем тектуру для текста
           this.mFontTexture = new BitmapTextureAtlas(256, 256, TextureOptions.BILINEAR);
           
           // Загружаем тектуру монстра  
           this.monsterTexture = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "monster/monster.png", 0, 0); 

           // Создаем шрифт
           this.mFont = new Font(this.mFontTexture, Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 32, true, Color.BLACK );
           this.mFont.prepareLetters("1234567890".toCharArray());
 
           // Загружаем тектуры и шрифт в память  
           this.mEngine.getTextureManager().loadTexture(this.mBitmapTextureAtlas); 
           this.mEngine.getTextureManager().loadTexture(this.mFontTexture); 
           this.mEngine.getFontManager().loadFont(this.mFont);  
      }  

      // В onLoadScene мы создаем сцену  
      @Override  
      public Scene onLoadScene() {  
           // TODO Auto-generated method stub  
           this.mEngine.registerUpdateHandler(new FPSLogger()); 
           
           // Создаем сцену
           mScene = new Scene();
  
           // Устанавливаем цвет фона сцены 
           mScene.setBackground(new ColorBackground(0.96f, 0.9215f, 0.8157f)); 
 
           // Создаем нашего монстра и устанавливаем его на определенную позицию 
           monster = new Monster(CAMERA_WIDTH / 2, CAMERA_HEIGHT - 200, this.monsterTexture);   

           // Добавляем монстра на нашу сцену  
           mScene.attachChild(monster);

           // Создаем score-текст  
           scoreText = new ChangeableText(CAMERA_WIDTH - 220, 20, this.mFont, "Score :", "Score : XXXXX".length());

           // Добавляем текст на нашу сцену  
           mScene.attachChild(scoreText);    

           // Создаем цикл нашей сцены, в этом примере мы ничего не будет там делать
           mScene.registerUpdateHandler(new IUpdateHandler() {  

             @Override  
             public void onUpdate(float arg0) { 
                  // Расположение этой строки здесь только для примера
                  scoreText.setText("Score : " + AndEnginePart2Activity.this.mEngine.getSecondsElapsedTotal());
                  // ...  
             }  

             @Override  
             public void reset() {  
                  // ...
             }  
           });  
           return mScene;  
      } 
 
      @Override  
      public void onLoadComplete() {  
           // TODO Auto-generated method stub  
      }  
 }  

Вот такая структура нашего приложения получилась:


И вот результат наших стараний ( пока что только моих :) ) :


Кому необходимо вот монстр -> Monster

Вот и все. С основами остановимся пока на этом. Удачи в написании игр для Android :)

1 комментарий: