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.youkuaiyun.com/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;
}
}