andengine编程之sprite(三)

来源:互联网 发布:水晶报表 java 编辑:程序博客网 时间:2024/06/05 11:29

在andengine编程之sprite(二)中,我们介绍了一些sprite中所用到的方法,这次,我们要结合这些来完成精灵的触摸和简单的移动,拖拽效果

关于sprite点击效果,之前在menu中也有提到。ButtonSprite的构造方法中,需要传入 new OnClickListener()按键监听机制,可以实现点击效果的切换。看看源代码的话,就能明白,它其实就是对onAreaTouched方法进行了封装。这次我们就来讲讲onAreaTouched,其实,它的使用更为简单。

在上一个TestSprite基础上,我们来改进一下,为face精灵增加触摸机制:

原来的精灵图片比较小,我们这里做了放大处理,以便于点击

public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)throws Exception {Scene mScene = new Scene();face = new AnimatedSprite(100, 100, mSpriteTiledTextureRegion,getVertexBufferObjectManager()) {// 是否选中的标志boolean mGrabbed = false;public boolean onAreaTouched(TouchEvent pSceneTouchEvent,float pTouchAreaLocalX, float pTouchAreaLocalY) {switch (pSceneTouchEvent.getAction()) {case TouchEvent.ACTION_DOWN:mGrabbed = true;// 将原图片放大到4.5倍(之前设置的是4倍)setScale(4.5f);break;case TouchEvent.ACTION_MOVE:if (mGrabbed) {// 从新设置精灵的坐标setPosition(pSceneTouchEvent.getX(),pSceneTouchEvent.getY());}break;case TouchEvent.ACTION_UP:if (mGrabbed) {mGrabbed = false;// 将图片还原到之前的样子,4倍大小setScale(4f);}break;}return true;}};// 为了点击区域大一些,我们将图片放大4倍face.setScale(4f);face.animate(new long[] { 200, 200 }, 0, 1, true);// 设置背景mScene.setBackground(background);mScene.attachChild(face);// 注册精灵要实现触摸效果mScene.registerTouchArea(face);pOnCreateSceneCallback.onCreateSceneFinished(mScene);}

然后,你可以试试点住笑脸,拖动拖动看看。

除了点中精灵对它的位置重新设置外,我们还可以对整个场景进行监听。在触摸到场景中任意一个位置的时候,我们同样改变一下精灵的当前坐标。


public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)throws Exception {Scene mScene = new Scene();final AnimatedSprite face = new AnimatedSprite(100, 100,mSpriteTiledTextureRegion, getVertexBufferObjectManager());// 为了点击区域大一些,我们将图片放大4倍face.setScale(4f);face.animate(new long[] { 200, 200 }, 0, 1, true);// 设置背景mScene.setBackground(background);mScene.attachChild(face);// 注册精灵要实现触摸效果mScene.registerTouchArea(face);// 为场景注册触摸监听事件mScene.setOnSceneTouchListener(new IOnSceneTouchListener() {public boolean onSceneTouchEvent(Scene pScene,TouchEvent pSceneTouchEvent) {switch (pSceneTouchEvent.getAction()) {// 这里,我们只取了按下抬起时的效果,方便我们观察case TouchEvent.ACTION_UP:face.setPosition(pSceneTouchEvent.getX(),pSceneTouchEvent.getY());break;}return true;}});pOnCreateSceneCallback.onCreateSceneFinished(mScene);}


以下是包含了两种触摸机制的源代码:


package com.testsprite;import org.andengine.engine.camera.Camera;import org.andengine.engine.options.EngineOptions;import org.andengine.engine.options.EngineOptions.ScreenOrientation;import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;import org.andengine.entity.scene.IOnSceneTouchListener;import org.andengine.entity.scene.Scene;import org.andengine.entity.scene.background.RepeatingSpriteBackground;import org.andengine.entity.sprite.AnimatedSprite;import org.andengine.input.touch.TouchEvent;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.atlas.bitmap.source.AssetBitmapTextureAtlasSource;import org.andengine.opengl.texture.region.TiledTextureRegion;import org.andengine.ui.activity.BaseGameActivity;public class TestSprite extends BaseGameActivity {private static final int CAMERA_WIDTH = 800;private static final int CAMERA_HEIGHT = 480;private RepeatingSpriteBackground background;private TiledTextureRegion mSpriteTiledTextureRegion;public EngineOptions onCreateEngineOptions() {Camera mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);EngineOptions mEngineOptions = new EngineOptions(true,ScreenOrientation.LANDSCAPE_FIXED, new FillResolutionPolicy(),mCamera);return mEngineOptions;}public void onCreateResources(OnCreateResourcesCallback pOnCreateResourcesCallback)throws Exception {this.background = new RepeatingSpriteBackground(800, 480,getTextureManager(), AssetBitmapTextureAtlasSource.create(this.getAssets(), "background.png"),getVertexBufferObjectManager());BitmapTextureAtlas mBitmapTextureAtlas = new BitmapTextureAtlas(getTextureManager(), 64, 32, TextureOptions.DEFAULT);mSpriteTiledTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mBitmapTextureAtlas, this,"face_circle_tiled.png", 0, 0, 2, 1);mBitmapTextureAtlas.load();pOnCreateResourcesCallback.onCreateResourcesFinished();}public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)throws Exception {Scene mScene = new Scene();final AnimatedSprite face = new AnimatedSprite(100, 100,mSpriteTiledTextureRegion, getVertexBufferObjectManager()) {// 是否选中的标志boolean mGrabbed = false;public boolean onAreaTouched(TouchEvent pSceneTouchEvent,float pTouchAreaLocalX, float pTouchAreaLocalY) {switch (pSceneTouchEvent.getAction()) {case TouchEvent.ACTION_DOWN:mGrabbed = true;// 将原图片放大到4.5倍(之前设置的是4倍)setScale(4.5f);break;case TouchEvent.ACTION_MOVE:if (mGrabbed) {// 从新设置精灵的坐标setPosition(pSceneTouchEvent.getX(),pSceneTouchEvent.getY());}break;case TouchEvent.ACTION_UP:if (mGrabbed) {mGrabbed = false;// 将图片还原到之前的样子,4倍大小setScale(4f);}break;}return true;}};// 为了点击区域大一些,我们将图片放大4倍face.setScale(4f);face.animate(new long[] { 200, 200 }, 0, 1, true);// 设置背景mScene.setBackground(background);mScene.attachChild(face);// 注册精灵要实现触摸效果mScene.registerTouchArea(face);// 为场景注册触摸监听事件mScene.setOnSceneTouchListener(new IOnSceneTouchListener() {public boolean onSceneTouchEvent(Scene pScene,TouchEvent pSceneTouchEvent) {switch (pSceneTouchEvent.getAction()) {// 这里,我们只取了按下抬起时的效果,方便我们观察case TouchEvent.ACTION_UP:face.setPosition(pSceneTouchEvent.getX(),pSceneTouchEvent.getY());break;}return true;}});pOnCreateSceneCallback.onCreateSceneFinished(mScene);}public void onPopulateScene(Scene pScene,OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception {pOnPopulateSceneCallback.onPopulateSceneFinished();}}


Sprite触摸机制