(转)[AndEngine学习教程] 第5节 可触摸移动的Sprite

1.本节要点:

       1.之前绘制的动画场景都是单人物的,这节主要讲解如何实现多个AnimatedSprite在共用一个BitmapTextureAtlas下的应用

       2.之前的精灵动画都没有交互性的,这节要实现触摸可以拖动精灵

       3.实现屏幕的多点触摸

2.Texture的创建

      1.本节用到4个精灵贴图:

(转)[AndEngine学习教程] 第5节 可触摸移动的Sprite_第1张图片


要合理的利用BitmapTextureAtlas这个类进行封装这四个贴图成一个大的texture,首先了解下它的构造:

[java]  view plain copy
  1. /** 
  2. * Uses {@link BitmapTextureFormat#RGBA_8888}. 
  3.  * 
  4. * @param pTextureOptions the (quality) settings of this {@link BitmapTextureAtlas}. 
  5.  */  
  6. public BitmapTextureAtlas(final TextureManager pTextureManager, final int pWidth, final int pHeight, final TextureOptions pTextureOptions) throws                IllegalArgumentException {  
  7. this(pTextureManager, pWidth, pHeight, BitmapTextureFormat.RGBA_8888, pTextureOptions, null);  
  8. }  

这里的BitmapTextureAtlas是指在内存中贴图集合,可以将多个图片同时放置在这里,本例子就是将四张大贴图放置期中;

另外一个值得注意的东西就是TiledTextureRegion,它可以从BitmapTextureAtlas中"扣"出一张贴图

3.细节处理

    1.内部变量设置

[java]  view plain copy
  1. private static final int CAMERA_WIDTH = 800;  
  2.     private static final int CAMERA_HEIGHT = 480;  
  3.       
  4.     private Camera mCamera;  
  5.     private RepeatingSpriteBackground mBackground;  
  6.     private BitmapTextureAtlas  mTexture;  
  7.     private TiledTextureRegion mBanana;  
  8.     private TiledTextureRegion mFrog;  
  9.     private TiledTextureRegion mHelicopter;  
  10.     private TiledTextureRegion mSnapDragon;  
  2.四张贴图中的分辨路分别为:132x70,96x32,96x84,400x180

   考虑到BitmapTextureAtlas 的长与宽只能为2的n次方大小,所以要把贴图集设置为512x256大小

[java]  view plain copy
  1. mTexture = new BitmapTextureAtlas(getTextureManager(), 512256, TextureOptions.BILINEAR_PREMULTIPLYALPHA);   

然后要把四张精灵贴图放置在mTexture里面就需要动下脑筋了,为了更加合理的放置,我把4张图片放置在photoshop里,然后创建一张

512x256大小的图片,尝试拖动他们进去排布,最终比较合理的排布为:

(转)[AndEngine学习教程] 第5节 可触摸移动的Sprite_第2张图片

程序上实现的方法为:

[java]  view plain copy
  1.               mSnapDragon = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mTexture, this"snapdragon_tiled.png"0043);  
  2. mHelicopter = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mTexture, this"helicopter_tiled.png"400022);  
  3. mBanana = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mTexture, this"banana_tiled.png"018042);      
  4. mFrog = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mTexture, this"frog.png"13218031);  
  5.   
  6.   
  7.   
  8. mTexture.load();  

3.创建可以支持触摸拖动的AnimatedSprite精灵

  自己根据需要创建TouchAnimatedSprite,并且集成AnimatedSprite的所有方法

