AndEngine Example(7):EntityModifierExample

来源:互联网 发布:linux线程优先级设置 编辑:程序博客网 时间:2024/05/17 00:56

目标:

1. 了解修饰符Modifier

2. 学习透明度变化(AlphaModifier)

3. 学习缩放变化(ScaleModifier)

4. 学习延时(DelayModifier)

5. 学习旋转(RotationModifier)

6. 学习顺序使用修饰符(SequenceEntityModifier)

7. 学习并行使用修饰符(ParallelEntityModifier)

8. 理解如何从一张图上获取多个纹理createTiledFromAsset

------------------------------------------------------------------------

注意,你需要更换图片资源,才能得到相应的效果。


package org.andengine.examples;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.AlphaModifier;import org.andengine.entity.modifier.DelayModifier;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.RotationByModifier;import org.andengine.entity.modifier.RotationModifier;import org.andengine.entity.modifier.ScaleModifier;import org.andengine.entity.modifier.SequenceEntityModifier;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.modifier.IModifier;import org.andengine.util.modifier.LoopModifier;import android.opengl.GLES20;import android.widget.Toast;/** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga * * @author Nicolas Gramlich * @since 11:54:51 - 03.04.2010 */public class EntityModifierExample extends SimpleBaseGameActivity {// ===========================================================// Constants// ===========================================================private static final int CAMERA_WIDTH = 720;private static final int CAMERA_HEIGHT = 480;// ===========================================================// Fields// ===========================================================private BitmapTextureAtlas mBitmapTextureAtlas;private TiledTextureRegion mFaceTextureRegion;// ===========================================================// Constructors// ===========================================================// ===========================================================// Getter & Setter// ===========================================================// ===========================================================// Methods for/from SuperClass/Interfaces// ===========================================================@Overridepublic EngineOptions onCreateEngineOptions() {final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);}@Overridepublic void onCreateResources() {BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");this.mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 64, 32, TextureOptions.BILINEAR);this.mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.mBitmapTextureAtlas, this, "face_box_tiled.png", 0, 0, 2, 1);this.mBitmapTextureAtlas.load();}@Overridepublic Scene onCreateScene() {this.mEngine.registerUpdateHandler(new FPSLogger());final Scene scene = new Scene();scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));final float centerX = (CAMERA_WIDTH - this.mFaceTextureRegion.getWidth()) / 2;final float centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion.getHeight()) / 2;final Rectangle rect = new Rectangle(centerX + 100, centerY, 32, 32, this.getVertexBufferObjectManager());rect.setColor(1, 0, 0);final AnimatedSprite face = new AnimatedSprite(centerX - 100, centerY, this.mFaceTextureRegion, this.getVertexBufferObjectManager());face.animate(100);face.setBlendFunction(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);final LoopEntityModifier entityModifier =new LoopEntityModifier(new IEntityModifierListener() {@Overridepublic void onModifierStarted(final IModifier<IEntity> pModifier, final IEntity pItem) {EntityModifierExample.this.runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(EntityModifierExample.this, "Sequence started.", Toast.LENGTH_SHORT).show();}});}@Overridepublic void onModifierFinished(final IModifier<IEntity> pEntityModifier, final IEntity pEntity) {EntityModifierExample.this.runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(EntityModifierExample.this, "Sequence finished.", Toast.LENGTH_SHORT).show();}});}},2,new ILoopEntityModifierListener() {@Overridepublic void onLoopStarted(final LoopModifier<IEntity> pLoopModifier, final int pLoop, final int pLoopCount) {EntityModifierExample.this.runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(EntityModifierExample.this, "Loop: '" + (pLoop + 1) + "' of '" + pLoopCount + "' started.", Toast.LENGTH_SHORT).show();}});}@Overridepublic void onLoopFinished(final LoopModifier<IEntity> pLoopModifier, final int pLoop, final int pLoopCount) {EntityModifierExample.this.runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(EntityModifierExample.this, "Loop: '" + (pLoop + 1) + "' of '" + pLoopCount + "' finished.", Toast.LENGTH_SHORT).show();}});}},new SequenceEntityModifier(//new RotationModifier(1, 0, 90),new AlphaModifier(2, 1, 0),new AlphaModifier(1, 0, 1),new ScaleModifier(2, 1, 0.5f),new DelayModifier(0.5f),new ParallelEntityModifier(new ScaleModifier(3, 0.5f, 5),new RotationByModifier(3, 90)),new ParallelEntityModifier(new ScaleModifier(3, 5, 1),new RotationModifier(3, 180, 0))));face.registerEntityModifier(entityModifier);rect.registerEntityModifier(entityModifier.deepCopy());scene.attachChild(face);scene.attachChild(rect);return scene;}// ===========================================================// Methods// ===========================================================// ===========================================================// Inner and Anonymous Classes// ===========================================================}


------------------------------------------------------------------------------------------

关于修饰符本身的例子过于复杂:

所以我们分为几步来理解它。

(一)单一的修饰符

修改:

face.registerEntityModifier(entityModifier);rect.registerEntityModifier(entityModifier.deepCopy());

face.registerEntityModifier(new AlphaModifier(10, 1, 0));rect.registerEntityModifier(new AlphaModifier(10, 0, 1));
然后运行,

发现矩形从无到有,而图片从有到无。这说明了这两个修饰符用于控制了透明度的变化。



(二)顺序执行修饰符

还原,然后修改

face.registerEntityModifier(entityModifier);

SequenceEntityModifier entityModifier1 = new SequenceEntityModifier(new ScaleModifier(2, 1, 0.5f),new DelayModifier(1.5f),new ScaleModifier(2,  0.5f, 2),new DelayModifier(1.5f),new ScaleModifier(2, 2, 0.5f));face.registerEntityModifier(entityModifier1);
观察图片的变化,可以发现它是按照我们指定的顺序来进行缩放(ScaleModifier)的,并做了适量的停滞(DelayModifier)

使用顺序描述符,可以使得按照我们的需求来进行修饰符的排列。


(三) 并行修饰符

使用并行修饰符,可以使得过个动作同时进行,例如旋转的同时进行缩放,且透明度发生变化

修改上文中的entityModifier1为:

ParallelEntityModifier entityModifier1 = new ParallelEntityModifier(new ScaleModifier(5, 1, 4),new RotationModifier(5, 0, 180),new AlphaModifier(5, 1, 0));

观察图片的变化,发现多种效果得以同时作用,这便是并行修饰符(ParallelEntityModifier)的作用。


(四) 循坏修饰符

还原成最初的模样

使用LoopEntityModifier(IEntityModifierListener,int,ILoopEntityModifierListener,IEntityModifier)构造函数

可通过将第一个或者第三个参数设为null,发现其中的区别

para1:可监听整个修饰符修饰对象的开始和结束

para2:重复的次数

para3:每一轮开始和结束的回调

para4:实际的描述符


0 0
原创粉丝点击