(7)、andengine之实体修改器Modifier

import org.andengine.engine.camera.Camera;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.andengine.entity.IEntity;
import org.andengine.entity.modifier.IEntityModifier.IEntityModifierListener;
import org.andengine.entity.modifier.LoopEntityModifier;
import org.andengine.entity.modifier.LoopEntityModifier.ILoopEntityModifierListener;
import org.andengine.entity.modifier.ParallelEntityModifier;
import org.andengine.entity.modifier.RotationModifier;
import org.andengine.entity.modifier.ScaleModifier;
import org.andengine.entity.primitive.Rectangle;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.sprite.AnimatedSprite;
import org.andengine.entity.util.FPSLogger;
import org.andengine.opengl.texture.TextureOptions;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.andengine.opengl.texture.region.TiledTextureRegion;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import org.andengine.util.color.Color;
import org.andengine.util.modifier.IModifier;
import org.andengine.util.modifier.LoopModifier;

import android.opengl.GLES20;
import android.util.DisplayMetrics;
import android.widget.Toast;
/**
 * 实体修改器
 */
public class EntityModfierActivity extends SimpleBaseGameActivity
{
 private static int winWidth = 854;
 private static int winHeight = 480;
 
 //纹理区域
 private BitmapTextureAtlas mBitmapTextureAtlas;
 //动画图片纹理范围
 private TiledTextureRegion mTiledTextureRegion;

 @Override
 public EngineOptions onCreateEngineOptions()
 {
  setScreenDisplay();
  Camera camera = new Camera(0, 0, winWidth, winHeight);
  EngineOptions engineOptions = new EngineOptions(
    true,
    ScreenOrientation.LANDSCAPE_FIXED,
    new RatioResolutionPolicy(winWidth, winHeight),
    camera);
  return engineOptions;
 }

