(4)、andengine之移除场景中的精灵

import org.andengine.engine.Engine.EngineLock;
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.scene.IOnSceneTouchListener;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.util.FPSLogger;
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.region.ITextureRegion;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import org.andengine.util.color.Color;

import android.util.DisplayMetrics;

public class SpriteRemoveActivity extends SimpleBaseGameActivity implements IOnSceneTouchListener
{
 private static int winWidth = 854;
 private static int winHeight = 480;
 
 //图片纹理区域
 private BitmapTextureAtlas mBitmapTextureAtlas;
 //纹理范围(用来剪切纹理)
 private ITextureRegion mTextureRegion;
 //精灵
 private Sprite mSprite;

 @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;
 }
 /**
  * TextureOptions
  * 1、NEAREST(Nearest滤波,实现上依赖GL_NEAREST做不光滑过滤,纹理环绕模式为GL_CLAMP_TO_EDGE,显示速度快画质差)
  * 2、BILINEAR(双线性插值,实现上依赖GL_LINEAR做线性滤波,纹理环绕模式为GL_CLAMP_TO_EDGE,显示速度慢画质佳)
  * 3、REPEATING(与NEAREST同为Nearest滤波,但纹理环绕模式为GL_REPEAT,会自动填充纹理上的空白区域,显示速度较快画质差)
  * 4、REPEATING_BILINEAR(与BILINEAR同为双线性插值,但纹理环绕模式为GL_REPEAT,会自动填充纹理上的空白区域,显示速度很慢画质佳(低端机跑此模式异常悲剧,高端机尚可)
  * 5、NEAREST_PREMULTIPLYALPHA(所有[PREMULTIPLYALPHA]结尾的TextureOptions与其它同名类差别仅在于是否支持根据Alpha值设置透明纹理,以下同)
  * 6、BILINEAR_PREMULTIPLYALPHA
  * 7、REPEATING_PREMULTIPLYALPHA
  * 8、REPEATING_BILINEAR_PREMULTIPLYALPHA等静态对象。
  *
  * 以上TextureOptions实例都可以通过“TextureOptions.XXXXXX”的方式进行引用并设置给Texture。
  * 事实上,除了AndEngine提供的Texture渲染模式,我们也可以按照规则自行构建需要的TextureOptions。
  * 比如构建一个混插的TextureOptions:
  *
  * new TextureOptions(GL10.GL_LINEAR_MIPMAP_LINEAR,
  * GL10.GL_LINEAR_MIPMAP_NEAREST, GL10.GL_REPEAT, GL10.GL_REPEAT, GL10.GL_MODULATE, true);
  * 另外,TextureOptions默认还有DEFAULT模式,不过该模式实际引用为NEAREST_PREMULTIPLYALPHA,也就是纹理低画质但支持Alpha。
  * 如果您想要兼容低端机,则建议不要使用含有【BILINEAR】字样的AndEngine加载大图,
  * 而应直接使用TextureOptions.DEFAULT或TextureOptions.NEAREST_PREMULTIPLYALPHA;
  * 因为BILINEAR模式对硬件要求较高,如果以此模式将较大纹理放到低端机上渲染,速度很可能无法保证。但是,假如您的游戏只针对高端机用户便无需介怀了。
  */
 @Override
 protected void onCreateResources()
 {
  //设置图片路径
  BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("images/");
  /*
   * 创建一个图片纹理区域(地图集)
   * 如果创建的区域大小大于所用的图片的实际大小,那么多出来的区域就会浪费掉,其实就是对我们的内存的消耗。
   * 建议:
   * 如果加载的图片比较多,可以建立一张很大的BitmaoTextureAtlas,然后将其他图片加载到这张区域上来。
   * 需要注意的是BitmaoTextureAtlas并不是可以无限创建大小,因为内存限制等问题。
   * 因此,如果图片很多很大的话,可以建立多张BitmaoTextureAtlas,分开装载。
   * 见:http://blog.csdn.net/xyz_fly/article/details/7458002

   *  AndEngine要求纹理加载的图片必须为2的整数次幂,否则报错
   */
  mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 32, 32,TextureOptions.DEFAULT);
  //得到图片并加装到纹理区域上来
  mTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mBitmapTextureAtlas, this, "face_box.png", 0, 0);
  mBitmapTextureAtlas.load();
 }

 @Override
 protected Scene onCreateScene()
 {
  this.mEngine.registerUpdateHandler(new FPSLogger());
  Scene scene = new Scene();
  scene.setBackground(new Background(Color.BLUE));
  
  float pX = (winWidth-mTextureRegion.getWidth())/2;
  float pY = (winHeight-mTextureRegion.getHeight())/2;
  //创建精灵
  mSprite  = new Sprite(pX, pY, mTextureRegion, this.getVertexBufferObjectManager());
  scene.attachChild(mSprite);
  
  scene.setOnSceneTouchListener(this);
  
  return scene;
 }

 /**
  * 设置屏幕大小
  */
 private void setScreenDisplay()
 {
  DisplayMetrics outMetrics = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
  winWidth = outMetrics.widthPixels;
  winHeight = outMetrics.heightPixels;
 }
 
 @Override
 public boolean onSceneTouchEvent(Scene scene, TouchEvent sceneTouchEvent)
 {
  if (mSprite == null) return false;
  //先将引擎锁起来,再删除,删除后,再释放锁。为了解决同步的问题
  //得到引擎锁
  EngineLock engineLock = this.mEngine.getEngineLock();
  //将引擎锁锁住
  engineLock.lock();
  //从场景中删除该精灵
  scene.detachChild(mSprite);
  //销毁
  mSprite.dispose();
  //置空
  mSprite = null;
  //解锁
  engineLock.unlock();
  return true;
 }
 
}

你可能感兴趣的:(AndEngine)