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.IEntity;
import org.andengine.entity.modifier.IEntityModifier.IEntityModifierListener;
import org.andengine.entity.modifier.LoopEntityModifier;
import org.andengine.entity.modifier.LoopEntityModifier.ILoopEntityModifierListener;
import org.andengine.entity.modifier.ParallelEntityModifier;
import org.andengine.entity.modifier.RotationModifier;
import org.andengine.entity.modifier.ScaleModifier;
import org.andengine.entity.primitive.Rectangle;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.sprite.AnimatedSprite;
import org.andengine.entity.util.FPSLogger;
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.TiledTextureRegion;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import org.andengine.util.color.Color;
import org.andengine.util.modifier.IModifier;
import org.andengine.util.modifier.LoopModifier;
import android.opengl.GLES20;
import android.util.DisplayMetrics;
import android.widget.Toast;
/**
* 实体修改器
*/
public class EntityModfierActivity extends SimpleBaseGameActivity
{
private static int winWidth = 854;
private static int winHeight = 480;
//纹理区域
private BitmapTextureAtlas mBitmapTextureAtlas;
//动画图片纹理范围
private TiledTextureRegion mTiledTextureRegion;
@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;
}
@Override
protected void onCreateResources()
{
//设置图片路径
BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("images/");
//加载的图片必须为2的整数次幂
mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 64, 32, TextureOptions.BILINEAR);
mTiledTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mBitmapTextureAtlas, this, "face_box_tiled.png", 0, 0, 2, 1);
mBitmapTextureAtlas.load();
}
@Override
protected Scene onCreateScene()
{
this.mEngine.registerUpdateHandler(new FPSLogger());
Scene scene = new Scene();
scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));
final float centerX = (winWidth - mTiledTextureRegion.getWidth()) / 2;
final float centerY = (winHeight - mTiledTextureRegion.getHeight()) / 2;
//创建一个矩形
Rectangle rectangle = new Rectangle(centerX+100, centerY, 32, 32, this.getVertexBufferObjectManager());
rectangle.setColor(Color.RED);
//创建一个动画精灵
AnimatedSprite animatedSprite = new AnimatedSprite(centerX-100, centerY, mTiledTextureRegion, this.getVertexBufferObjectManager());
//动画每帧切换时间
animatedSprite.animate(300);
/*
* http://www.cnblogs.com/yujunyong/archive/2011/04/13/2015467.html
* 参数1:源因子,参数2:目标因子
* 为了渲染物体从远到近排列的效果,最好应用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)处理透明度。
* 下面实际上是调用了GL20的glBlendFunc
*/
animatedSprite.setBlendFunction(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
/*
* http://blog.sina.com.cn/s/blog_670f9b990100v677.html
* 下面的Modifier们很有意思。调用顺序是这样滴:LoopEntityModifier循环调用EntityModifier,
* 这里的EntityModifier又是个SequenceEntityModifier,它又一系列Modifier组成。
* 于是LoopEntityModifier把SequenceEntityModifier循环执行。
* 每次执行SequenceEntityModifier就显示Sequence start和Sequence end。
* 每个循环开始和结束又会显示Loop数。
* 使用的Modifier有RotationModifier,AlphaModifier,ScaleModifier,DelayModifier,ParallelEntityModifier。
* ParallelEntityModifier是并行的意思,顾名思义可以同时进行多种变化,如一边缩放一边旋转。
* 记得要registerEntityModifier。注意上面的setBlendFunction是Shape的方法,不是Entity的。
* Shape负责绘制实体。作者的类功能划分很清晰。
*/
//创建实体修改器,在业务线程中更新实体状态 (设置图片的形状变化)
//创建完精灵后,就给精灵添加修改器了,这个地方是比较灵活的,完全根据自己的需要来制作.
LoopEntityModifier loopEntityModifier = new LoopEntityModifier
(
new EntityModifierListener(), //EntityModifier的监听,通知LoopEntityModifier的开始和结束
4, //循环次数(-1,无限循环)
new LoopEntityModifierListener(), //循环的监听,通知每次循环的开始和结束
/*new SequenceEntityModifier //循环Modifier中组合的Modifier,按顺序执行(执行完一个Modifier再到下一个)
(
new RotationModifier(5f, 0f, 90f), //旋转(给定的时间和范围内) 5秒内从0度旋转到90度
new ScaleModifier(3f, 1f, 3f) //缩放(给定的时间和范围内) 3秒内从1倍旋缩放到原来的3倍
//里面也可以放一个并行执行
)*/
new ParallelEntityModifier //循环Modifier中组合的Modifier,并行执行(所有都同时执行)
(
new RotationModifier(5f, 0f, 90f), //旋转(给定的时间和范围内) 5秒内从0度旋转到90度
new ScaleModifier(3f, 1f, 3f) //缩放(给定的时间和范围内) 3秒内从1倍旋缩放到原来的3倍
)
);
//注册实体修改器
animatedSprite.registerEntityModifier(loopEntityModifier);
//deepCopy() 深度复制
rectangle.registerEntityModifier(loopEntityModifier.deepCopy());
scene.attachChild(animatedSprite);
scene.attachChild(rectangle);
return scene;
}
/**
* 设置屏幕大小
*/
private void setScreenDisplay()
{
DisplayMetrics outMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
winWidth = outMetrics.widthPixels;
winHeight = outMetrics.heightPixels;
}
/**
* 循环的监听,通知每次循环的开始和结束
*/
private class LoopEntityModifierListener implements ILoopEntityModifierListener
{
//(2)每次循环都执行
@Override
public void onLoopStarted(LoopModifier<IEntity> pLoopModifier, int pLoop, int pLoopCount)
{
EntityModfierActivity.this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
Toast.makeText(EntityModfierActivity.this, "LoopEntityModifierListener::onLoopStarted()", 1000).show();
System.out.println("LoopEntityModifierListener::onLoopStarted()");
}
});
}
//(3)每次循环都执行
@Override
public void onLoopFinished(LoopModifier<IEntity> pLoopModifier, int pLoop,
int pLoopCount)
{
EntityModfierActivity.this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
Toast.makeText(EntityModfierActivity.this, "LoopEntityModifierListener::onLoopFinished()", 1000).show();
System.out.println("LoopEntityModifierListener::onLoopFinished()");
}
});
}
}
/**
*实体修改器的监听,通知LoopEntityModifier的开始和结束
*/
private class EntityModifierListener implements IEntityModifierListener
{
//(1)只执行一次(通知LoopEntityModifier的开始)
@Override
public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem)
{
EntityModfierActivity.this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
Toast.makeText(EntityModfierActivity.this, "EntityModifierListener::onModifierStarted()", 1000).show();
System.out.println("EntityModifierListener::onModifierStarted()");
}
});
}
//(4)只执行一次(LoopEntityModifier的结束)
@Override
public void onModifierFinished(IModifier<IEntity> pEntityModifier, IEntity pEntity)
{
EntityModfierActivity.this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
Toast.makeText(EntityModfierActivity.this, "EntityModifierListener::onModifierFinished()", 1000).show();
System.out.println("EntityModifierListener::onModifierFinished()");
}
});
}
}
}