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()");
}
});
}
}
}
相关推荐
AndEngine下载 AndEngine
利用andengine2.0开发的一款小游戏,有兴趣的朋友可以研究下。
这使得开发者在遇到问题时可以直接从源码上找到答案,也能按照自己的需要对AndEngine进行修改和扩展。AndEngine的源码在github上托管[2]。 高效 AndEngine主要使用Java语言开发,但在大运算量的耗时功能时,...
andengine 中文文档
这使得开发者在遇到问题时可以直接从源码上找到答案,也能按照自己的需要对AndEngine进行修改和扩展。AndEngine的源码在github上托管[2]。 高效 AndEngine主要使用Java语言开发,但在大运算量的耗时功能时,...
AndEngine最新jar包 AndEngine最新jar包 AndEngine最新jar包
android andengine 代码 AnimatedSprite 实例 大家一起学习android andengine 游戏开发吧
AndEngine基于libGDX框架开发,使用OpenGL ES进行图形绘制,底层使用C++编写,通过JNI调用来实现,因此比较高效,功能强大。同时集成了Box2D物理引擎,因此能实现一些较为复杂的物理效果。在Rokon(另一个Android 2D游戏...
andengine源码,源码扩展及demo,供14个project
andEngine粒子系统使用之采用px文件的方式构建自己的粒子系统,源代码案例
AndEngine游戏开发示例 详情请链接至:http://blog.csdn.net/lan410812571/article/details/9716743
Andengine全套的git库,包括 AndEngineAugmentedRealityExtension AndEngineLiveWallpaperExtension AndEngineMODPlayerExtension AndEngineMultiplayerExtension AndEngineMultiTouchExtension (Merged into the '...
AndEngine实现自定义Button
AndEngine游戏引擎学习入门篇,如果你想学习Android游戏开发,请从这里开始!详细的注释
SVG文件在andEngine中的使用,源码详细,一看便明白使用方法。
andengine.jar 2013最新,andengine+8个拓展jar包,两个案例apk. 包括andengineExample基于GLES2
AndEngine游戏 DeliveryBoy 源代码,可以用来做AndEngine游戏实例教程进行参考
里面包含andengine.jar以及附属的8个jar扩展
这是andengine引擎官方提供的一个示例app,里面包含了引擎的许多方面的例子,例如物理系统、粒子系统、声音系统、碰撞检测等,效果特别绚。
Android开发中正确的AndEngine的jar包