`

(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()");
    }
   });
  }
  
 }

}

 


 

分享到:
评论

相关推荐

    andengine2.0开发的小游戏

    通过分析源代码和阅读教程,学习者可以掌握AndEngine的基本用法,例如设置场景、添加实体、实现物理行为、处理用户输入和更新游戏逻辑。 总的来说,这个压缩包文件提供了一个很好的机会,让对AndEngine感兴趣的...

    AndEngine游戏开发示例

    AndEngine是一款专为Android平台设计的游戏开发框架,它简化了2D游戏的创建过程,让开发者无需深入理解底层图形库,就能快速构建出高质量的移动游戏。本示例旨在介绍如何利用AndEngine进行游戏开发,通过实例化引擎...

    andengine 中文

    AndEngine的核心特性在于它的模块化设计,主要包括场景(Scene)、实体(Entity)和行为(Behavior)等概念。场景是游戏的主界面,可以包含多个实体和行为。实体是游戏中可交互的对象,如角色、敌人、道具等,它们有自己的...

    AndEngine入门篇

    AndEngine的架构基于Scene(场景)、Entity(实体)和Module(模块)的概念。Scene是游戏的主要工作区,包含多个Entity,每个Entity可以看作游戏中的一个独立对象,如角色、道具等。Module则是一组相关功能的集合,...

    AndEngine下载

    7. **AndEngine Robotium Extension**:从提供的文件名`AndEngineRobotiumExtensionExampleTest-master`来看,这似乎是一个使用AndEngine与Robotium进行自动化测试的示例项目。Robotium是一个流行的Android自动化...

    Andengine的jar包

    Andengine是一款专为Android平台设计的游戏开发引擎,它基于OpenGL ES,提供了丰富的图形渲染和物理模拟功能,使得开发者能够快速创建2D游戏。Andengine的jar包是其核心库,包含了实现游戏逻辑、动画效果、碰撞检测...

    AndEngine最新Jar包

    在AndEngine中,游戏场景是由多个实体(或称为节点)组成的,`attachChild()`就是将一个节点(如精灵、纹理、形状等)添加到父节点(通常是Scene或Group)上的方法,从而将它显示在游戏中。 AndEngine的核心组件...

    andengine源码及demo

    AndEngine是一款专为Android平台设计的2D游戏开发框架,它提供了一套高效、易用的API,使得开发者能够快速构建各种2D游戏。AndEngine源码的分析和理解对于想要深入学习Android游戏开发的人来说至关重要。 1. **...

    AndEngine 中文文档

    10. **时间线与调度器**:AndEngine的时间线和调度器功能使得开发者能够安排和同步游戏中的事件和动作,创建复杂的逻辑。 11. **扩展模块**:AndEngine有多个扩展模块,如粒子系统、3D图形支持、UI组件等。文档会...

    andengine 类代码组织图

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

    AndEngine 类 组织图

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

    AndEngine最新jar包

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

    andengine案例,jar包

    7. **示例应用**:包含的两个案例apk是AndEngine功能的直观展示,通过分析和学习这些示例,开发者可以快速掌握AndEngine的使用方法。 8. **易于上手**:AndEngine的设计目标之一就是易用性,它提供了清晰的API文档...

    AndEngine游戏引擎JAR文件

    AndEngine游戏引擎是一款高效、开源的Android游戏开发框架,它基于OpenGL ES,使得开发者可以直接进行图形硬件加速的游戏编程。这个框架极大地简化了Android平台上2D游戏的开发过程,提供了丰富的功能,让开发者能够...

    AndEngine的jar包和API

    6. **扩展和插件**:AndEngine社区开发了许多扩展和插件,如粒子编辑器、精灵批处理、多点触控支持等,进一步增强了其功能。 在实际开发中,你需要结合AndEngine的API文档,通过编写Java代码来实现游戏逻辑。例如,...

    AndEngine的官网下载的Demo

    AndEngine是一款针对Android平台开发2D游戏的开源引擎,它以简单易用和高效著称。这个Demo是AndEngine官方网站提供的示例集合,用于帮助开发者更好地理解和学习如何使用AndEngine来构建游戏。以下是对AndEngine及其...

    AndEngine的jar包

    这个“AndEngine的jar包”是AndEngine的核心库,包含了AndEngine的所有功能模块,是进行AndEngine游戏开发的基础。 AndEngine的主要特点包括: 1. **轻量级**:AndEngine体积小,不占用过多系统资源,适合在各种...

    AndEngine做的安卓游戏源码(可直接运行)

    4. **Entity**和**GameObject**:实体和游戏对象,是AndEngine中的基本组件,可以是玩家角色、敌人、道具等。 5. **PhysicsWorld**:如果游戏包含了物理效果,那么会有一个PhysicsWorld实例来处理碰撞检测和物体运动...

    AndEngine游戏-DeliveryBoy-源代码

    7. **游戏对象的生命周期管理**:AndEngine中的Entity和Group类可以帮助开发者管理游戏对象的创建、更新和销毁,保持游戏状态的稳定。 8. **资源加载与缓存**:高效地加载和缓存游戏资源是提高游戏性能的关键。...

    andengine 最新源码(具有box2D)

    7. **扩展和插件**:AndEngine允许开发者自定义扩展或使用社区提供的插件,如粒子系统、触摸手势识别、网络通信等,增强游戏功能。 8. **文档和示例**:源码中可能包含示例项目和详细文档,帮助开发者快速上手和...

Global site tag (gtag.js) - Google Analytics