1. 位置:Modifier_example --> Modifier
2. 類名:Modifier
(1).使用modifier 可以做出一些精靈的特效,旋轉,傾斜,透明,放大,縮小等等。常用的modifier如下,
<1>. AlphaModifier 透明度修改器
<2>. ColorModifier 顏色修改器
<3>. CubicBezierCurveMoveModifier 三次方貝塞爾曲線曲線修改器
<4>. DelayModifier 延遲修改器
<5>. FadeInModifier 淡入修改器
<6>. FadeOutModifier 淡出修改器
<7>. JumpModifier 跳躍修改器
<8>. MoveByModifier 移動修改器(當前位置開始)
<9>. MoveModifier 移動修改器(從某個點到另外一個點)
<10>. MoveXModifier 移動X修改器
<11>. MoveYModifier 移動Y修改器
<12>. PathModifier 路徑修改器
<13>. QuadraticBezierCurveMoveModifier 二次貝塞爾曲線修改器
<14>. RotationAtModifier 旋轉修改器(需傳入旋轉中心點)
<15>.RotationByModifier 旋轉修改器(只需傳入旋轉到的目標角度)
<16>. RotationModifier旋轉修改器(從某個角度到另外一個角度)
<17>. ScaleAtModifier縮放修改器(需傳入縮放中心點)
<18>. ScaleModifier 縮放修改器(從縮放多少倍數到另外一個倍數)
<19>. SkewModifier 傾斜修改器
<20>. SkewXModifier 傾斜X修改器
<21>. SkewYModifier 傾斜Y修改器
<22>. LoopEntityModifier循環容器修改器(使某個動作修改器循環實行)
<23>. SequenceEntityModifier序列容器修改器(使某幾個動作修改器依次實行)
<24>. ParallelEntityModifier並行實體容器修改器(使某幾個動作修改器同時實行)
(2).以下是使用modifier的例子:
/**普通Modifier用法*/
private void setGeneralModifier() {
//畫藍色背景 填滿屏幕
Rectangle rectangle = new Rectangle(0, 0, getWidth(), getHeight(), getVertexBufferObjectManager());
rectangle.setColor(0.09804f, 0.6274f, 0.8784f);
this.attachChild(rectangle);//加入場景
AnimatedSprite face_rect = new AnimatedSprite(gap*1, 150, Regions.FACE_RECTANGLE, getVertexBufferObjectManager());
this.attachChild(face_rect);
//2秒內 從0度轉到360度
RotationModifier rotation_mod = new RotationModifier(2, 0, 360);
//註冊一個Modifier(修改器)在face_rect中
face_rect.registerEntityModifier(rotation_mod);
}
/**安先後順序執行Modifier用法*/
private void setSequenceEntityModifier(){
AnimatedSprite face_rect = new AnimatedSprite(gap*2, 150, Regions.FACE_RECTANGLE, getVertexBufferObjectManager());
this.attachChild(face_rect);
//2秒內 從0度轉到360度
RotationModifier rotation_mod = new RotationModifier(2, 0, 360);
//1秒內 從1倍放大到2倍
ScaleModifier scale_mod = new ScaleModifier(1, 1, 2);
//定製兩個Modifier按先後順序執行
SequenceEntityModifier sequence_mod = new SequenceEntityModifier(rotation_mod, scale_mod);
//註冊一個Modifier(修改器)在face_rect中
face_rect.registerEntityModifier(sequence_mod);
}
/**循環執行的Modifier*/
private void setLoopEntityModifier(){
AnimatedSprite face_rect = new AnimatedSprite(gap*3, 150, Regions.FACE_RECTANGLE, getVertexBufferObjectManager());
this.attachChild(face_rect);
//2秒內 從0度轉到360度
RotationModifier rotation_mod = new RotationModifier(2, 0, 360);
//1秒內 從1倍放大到2倍
ScaleModifier scale_mod = new ScaleModifier(1, 1, 2);
//延時0.5s
DelayModifier delay_mod = new DelayModifier(0.5f);
//Modifier按先後順序執行
SequenceEntityModifier sequence_mod = new SequenceEntityModifier(rotation_mod, delay_mod, scale_mod);
//Modifier 循環執行
LoopEntityModifier loop_mod = new LoopEntityModifier(sequence_mod);
//註冊一個Modifier(修改器)在face_rect中
face_rect.registerEntityModifier(loop_mod);
}
/**Modifier 加入監聽器*/
private void setModifierListener(){
AnimatedSprite face_rect = new AnimatedSprite(gap*4, 150, Regions.FACE_RECTANGLE, getVertexBufferObjectManager());
this.attachChild(face_rect);
//2秒內 從0度轉到360度
RotationModifier rotation_mod = new RotationModifier(2, 0, 360);
//IEntityModifierListener Modifier監聽器,監聽開始、結束
LoopEntityModifier loop_mod = new LoopEntityModifier(rotation_mod, 5, new IEntityModifierListener() {
@Override
public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem) {
//pItem = which will be register
System.out.println("onModifierStarted");
pItem.setVisible(true);
}
@Override
public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) {
//pItem = which will be register
System.out.println("onModifierFinished");
pItem.setVisible(false);
}
});
//註冊一個Modifier(修改器)在face_rect中
face_rect.registerEntityModifier(loop_mod);
}
/**一個並行Modifier*/
private void setParallelEntityModifier(){
AnimatedSprite face_ball = new AnimatedSprite(gap*1, 300, Regions.FACE_BALL, getVertexBufferObjectManager());
//1秒內 從0度轉到360度
RotationModifier rotation_mod = new RotationModifier(1, 0, 360);
//1秒內 從1倍放大到2倍
ScaleModifier scale_mod = new ScaleModifier(1, 1, 2);
//1秒內 透明度從1到0
AlphaModifier alpha_mod = new AlphaModifier(1, 1, 0);
//並行 Modifier
ParallelEntityModifier parallel_mod = new ParallelEntityModifier(rotation_mod,scale_mod,alpha_mod);
//循環 Modifier
LoopEntityModifier loop_mod = new LoopEntityModifier(parallel_mod);
//註冊 Modifier
face_ball.registerEntityModifier(loop_mod);
//加入場景
this.attachChild(face_ball);
}
private void irregular_EntityModifiers(){
final AnimatedSprite face1 = new AnimatedSprite(gap*2, 300, Regions.FACE_BALL, this.getVertexBufferObjectManager());
face1.setRotationCenter(0, 0);//設置左上角爲旋轉中心點
face1.setScaleCenter(0, 0);//設置左上角爲放大中心點
face1.animate(100);
final AnimatedSprite face2 = new AnimatedSprite(gap*3, 300, Regions.FACE_RECTANGLE, this.getVertexBufferObjectManager());
face2.animate(100);
final SequenceEntityModifier entityModifier = new SequenceEntityModifier(
new IEntityModifierListener() {
@Override
public void onModifierStarted(final IModifier<IEntity> pModifier, final IEntity pItem) {
System.out.println("Sequence started.");
}
@Override
public void onModifierFinished(final IModifier<IEntity> pEntityModifier, final IEntity pEntity) {
System.out.println("Sequence finished.");
}
},
//第一步:2秒 X從1.0縮小到0.75,Y從1.0放大到2.0
new ScaleModifier(2, 1.0f, 0.75f, 1.0f, 2.0f),
//第二步:2秒 X從0.75放大到2.0,Y從2.0縮小到1.25
new ScaleModifier(2, 0.75f, 2.0f, 2.0f, 1.25f),
//第三步:放大並旋轉
new ParallelEntityModifier(
new ScaleModifier(3, 2.0f, 5.0f, 1.25f, 5.0f),//3秒 X從2.0放大到5.0,Y從1.25放大到5.0
new RotationByModifier(3, 180)//3秒 旋轉到180度
),
//第四步:縮小並旋轉
new ParallelEntityModifier(
new ScaleModifier(3, 5, 1),//3秒 從5縮小到1
new RotationModifier(3, 180, 0)//3秒 旋轉從180到0
)
);
//註冊 entityModifier 到face1
face1.registerEntityModifier(entityModifier);
//拷貝出一個 entityModifier 註冊到face2
face2.registerEntityModifier(entityModifier.deepCopy());
this.attachChild(face1);//加入場景
this.attachChild(face2);//加入場景
/* Create some not-modified sprites, that act as fixed references to the modified ones. */
/* 加入兩個沒有做任何動作的精靈作爲參考 */
final AnimatedSprite face1Reference = new AnimatedSprite(face1.getX(), face1.getY(), face1.getTiledTextureRegion(), this.getVertexBufferObjectManager());
final AnimatedSprite face2Reference = new AnimatedSprite(face2.getX(), face2.getY(), face2.getTiledTextureRegion(), this.getVertexBufferObjectManager());
this.attachChild(face1Reference);
this.attachChild(face2Reference);
}