(转)[AndEngine学习教程] 第6节 模拟手柄控制器

1.本节要点

      制作一个虚拟手柄来控制动画精灵的移动,旋转.

2.新使用到的AndEngine资源

  1.AnalogOnScreenControl 这是AndEngine给我们提供的用于虚拟手柄,虚拟控制器方面的基础类,其构造如下:

[java]  view plain copy
  1. public AnalogOnScreenControl(final float pX, final float pY, final Camera pCamera, final ITextureRegion pControlBaseTextureRegion, final ITextureRegion pControlKnobTextureRegion, final float pTimeBetweenUpdates, final VertexBufferObjectManager pVertexBufferObjectManager, final IAnalogOnScreenControlListener pAnalogOnScreenControlListener) {  
  2.         super(pX, pY, pCamera, pControlBaseTextureRegion, pControlKnobTextureRegion, pTimeBetweenUpdates, pVertexBufferObjectManager, pAnalogOnScreenControlListener);  
  3.   
  4.         this.mClickDetector.setEnabled(false);  
  5.     }  
  6.   
  7. public AnalogOnScreenControl(final float pX, final float pY, final Camera pCamera, final ITextureRegion pControlBaseTextureRegion, final ITextureRegion pControlKnobTextureRegion, final float pTimeBetweenUpdates, final long pOnControlClickMaximumMilliseconds, final VertexBufferObjectManager pVertexBufferObjectManager, final IAnalogOnScreenControlListener pAnalogOnScreenControlListener) {  
  8.         super(pX, pY, pCamera, pControlBaseTextureRegion, pControlKnobTextureRegion, pTimeBetweenUpdates, pVertexBufferObjectManager, pAnalogOnScreenControlListener);  
  9.   
  10.         this.mClickDetector.setTriggerClickMaximumMilliseconds(pOnControlClickMaximumMilliseconds);  
  11.     }  

  2.参数说明:

       pX,pY是控制器的左上角放置坐标;

       pCamera是我们在场景中使用到的Camera;

       pControlBaseTextureRegion相当于控制器的背景

       pControlKnobTextureRegion相当于控制器的指针图标

      pTimeBetweenUpdates指控制器的重绘刷新时间间隔,单位是秒

      pVertexBufferObjectManager直接使用getVertxeBufferObjectManager()传进去就可以了

      pAnalogOnScreenControlListener是控制器实现自动监听的接口,主要用来监听控制器的位置变化,

     然后将相应的变化转化为一组通用的数据(-1到1之间),接口源代码为:

    

[java]  view plain copy
  1. public interface IAnalogOnScreenControlListener extends IOnScreenControlListener {  
  2.         // ===========================================================  
  3.         // Constants  
  4.         // ===========================================================  
  5.   
  6.         // ===========================================================  
  7.         // Methods  
  8.         // ===========================================================  
  9.   
  10.         public void onControlClick(final AnalogOnScreenControl pAnalogOnScreenControl);  
  11.     }  
[java]  view plain copy
  1. public static interface IOnScreenControlListener {  
  2.         // ===========================================================  
  3.         // Constants  
  4.         // ===========================================================  
  5.   
  6.         // ===========================================================  
  7.         // Methods  
  8.         // ===========================================================  
  9.   
  10.         /** 
  11.          * @param pBaseOnScreenControl 
  12.          * @param pValueX between <code>-1</code> (left) to <code>1</code> (right). 
  13.          * @param pValueY between <code>-1</code> (up) to <code>1</code> (down). 
  14.          */  
  15.         public void onControlChange(final BaseOnScreenControl pBaseOnScreenControl, final float pValueX, final float pValueY);  
  16.     }  
这两个接口一个实现点击监听,一个实现变化监听.所以我们可以根据需要,在我们自己的类当中使用.

3.构建符合自己需要的精灵

      本节当中需要根据控制器来控制精灵的旋转,移动.而AndEngine给我们提供的AnimatedSprite类只实现了旋转,

并没有按照一定速度移动的方法,在这里我自己重写了该类:

[java]  view plain copy
  1. public class MyControlSprite extends AnimatedSprite{  
  2.   
  3.         public MyControlSprite(float pX, float pY, float pWidth, float pHeight,  
  4.                 ITiledTextureRegion pTiledTextureRegion,  
  5.                 VertexBufferObjectManager pVertexBufferObjectManager) {  
  6.             super(pX, pY, pWidth, pHeight, pTiledTextureRegion, pVertexBufferObjectManager);  
  7.             // TODO Auto-generated constructor stub  
  8.             mVelocityX = 0;  
  9.             mVelocityY = 0;  
  10.         }  
  11.   
  12.         private float mVelocityX;//水平速度  
  13.         private float mVelocityY;//垂直速度  
  14.           
  15.   
  16.         @Override  
  17.         protected void onManagedUpdate(float pSecondsElapsed) {  
  18.             // TODO Auto-generated method stub  
  19.             this.mX += mVelocityX * pSecondsElapsed;  
  20.             this.mY += mVelocityY * pSecondsElapsed;  
  21.               
  22.             this.setPosition(mX, mY);  
  23.             super.onManagedUpdate(pSecondsElapsed);  
  24.         }  
  25.           
  26.           
  27.         void setVolocityX(float vX){  
  28.             mVelocityX = vX;  
  29.               
  30.         }  
  31.           
  32.         void setVolocityY(float vY){      
  33.             mVelocityY = vY;  
  34.         }  
  35.           
  36.         void setVolocityXY(float vX, float vY){  
  37.             mVelocityX = vX;  
  38.             mVelocityY = vY;  
  39.         }  
  40.     }  

主要在 onManagedUpdate 方法中增加了精灵按照一定速度移动的方法

4.资源构建

1.本例子用到4张图片:背景,精灵,控制器背景,控制器指针

    (转)[AndEngine学习教程] 第6节 模拟手柄控制器_第1张图片


(转)[AndEngine学习教程] 第6节 模拟手柄控制器_第2张图片     


源代码如下:

[java]  view plain copy
  1. private static final float CAMERA_WIDTH = 800;  
  2.     private static final float CAMERA_HEIGHT = 480;  
  3.       
  4.     private Camera mCamera;  
  5.     private RepeatingSpriteBackground mBackground;  
  6.     private TiledTextureRegion mBaseRegion;  
  7.     private TiledTextureRegion mKnobRegion;  
  8.     private TiledTextureRegion mDragonRegion;  
  9.       
  10.     @Override  
  11.     public EngineOptions onCreateEngineOptions() {  
  12.         // TODO Auto-generated method stub  
  13.         mCamera = new Camera(0,0,CAMERA_WIDTH, CAMERA_HEIGHT);  
  14.         EngineOptions mEngineOptions = new EngineOptions(true,ScreenOrientation.LANDSCAPE_SENSOR,new RatioResolutionPolicy(CAMERA_WIDTH,CAMERA_HEIGHT),mCamera);  
  15.           
  16.         return mEngineOptions;  
  17.     }  
  18.   
  19.     @Override  
  20.     public void onCreateResources(  
  21.             OnCreateResourcesCallback pOnCreateResourcesCallback)  
  22.             throws Exception {  
  23.         // TODO Auto-generated method stub  
  24.         mBackground = new RepeatingSpriteBackground(CAMERA_WIDTH, CAMERA_HEIGHT, getTextureManager(), AssetBitmapTextureAtlasSource.create(getAssets(), "background_grass.png"), getVertexBufferObjectManager());  
  25.         BitmapTextureAtlas mDragonTexture = new BitmapTextureAtlas(getTextureManager(), 512256, TextureOptions.BILINEAR_PREMULTIPLYALPHA);  
  26.         BitmapTextureAtlas mController = new BitmapTextureAtlas(getTextureManager(),256,256,TextureOptions.BILINEAR_PREMULTIPLYALPHA);  
  27.           
  28.         mDragonRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mDragonTexture, this"snapdragon_tiled.png"0043);  
  29.         mBaseRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mController, this"onscreen_control_base.png"0011);  
  30.         mKnobRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mController, this"onscreen_control_knob.png"128011);  
  31.           
  32.         mDragonTexture.load();  
  33.         mController.load();  
  34.           
  35.           
  36.         pOnCreateResourcesCallback.onCreateResourcesFinished();  
  37.     }  

5.场景创建

   1.基础场景

       

[java]  view plain copy
  1. Scene mScene = new Scene();  
  2.         mScene.setBackground(mBackground);  
  3.           
  4.         if(MultiTouch.isSupported(this)){  
  5.             this.mEngine.setTouchController(new MultiTouchController());  
  6.               
  7.         }  

     2.创建控制器和动画精灵,在这里有两个控制器,一个是控制移动,一个控制旋转