 @Override
 protected void onCreateResources()
 {
  //设置图片路径
  BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("images/");
  //加载的图片必须为2的整数次幂
  mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 64, 32, TextureOptions.BILINEAR);
  mTiledTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mBitmapTextureAtlas, this, "face_box_tiled.png", 0, 0, 2, 1);
  mBitmapTextureAtlas.load();
 }

 @Override
 protected Scene onCreateScene()
 {
  this.mEngine.registerUpdateHandler(new FPSLogger());
  Scene scene = new Scene();
  scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));

  final float centerX = (winWidth - mTiledTextureRegion.getWidth()) / 2;
  final float centerY = (winHeight - mTiledTextureRegion.getHeight()) / 2;
  
  //创建一个矩形
  Rectangle rectangle = new Rectangle(centerX+100, centerY, 32, 32, this.getVertexBufferObjectManager());
  rectangle.setColor(Color.RED);
  
  //创建一个动画精灵
  AnimatedSprite animatedSprite = new AnimatedSprite(centerX-100, centerY, mTiledTextureRegion, this.getVertexBufferObjectManager());
  //动画每帧切换时间
  animatedSprite.animate(300);
  /*
   * http://www.cnblogs.com/yujunyong/archive/2011/04/13/2015467.html
   * 参数1:源因子,参数2:目标因子
   * 为了渲染物体从远到近排列的效果,最好应用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)处理透明度。
   * 下面实际上是调用了GL20的glBlendFunc
   */
  animatedSprite.setBlendFunction(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
  /*
   * http://blog.sina.com.cn/s/blog_670f9b990100v677.html
   * 下面的Modifier们很有意思。调用顺序是这样滴:LoopEntityModifier循环调用EntityModifier,
   * 这里的EntityModifier又是个SequenceEntityModifier,它又一系列Modifier组成。
   * 于是LoopEntityModifier把SequenceEntityModifier循环执行。
   * 每次执行SequenceEntityModifier就显示Sequence start和Sequence  end。
   * 每个循环开始和结束又会显示Loop数。
   * 使用的Modifier有RotationModifier,AlphaModifier,ScaleModifier,DelayModifier,ParallelEntityModifier。
   * ParallelEntityModifier是并行的意思,顾名思义可以同时进行多种变化,如一边缩放一边旋转。
   * 记得要registerEntityModifier。注意上面的setBlendFunction是Shape的方法,不是Entity的。
   * Shape负责绘制实体。作者的类功能划分很清晰。
   */
  //创建实体修改器,在业务线程中更新实体状态 (设置图片的形状变化)
  //创建完精灵后,就给精灵添加修改器了,这个地方是比较灵活的,完全根据自己的需要来制作. 
  LoopEntityModifier loopEntityModifier = new LoopEntityModifier
    (
     new EntityModifierListener(),   //EntityModifier的监听,通知LoopEntityModifier的开始和结束
     4,          //循环次数(-1,无限循环)
     new LoopEntityModifierListener(),   //循环的监听,通知每次循环的开始和结束
     /*new SequenceEntityModifier  //循环Modifier中组合的Modifier,按顺序执行(执行完一个Modifier再到下一个)  
     (
      new RotationModifier(5f, 0f, 90f),  //旋转(给定的时间和范围内) 5秒内从0度旋转到90度
      new ScaleModifier(3f, 1f, 3f)  //缩放(给定的时间和范围内) 3秒内从1倍旋缩放到原来的3倍
      //里面也可以放一个并行执行
     )*/
     new ParallelEntityModifier    //循环Modifier中组合的Modifier,并行执行(所有都同时执行)
     (
      new RotationModifier(5f, 0f, 90f),  //旋转(给定的时间和范围内) 5秒内从0度旋转到90度
      new ScaleModifier(3f, 1f, 3f)  //缩放(给定的时间和范围内) 3秒内从1倍旋缩放到原来的3倍
     )
    );

  //注册实体修改器 
  animatedSprite.registerEntityModifier(loopEntityModifier);
  //deepCopy() 深度复制
  rectangle.registerEntityModifier(loopEntityModifier.deepCopy());
  
  scene.attachChild(animatedSprite);
  scene.attachChild(rectangle);
  
  
  return scene;
 }

 /**
  * 设置屏幕大小
  */
 private void setScreenDisplay()
 {
  DisplayMetrics outMetrics = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
  winWidth = outMetrics.widthPixels;
  winHeight = outMetrics.heightPixels;
 }
 /**
  * 循环的监听,通知每次循环的开始和结束  
  */
 private class LoopEntityModifierListener implements ILoopEntityModifierListener
 {

  //(2)每次循环都执行
  @Override
  public void onLoopStarted(LoopModifier<IEntity> pLoopModifier, int pLoop, int pLoopCount)
  {
   EntityModfierActivity.this.runOnUiThread(new Runnable()
   {
    @Override
    public void run()
    {
     Toast.makeText(EntityModfierActivity.this, "LoopEntityModifierListener::onLoopStarted()", 1000).show();
     System.out.println("LoopEntityModifierListener::onLoopStarted()");
    }
   });
  }
  //(3)每次循环都执行
  @Override
  public void onLoopFinished(LoopModifier<IEntity> pLoopModifier, int pLoop,
    int pLoopCount)
  {
   EntityModfierActivity.this.runOnUiThread(new Runnable()
   {
    @Override
    public void run()
    {
     Toast.makeText(EntityModfierActivity.this, "LoopEntityModifierListener::onLoopFinished()", 1000).show();
     System.out.println("LoopEntityModifierListener::onLoopFinished()");
    }
   });
  }

 }

 /**
  *实体修改器的监听,通知LoopEntityModifier的开始和结束
  */
 private class EntityModifierListener implements IEntityModifierListener
 {
  //(1)只执行一次(通知LoopEntityModifier的开始)
  @Override
  public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem)
  {
   EntityModfierActivity.this.runOnUiThread(new Runnable()
   {
    @Override
    public void run()
    {
     Toast.makeText(EntityModfierActivity.this, "EntityModifierListener::onModifierStarted()", 1000).show();
     System.out.println("EntityModifierListener::onModifierStarted()");
    }
   });
  }

  //(4)只执行一次(LoopEntityModifier的结束)
  @Override
  public void onModifierFinished(IModifier<IEntity> pEntityModifier, IEntity pEntity)
  {
   EntityModfierActivity.this.runOnUiThread(new Runnable()
   {
    @Override
    public void run()
    {
     Toast.makeText(EntityModfierActivity.this, "EntityModifierListener::onModifierFinished()", 1000).show();
     System.out.println("EntityModifierListener::onModifierFinished()");
    }
   });
  }
  
 }

}

 


 

你可能感兴趣的:(AndEngine)