转自:http://blog.sina.com.cn/s/blog_670f9b990100v677.html
Modifier & Animation
MovingBallExample:这个例子有误,试试改改。让球始终在画面中运动,碰到画面边缘则反向继续运动。把OnLoadScene里对PhysicsHandler的创建和初始化都拿到Ball的构造里。
并且加一行代码让脸动起来。this.animate(300);
EntityModifierExample:动画改变两个Entity。说明一下Shape.setBlendFunction函数。OpenGL用来设定原图元和目标图元混合的方式。参照http://www.cnblogs.com/yujunyong/archive/2011/04/13/2015467.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负责绘制实体。作者的类功能划分很清晰。
EntityModifierIrregularExample:名字翻译过来应该是非典型实体编辑器。书接上回,本例的Modifier设置了旋转中心和缩放中心,,而且用ScaleModifier的5参数构造体进行不对称缩放。
face1.setRotationCenter(0, 0);
face1.setScaleCenter(0, 0);
ScaleModifier(float pDuration, float pFromScaleX, float pToScaleX, float pFromScaleY, float pToScaleY)
另外发现个特点,画面绘制的顺序是按照scene.attachChild依次进行的,后attach的后绘制,所以显示在上层不被遮挡。先attach的先绘制会被后绘制的物体遮挡。
PathModifierExample:英雄沿着屏幕边缘跑来跑去。RepeatingSpriteBackground用来生成一个重复块的背景。这里代码有误,AssetBitmapTextureAtlasSource的构造参数pAssetPath应指明根目录gfx/background_grass.png才行。创建一个封闭Path,注册一个LoopEntityModifier并向构造体传递一个PathModifier来循环执行这个PathModifier。
PathModifier的最后一个参数我还不是很理解,IEaseModifier在构建Pathmodifier的时候被当作参数传递给控制每段Path运动的MoveModifier。每次更新调用onManagedUpdate时都会调用重载的onSetValues函数,设置实体的位置,具体调用在BaseSingleValueSpanModifier里。EaseSineInOut方法
public float getPercentage(final float pSecondsElapsed, final float pDuration) {
final float percentage = pSecondsElapsed / pDuration;//已经过的时间占总时间的百分比,取值[0,1],线性趋势。
return -0.5f * (FloatMath.cos(percentage * PI) - 1);//简化为(1-cos(PI* percentage))/2,取值[0,1],但变化趋势是余弦曲线。
}
可见这个函数用在这里是为了控制英雄在每段Path上的移动速度,并非匀速而是按余弦曲线递增的。还记得高中时的移动正余玄曲线么,什么都不白学啊,谢谢当年的代数老师。
AnimatedSpritesExample:http://blog.sina.com.cn/s/blog_670f9b990100v297.html
EaseFunctionExample:其实应该先看这个例子在学PathModifier。如果运行出错,恭喜你,你得引擎代码里有bug。
出错位置在BaseGameActivity的getFontManager()里,改成return this.mEngine.getFontManager();,否则死循环的递归调用当然会栈溢出了。
本例演示了各种MoveModifier的EaseFunction的用法,控制线性非线性的运动。EaseFunction同样可以用在别的Modifier,控制各种变化的速度。翻译几个单词——Linear:线性的,Cubic:立方,Quad:平方,Exponential:指数,elastic:伸缩的,Quart:4次幂,Quint:5次幂。
previousSprite.getTextureRegion().setFlippedHorizontal(true);水平翻转Sprite
本例的核心内容在reanimate方法:face.clearEntityModifiers()清楚当前绑定的Modifier。这个face是final的所以循环里一定要这么做。
MoveModifier的最后一个参数就是EaseFunction了。而且可以看到3个sprite是同步运动的。AndEngine引擎自动控制着运动的步进不需要一个Sprite一个线程。
Rotation3DExample:关键词:近点切平面和远点切平面。3维视域控制名词,3维场景中,此两平面间的部分被显示,其余被剪切。http://www.gisall.com/html/02/25502-5468.html。
NearZClippingPlane,FarZClippingPlane便是表示与Z轴垂直的两个剪切平面坐标。
本例的face Sprite重载了Entity的applyRotation函数处理旋转。
GLHelper.disableCulling(pGL);关闭openGL的culling,culling会不显示物体的背面,顶点顺时针排列的面为正面。
pGL.glTranslatef函数移动坐标原点到指定点。openGL的默认原点和Android的不同。
pGL.glRotatef沿某个轴旋转某角度。此后再次调用pGL.glTranslatef复位原点。
本例用一个LoopEntityModifier循环RotationModifier