[java]  view plain copy
  1. final MyControlSprite mDragon = new MyControlSprite(CAMERA_WIDTH/2, CAMERA_HEIGHT/2,80.0f,80.0f,mDragonRegion, getVertexBufferObjectManager());  
  2.              mDragon.animate(100);       
  3.                
  4.        final AnalogOnScreenControl mDerectionControl  = new AnalogOnScreenControl(20, CAMERA_HEIGHT-mBaseRegion.getHeight()-20,  
  5.                       mCamera, mBaseRegion, mKnobRegion, 0.1f, 200,   
  6.                       getVertexBufferObjectManager(),   
  7.                       new IAnalogOnScreenControlListener(){  
  8.   
  9.                         @Override  
  10.                         public void onControlChange(  
  11.                                 BaseOnScreenControl pBaseOnScreenControl,  
  12.                                 float pValueX, float pValueY) {  
  13.                             // TODO Auto-generated method stub  
  14.                             mDragon.setVolocityXY(pValueX*100, pValueY*100);  
  15.                         }  
  16.   
  17.                         @Override  
  18.                         public void onControlClick(  
  19.                                 AnalogOnScreenControl pAnalogOnScreenControl) {  
  20.                             // TODO Auto-generated method stub  
  21.                             Log.d("Season","Click on Controller");  
  22.                         }  
  23.   
  24.                       
  25.   
  26.        });      
  27.           
  28.          
  29.        final AnalogOnScreenControl mRotationControl = new AnalogOnScreenControl(CAMERA_WIDTH - 20 - mBaseRegion.getWidth(), CAMERA_HEIGHT-mBaseRegion.getHeight()-20,  
  30.                   mCamera, mBaseRegion, mKnobRegion, 0.1f, 200,   
  31.                   getVertexBufferObjectManager(),   
  32.                   new IAnalogOnScreenControlListener(){  
  33.   
  34.                     @Override  
  35.                     public void onControlChange(  
  36.                             BaseOnScreenControl pBaseOnScreenControl,  
  37.                             float pValueX, float pValueY) {  
  38.                         // TODO Auto-generated method stub  
  39.                         if(pValueX == 0 && pValueY == 0){  
  40.                               
  41.                             mDragon.setRotation(0.0f);  
  42.                         }  
  43.                         mDragon.setRotation(MathUtils.radToDeg((float) Math.atan2(pValueY, pValueX)));  
  44.                     }  
  45.   
  46.                     @Override  
  47.                     public void onControlClick(  
  48.                             AnalogOnScreenControl pAnalogOnScreenControl) {  
  49.                         // TODO Auto-generated method stub  
  50.                         Log.d("Season","Click on Controller");  
  51.                     }  
  52.           });      
  53.          
  54.          
  55.        mDerectionControl.setAlpha(0.65f);  
  56.        mRotationControl.setAlpha(0.65f);  

  3.将角色加载到场景,在这里需要注意的地方是:

     mDragon使用mScene.attachChild(IEntity)的方法

     而mDerectionControlsetChildScene只能使用setChildScene(Scene)的方法,不然的话

    这两个控制器你怎么点他们都毫无反应,这也是我刚刚开始的时候没仔细看代码犯下的错误

[java]  view plain copy
  1. mDerectionControl.setAlpha(0.65f);  
  2.    mRotationControl.setAlpha(0.65f);  
  3.      
  4.    mScene.attachChild(mDragon);  
  5.    mScene.setChildScene(mDerectionControl);  
  6.    mDerectionControl.setChildScene(mRotationControl);  
  7.      
  8.   pOnCreateSceneCallback.onCreateSceneFinished(mScene);  

5.一切准备就绪,运行代码

    终于完成了所有代码,开心呀.hoho~~~~~大笑

   转载请注明出处哦,谢谢!本文由Season于2012-11-1 14:18完成的

   运行结果如下:

(转)[AndEngine学习教程] 第6节 模拟手柄控制器_第3张图片


(转)[AndEngine学习教程] 第6节 模拟手柄控制器_第4张图片


本例子源代码:http://download.csdn.net/detail/cen616899547/4710222


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

你可能感兴趣的:((转)[AndEngine学习教程] 第6节 模拟手柄控制器)