`

(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下载

    AndEngine下载 AndEngine

    andengine2.0开发的小游戏

    利用andengine2.0开发的一款小游戏,有兴趣的朋友可以研究下。

    andengine 类代码组织图

    这使得开发者在遇到问题时可以直接从源码上找到答案,也能按照自己的需要对AndEngine进行修改和扩展。AndEngine的源码在github上托管[2]。 高效  AndEngine主要使用Java语言开发,但在大运算量的耗时功能时,...

    andengine 中文

    andengine 中文文档

    AndEngine 类 组织图

    这使得开发者在遇到问题时可以直接从源码上找到答案,也能按照自己的需要对AndEngine进行修改和扩展。AndEngine的源码在github上托管[2]。 高效  AndEngine主要使用Java语言开发,但在大运算量的耗时功能时,...

    AndEngine最新jar包

    AndEngine最新jar包 AndEngine最新jar包 AndEngine最新jar包

    android andengine 代码 AnimatedSprite 实例

    android andengine 代码 AnimatedSprite 实例 大家一起学习android andengine 游戏开发吧

    Andengine笔记

    AndEngine基于libGDX框架开发,使用OpenGL ES进行图形绘制,底层使用C++编写,通过JNI调用来实现,因此比较高效,功能强大。同时集成了Box2D物理引擎,因此能实现一些较为复杂的物理效果。在Rokon(另一个Android 2D游戏...

    andengine源码及demo

    andengine源码,源码扩展及demo,供14个project

    andEngine粒子系统使用之px文件

    andEngine粒子系统使用之采用px文件的方式构建自己的粒子系统,源代码案例

    AndEngine游戏开发示例

    AndEngine游戏开发示例 详情请链接至:http://blog.csdn.net/lan410812571/article/details/9716743

    Andengine全套git库

    Andengine全套的git库,包括 AndEngineAugmentedRealityExtension AndEngineLiveWallpaperExtension AndEngineMODPlayerExtension AndEngineMultiplayerExtension AndEngineMultiTouchExtension (Merged into the '...

    AndEngine自定义Button

    AndEngine实现自定义Button

    AndEngine入门篇

    AndEngine游戏引擎学习入门篇,如果你想学习Android游戏开发,请从这里开始!详细的注释

    andEngine之SVG文件的使用

    SVG文件在andEngine中的使用,源码详细,一看便明白使用方法。

    andengine案例,jar包

    andengine.jar 2013最新,andengine+8个拓展jar包,两个案例apk. 包括andengineExample基于GLES2

    AndEngine游戏-DeliveryBoy-源代码

    AndEngine游戏 DeliveryBoy 源代码,可以用来做AndEngine游戏实例教程进行参考

    Andengine的jar包

    里面包含andengine.jar以及附属的8个jar扩展

    andengine example

    这是andengine引擎官方提供的一个示例app,里面包含了引擎的许多方面的例子,例如物理系统、粒子系统、声音系统、碰撞检测等,效果特别绚。

    AndEngine的jar包

    Android开发中正确的AndEngine的jar包

Global site tag (gtag.js) - Google Analytics