[java]  view plain copy
  1. public class TouchAnimatedSprite extends AnimatedSprite{  
  2.   
  3.         public TouchAnimatedSprite(float pX, float pY, float pWidth,  
  4.                 float pHeight, ITiledTextureRegion pTiledTextureRegion,  
  5.                 VertexBufferObjectManager pVertexBufferObjectManager) {  
  6.             super(pX, pY, pWidth, pHeight, pTiledTextureRegion, pVertexBufferObjectManager);  
  7.             // TODO Auto-generated constructor stub  
  8.         }  
  9.         @Override  
  10.         public boolean onAreaTouched(TouchEvent pSceneTouchEvent,  
  11.                 float pTouchAreaLocalX, float pTouchAreaLocalY) {  
  12.             // TODO Auto-generated method stub  
  13.             switch(pSceneTouchEvent.getAction()){  
  14.             case TouchEvent.ACTION_DOWN:  
  15.             case TouchEvent.ACTION_MOVE:  
  16.                  this.setPosition(pSceneTouchEvent.getX()-this.getWidth()/2, pSceneTouchEvent.getY()-this.getHeight()/2);  
  17.                  return true;  
  18.               
  19.               
  20.             }  
  21.             return super.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY);  
  22.         }  
  23.           
  24.           
  25.     }  

 有了TouchAnimatedSprite这个类,就可以书写相关的初始化工作了,在onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)方法

中添加场景等初始化资源

  

[java]  view plain copy
  1. Scene mScene = new Scene();  
  2. ground(mBackground);  
接着在Scene中创建4个动画精灵

  

[java]  view plain copy
  1. final TouchAnimatedSprite myBanana = new TouchAnimatedSprite(10050,64,64,mBanana, getVertexBufferObjectManager());  
  2.         myBanana.animate(150);  
  3.           
  4.         final TouchAnimatedSprite myFrog = new TouchAnimatedSprite(100,CAMERA_HEIGHT-100,64,64,mFrog,getVertexBufferObjectManager());  
  5.         myFrog.animate(90);  
  6.           
  7.         final TouchAnimatedSprite myHelicopter = new TouchAnimatedSprite(CAMERA_WIDTH - 140, CAMERA_HEIGHT - 10084,84,mHelicopter,getVertexBufferObjectManager());  
  8.         myHelicopter.animate(new long[]{100,200,150,400},0,3,true);  
  9.           
  10.         final TouchAnimatedSprite mySnapDragon = new TouchAnimatedSprite(CAMERA_WIDTH - 100,50,85,85,mSnapDragon,getVertexBufferObjectManager());  
  11.         mySnapDragon.animate(90);  

然后把四个精灵动画添加到场景中

[java]  view plain copy
  1.               mScene.attachChild(myBanana);  
  2. mScene.attachChild(myFrog);  
  3. mScene.attachChild(myHelicopter);  
  4. mScene.attachChild(mySnapDragon);  


场景中的人物布置好了之后,接着个场景中的人如添加触摸操作支持

[java]  view plain copy
  1.               mScene.registerTouchArea(myBanana);  
  2. mScene.registerTouchArea(myFrog);  
  3. mScene.registerTouchArea(myHelicopter);  
  4. mScene.registerTouchArea(mySnapDragon);  
  5. mScene.setTouchAreaBindingOnActionDownEnabled(true);  

至此,整个设计已经完成了,但是屏幕只可以支持单点触摸的方式,毕竟咱们的手机大多数都是

支持多点触摸的,这样岂不是浪费并且不好玩.为了支持多点触摸可以在onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)方法

初始化mScene后添加如下方法:

[java]  view plain copy
  1.    if(MultiTouch.isSupported(this))//添加多点触摸支持  
  2. {  
  3.  this.mEngine.setTouchController(new MultiTouchController());  
  4.  this.mEngine.getEngineOptions().getTouchOptions().setNeedsMultiTouch(true);          
  5. }  
这样做了之后是不是很完美了呢?哈哈哈~~~~~~~~~~~~~~~~~~~~~

好了,废话少说,看看效果再说吧!

(转)[AndEngine学习教程] 第5节 可触摸移动的Sprite_第3张图片


(转)[AndEngine学习教程] 第5节 可触摸移动的Sprite_第4张图片

本节源代码下载地址:http://download.csdn.net/detail/cen616899547/4707665



转自:http://blog.csdn.net/cen616899547/article/details/8133266

你可能感兴趣的:((转)[AndEngine学习教程] 第5节 可触摸移动的Sprite)