(转)[AndEngine学习教程] 第9节 CollisionDetection 实体碰撞检测

1.本节要点

    通过一个可操作的精灵,来与一个固定循环变化的矩形检测是否产生碰撞,当产生碰撞的时候,矩形的颜色为红色,

   否则矩形的颜色为绿色

2.新学内容

 1.学会使用SmoothCamera类,这个类是一个平滑的照相机类,可以满足背景自动填充,平滑过渡的效果.先看看它的构成吧:

[java]  view plain copy
  1. public class SmoothCamera extends ZoomCamera   
是继承于SmoothCamera的类,而SmoothCamera从文字上就可以看出它是一个支持缩放效果的类,因此使用起来就很方便了,

构造方法为:

[java]  view plain copy
  1. public SmoothCamera(final float pX, final float pY, final float pWidth, final float pHeight, final float pMaxVelocityX, final float pMaxVelocityY, final float pMaxZoomFactorChange) {  
  2.         super(pX, pY, pWidth, pHeight);  
  3.         this.mMaxVelocityX = pMaxVelocityX;  
  4.         this.mMaxVelocityY = pMaxVelocityY;  
  5.         this.mMaxZoomFactorChange = pMaxZoomFactorChange;  
  6.   
  7.         this.mTargetCenterX = this.getCenterX();  
  8.         this.mTargetCenterY = this.getCenterY();  
  9.   
  10.         this.mTargetZoomFactor = 1.0f;  
  11.     }  

为了体现效果,我刻意的把背景图片做成720*640大小,而手机的屏幕分辨率大小为800*480,但是依然可以看到全屏的效果.相当不错的哦!

以下的是我使用到的背景图片:

  

 2.为场景Scene注册刷新句柄,用来监听每次实体间是否产生碰撞.然后进行相应的事物处理,具体调用方法为:

[java]  view plain copy
  1. mScene.registerUpdateHandler(new IUpdateHandler());  

3.内部代码初始化设计

1.本节使用到4个实体,一个是人脸,另外一个是矩形,最后2个是控制器,内部成员变量设计为:

[java]  view plain copy
  1. private static final int CAMERA_WIDTH = 800;  
  2.     private static final int CAMERA_HEIGHT = 480;  
  3.       
  4.     private SmoothCamera mCamera;  
  5.     private SpriteBackground mBackground;  
  6.     private TiledTextureRegion mControlBaseRegion;  
  7.     private TiledTextureRegion mControlKnobRegion;  
  8.     private TiledTextureRegion mFaceRegion;  


2.引擎资源的加载

[java]  view plain copy
  1. @Override  
  2.     public EngineOptions onCreateEngineOptions() {  
  3.         // TODO Auto-generated method stub  
  4.         mCamera = new SmoothCamera(00, CAMERA_WIDTH, CAMERA_HEIGHT, 10103);  
  5.         EngineOptions mEngineOptions = new  EngineOptions(true, ScreenOrientation.LANDSCAPE_SENSOR,new RatioResolutionPolicy(CAMERA_WIDTH,CAMERA_HEIGHT),mCamera);  
  6.         return mEngineOptions;  
  7.     }  
  8.   
  9.     @Override  
  10.     public void onCreateResources(  
  11.             OnCreateResourcesCallback pOnCreateResourcesCallback)  
  12.             throws Exception {  
  13.         // TODO Auto-generated method stub  
  14.         BitmapTextureAtlas mTexture = new BitmapTextureAtlas(getTextureManager(), 10241024, TextureOptions.BILINEAR_PREMULTIPLYALPHA);  
  15.         final TiledTextureRegion mBackgroundRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mTexture, this"bg.png"0011);  
  16.         final Sprite mBackgroundSprite = new Sprite(00, CAMERA_WIDTH, CAMERA_HEIGHT, mBackgroundRegion, getVertexBufferObjectManager());  
  17.         mBackground = new SpriteBackground(mBackgroundSprite);  
  18.           
  19.         mControlBaseRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mTexture, this"onscreen_control_base.png"720011);  
  20.         mControlKnobRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mTexture, this"onscreen_control_knob.png"848011);  
  21.         mFaceRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mTexture, this"face_box.png"912011);  
  22.           
  23.         mTexture.load();  
  24.         pOnCreateResourcesCallback.onCreateResourcesFinished();  
  25.     }  

4.场景设计
1.添加多点触摸支持和场景基础设施

[java]  view plain copy
  1. if(MultiTouch.isSupported(this)){  
  2.             this.mEngine.setTouchController(new MultiTouchController());//多点触摸        
  3.         }  
  4.           
  5.         Scene mScene = new Scene();  
  6.         mScene.setBackground(mBackground);  
  7.           
  8.         final float centerX = (CAMERA_WIDTH - mFaceRegion.getWidth()) / 2;  
  9.         final float centerY = (CAMERA_HEIGHT - mFaceRegion.getHeight()) / 2;  

2.构建相应的精灵任务:

    2.1 布置人脸:            

[java]  view plain copy
  1. final MySprite mFace = new MySprite(centerX - 50, centerY, 8080, mFaceRegion, getVertexBufferObjectManager());  
  2.           
   2.2 不知受碰撞检测的矩形

[java]  view plain copy
  1. final Rectangle mRectangle = new Rectangle(centerX + 10, centerY, 80,80,getVertexBufferObjectManager());  
  2.         mRectangle.registerEntityModifier(new LoopEntityModifier(new ParallelEntityModifier(  
  3.                 new ScaleModifier(20.5f, 2.0f),new ScaleModifier(22.0f,1.0f),new RotationModifier(4,0.0f,360.0f) )));  
  4.           
     添加相应的modifier后,矩形就会动态的变幻了.

   2.3 布置移动控制器和方向控制器

       

[java]  view plain copy
  1. final AnalogOnScreenControl mSpeedController = new AnalogOnScreenControl(30,CAMERA_HEIGHT -  mControlBaseRegion.getHeight() - 20,  
  2.                 mCamera, mControlBaseRegion, mControlKnobRegion, 0.1f, 100,getVertexBufferObjectManager(),  
  3.                 new IAnalogOnScreenControlListener(){  
  4.   
  5.                     @Override  
  6.                     public void onControlChange(  
  7.                             BaseOnScreenControl pBaseOnScreenControl,  
  8.                             float pValueX, float pValueY) {  
  9.                         // TODO Auto-generated method stub  
  10.                         if(pValueX == 0 && pValueY == 0){  
  11.                             mFace.setVelocity(00);  
  12.                         }  
  13.                           
  14.                         else  
  15.                         {  
  16.                             mFace.setVelocity(pValueX*100, pValueY*100);  
  17.                         }  
  18.                     }  
  19.   
  20.                     @Override  
  21.                     public void onControlClick(  
  22.                             AnalogOnScreenControl pAnalogOnScreenControl) {  
  23.                         // TODO Auto-generated method stub  
  24.                           
  25.                     }  
  26.   
  27.   
  28.         });  
  29.           
  30.           
  31.         final AnalogOnScreenControl mRotationController = new AnalogOnScreenControl(CAMERA_WIDTH - mControlBaseRegion.getWidth() - 30,  
  32.                 CAMERA_HEIGHT -  mControlBaseRegion.getHeight() - 20,  
  33.                 mCamera, mControlBaseRegion, mControlKnobRegion, 0.1f, 100,getVertexBufferObjectManager(),  
  34.                 new IAnalogOnScreenControlListener(){  
  35.   
  36.                     @Override  
  37.                     public void onControlChange(  
  38.                             BaseOnScreenControl pBaseOnScreenControl,  
  39.                             float pValueX, float pValueY) {  
  40.                         // TODO Auto-generated method stub  
  41.                         if(pValueX == 0 && pValueY == 0){  
  42.                             mFace.setRotation(0.0f);  
  43.                         }  
  44.                           
  45.                         else  
  46.                         {  
  47.                             mFace.setRotation(MathUtils.radToDeg(MathUtils.atan2(pValueY, pValueX)));  
  48.                         }  
  49.                     }  
  50.   
  51.                     @Override  
  52.                     public void onControlClick(  
  53.                             AnalogOnScreenControl pAnalogOnScreenControl) {  
  54.                         // TODO Auto-generated method stub  
  55.                           
  56.                     }  
  57.   
  58.   
  59.         });  
      2.4 把所有角色搬到场景中

[java]  view plain copy
  1. mSpeedController.getControlBase().setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);  
  2.         mRotationController.getControlBase().setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);  
  3.           
  4.         mScene.attachChild(mFace);  
  5.         mScene.attachChild(mRectangle);  
  6.         mScene.setChildScene(mSpeedController);  
  7.         mSpeedController.setChildScene(mRotationController);  
  8.           
  9.         pOnCreateSceneCallback.onCreateSceneFinished(mScene);  

5.在场景中注册刷新监听事件

 

[java]  view plain copy
  1. mScene.registerUpdateHandler(new IUpdateHandler(){  
  2.   
  3.             @Override  
  4.             public void onUpdate(float pSecondsElapsed) {  
  5.                 // TODO Auto-generated method stub  
  6.                 if(mRectangle.collidesWith(mFace)){  
  7.                     mRectangle.setColor(1.0f, 0.0f, 0.0f);  
  8.                 }  
  9.                   
  10.                 else  
  11.                 {  
  12.                     mRectangle.setColor(0.0f,1.0f,0.0f);  
  13.                 }  
  14.             }  
  15.   
  16.             @Override  
  17.             public void reset() {  
  18.                 // TODO Auto-generated method stub  
  19.                   
  20.             }  
  21.   
  22.           
  23.         });  
有了这个监听后,场景每次的刷新都可以添加处理事件了.所以基本上就完成任务了,呵呵


6.辅助自定义类

[java]  view plain copy
  1. public class MySprite extends Sprite{  
  2.   
  3.         public MySprite(float pX, float pY, float pWidth, float pHeight,  
  4.                 ITextureRegion pTextureRegion,  
  5.                 VertexBufferObjectManager pVertexBufferObjectManager) {  
  6.             super(pX, pY, pWidth, pHeight, pTextureRegion, pVertexBufferObjectManager);  
  7.             // TODO Auto-generated constructor stub  
  8.         }  
  9.   
  10.         private float mVelocityX = 0;  
  11.         private float mVelocityY = 0;  
  12.           
  13.           
  14.           
  15.         @Override  
  16.         protected void onManagedUpdate(float pSecondsElapsed) {  
  17.             // TODO Auto-generated method stub  
  18.             this.mX += mVelocityX * pSecondsElapsed;  
  19.             this.mY += mVelocityY * pSecondsElapsed;  
  20.               
  21.             this.setPosition(mX, mY);  
  22.               
  23.             super.onManagedUpdate(pSecondsElapsed);  
  24.         }  
  25.   
  26.         void setVelocity(float vX, float vY){  
  27.             mVelocityX = vX;  
  28.             mVelocityY = vY;  
  29.         }  
  30.           
  31.     }  

7.运行演示

   通过碰撞检测运行的结果如下:







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



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

你可能感兴趣的:(Java/Android)