1.AndEngine的动画修改器(modifier)有很多种,常用的有一下几种:
1.AlphaModifier:透明度修改器,有以下几种构造:
public AlphaModifier(final float pDuration, final float pFromAlpha, final float pToAlpha) { this(pDuration, pFromAlpha, pToAlpha, null, EaseLinear.getInstance()); } public AlphaModifier(final float pDuration, final float pFromAlpha, final float pToAlpha, final IEaseFunction pEaseFunction) { this(pDuration, pFromAlpha, pToAlpha, null, pEaseFunction); } public AlphaModifier(final float pDuration, final float pFromAlpha, final float pToAlpha, final IEntityModifierListener pEntityModifierListener) { super(pDuration, pFromAlpha, pToAlpha, pEntityModifierListener, EaseLinear.getInstance()); } public AlphaModifier(final float pDuration, final float pFromAlpha, final float pToAlpha, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { super(pDuration, pFromAlpha, pToAlpha, pEntityModifierListener, pEaseFunction); } protected AlphaModifier(final AlphaModifier pAlphaModifier) { super(pAlphaModifier); }
pDuration代表动画修改周期,就是就是完成整个透明度变化所要的时间,单位为秒.
pFromAlpha代表起始透明度
pToAlpha代表目标透明度
2.ScaleModifier,比例修改器.主要是对动画的大小比例进行修改:
public ScaleModifier(final float pDuration, final float pFromScale, final float pToScale) { this(pDuration, pFromScale, pToScale, null, EaseLinear.getInstance()); } public ScaleModifier(final float pDuration, final float pFromScale, final float pToScale, final IEaseFunction pEaseFunction) { this(pDuration, pFromScale, pToScale, null, pEaseFunction); } public ScaleModifier(final float pDuration, final float pFromScale, final float pToScale, final IEntityModifierListener pEntityModifierListener) { this(pDuration, pFromScale, pToScale, pFromScale, pToScale, pEntityModifierListener, EaseLinear.getInstance()); } public ScaleModifier(final float pDuration, final float pFromScale, final float pToScale, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { this(pDuration, pFromScale, pToScale, pFromScale, pToScale, pEntityModifierListener, pEaseFunction); } public ScaleModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY) { this(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, null, EaseLinear.getInstance()); } public ScaleModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY, final IEaseFunction pEaseFunction) { this(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, null, pEaseFunction); } public ScaleModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY, final IEntityModifierListener pEntityModifierListener) { super(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, pEntityModifierListener, EaseLinear.getInstance()); } public ScaleModifier(final float pDuration, final float pFromScaleX, final float pToScaleX, final float pFromScaleY, final float pToScaleY, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { super(pDuration, pFromScaleX, pToScaleX, pFromScaleY, pToScaleY, pEntityModifierListener, pEaseFunction); } protected ScaleModifier(final ScaleModifier pScaleModifier) { super(pScaleModifier); }
pDuration代表动画修改周期,就是就是完成整个变化所要的时间,单位为秒.
pFromScale代表起始透大小比例
pToScale代表目标大小比例
此外,还有DelayModifier,ColorModifier,MoveModifier等等.
另外还有一些组合式的修改器,如SequenceEntityModifier和ParallelEntityModifier.这类修改器的一个显著特点就是可以同时
对几个样式进行修改而达到想要的效果
2.创建项目
由于我的手机是htc-g12.分辨率为800*480,其他手机的分辨率也可以选择更加合适的分辨率,只要尺寸比例一致就可以了.因为我使用到RatioResolutionPolicy
进行屏幕的绘制.它可以自动缩放到屏幕合适的大小.
private static final String TAG = "Season"; private static final int CAMERA_WIDTH = 800; private static final int CAMERA_HEIGHT = 480; private Camera mCamera; private Scene mScene; private RepeatingSpriteBackground background; private TiledTextureRegion mFaceTextureRegion;
在onCreateEngineOptions()处设置camera和EngineOption选项
@Override public EngineOptions onCreateEngineOptions() { // TODO Auto-generated method stub mCamera = new Camera(0,0,CAMERA_WIDTH,CAMERA_HEIGHT); EngineOptions mEngineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE_SENSOR, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mCamera); return mEngineOptions; }
需要说明的几个参数是有关EngineOptions的:
回到EngineOptions的源代码构造函数为:
public EngineOptions(final boolean pFullscreen, final ScreenOrientation pScreenOrientation, final IResolutionPolicy pResolutionPolicy, final Camera pCamera) { this.mFullscreen = pFullscreen; this.mScreenOrientation = pScreenOrientation; this.mResolutionPolicy = pResolutionPolicy; this.mCamera = pCamera; }
一目了然:
如果要全屏显示,pFullscreen就应该为true.
pScreenOrientation是一个枚举类型的数据
public enum ScreenOrientation { // =========================================================== // Elements // =========================================================== /** The app will be fixed in its default Landscape mode. */ LANDSCAPE_FIXED, /** The app will automatically rotate between the Landscape modes, depending on the orientation of the device. */ LANDSCAPE_SENSOR, /** The app will be fixed in its default Portrait mode. */ PORTRAIT_FIXED, /** The app will automatically rotate between the Portrait modes, depending on the orientation of the device. */ PORTRAIT_SENSOR; }
pResolutionPolicy是屏幕的绘制策略,常用的有这几种:FillResolutionPolicy,FixedResolutionPolicy,RatioResolutionPolicy,RelativeResolutionPolicy,从名字
就可以看出各种策略的大致用途了.
在onCreateResources处,是游戏引擎在创建资源(图片,声音等)进行加载用.
public void onCreateResources( OnCreateResourcesCallback pOnCreateResourcesCallback) throws Exception { // TODO Auto-generated method stub this.background = new RepeatingSpriteBackground(CAMERA_WIDTH, CAMERA_HEIGHT, getTextureManager(), AssetBitmapTextureAtlasSource.create( this.getAssets(), "background.png"), getVertexBufferObjectManager()); BitmapTextureAtlas mTexture = new BitmapTextureAtlas(getTextureManager(),64,32,TextureOptions.BILINEAR_PREMULTIPLYALPHA); mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mTexture, this, "face_box_tiled.png", 0, 0,2,1); /** * 参数说明: * mTexure是在内存中放置贴图资源用的,64,32是图片要求的宽和高,必须是2的n次方大小.如:2,4,8,16,32,64,128,512,1024.... * 并且要比原图的宽高要大 * * mFaceTextureRegion相当于从mTexure中扣图,因为mTexure是由很多图集组成的,要从中截取一片出来 * 0,0代表截图的top,right坐标(起点坐标),2和1分别代表贴图中一张存在2列1行 * */ mTexture.load(); pOnCreateResourcesCallback.onCreateResourcesFinished(); }
onCreateScene是整个游戏的精华之处,所有游戏的控制部分都在这里实现
首先创建场景,布置好背景
mScene = new Scene(); mScene.setBackground(background);
final float centerX = (CAMERA_WIDTH - mFaceTextureRegion.getWidth()) / 2;//计算贴图的中心坐标 final float centerY = (CAMERA_HEIGHT - mFaceTextureRegion.getHeight()) / 2;
在本例程中,主要创建一个红色的外形和一个贴图动画:
final Rectangle rect = new Rectangle(centerX+100,centerY,32,32,getVertexBufferObjectManager()); rect.setColor(1, 0, 0); final AnimatedSprite face = new AnimatedSprite(centerX - 100, centerY, mFaceTextureRegion, getVertexBufferObjectManager()); face.setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 创建完精灵后,就给精灵添加修改器了,这个地方是比较灵活的,完全根据自己的需要来制作. final LoopEntityModifier shapeModifier = new LoopEntityModifier(new IEntityModifierListener(){ @Override public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem) { // TODO Auto-generated method stub Log.d(TAG,"LoopEntityModifier started!"); } @Override public void onModifierFinished( IModifier<IEntity> pModifier, IEntity pItem) { // TODO Auto-generated method stub Log.d(TAG,"LoopEntityModifier finished!"); } }, -1, //无限循环 new ILoopEntityModifierListener(){ @Override public void onLoopStarted( LoopModifier<IEntity> pLoopModifier, int pLoop, int pLoopCount) { // TODO Auto-generated method stub Log.d(TAG,"ILoopEntityModifierListener started!"); } @Override public void onLoopFinished( LoopModifier<IEntity> pLoopModifier, int pLoop, int pLoopCount) { //Toast.makeText(ShapeModifiers.this, "Loops remaining: " + pLoop, Toast.LENGTH_SHORT).show(); // TODO Auto-generated method stub Log.d(TAG,"ILoopEntityModifierListener finished!"); } }, new SequenceEntityModifier(new RotationModifier(1, 0, 90), new AlphaModifier(5, 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)){ }));
LoopEntityModifier是一个循环修改器,第三个参数就是循环的次数,-1代表无限重复,从源代码中可以看出各个参数的作用
public class LoopEntityModifier extends LoopModifier<IEntity> implements IEntityModifier { // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== // =========================================================== // Constructors // =========================================================== public LoopEntityModifier(final IEntityModifier pEntityModifier) { super(pEntityModifier); } public LoopEntityModifier(final IEntityModifier pEntityModifier, final int pLoopCount) { super(pEntityModifier, pLoopCount); } public LoopEntityModifier(final IEntityModifier pEntityModifier, final int pLoopCount, final ILoopEntityModifierListener pLoopModifierListener) { super(pEntityModifier, pLoopCount, pLoopModifierListener); } public LoopEntityModifier(final IEntityModifier pEntityModifier, final int pLoopCount, final IEntityModifierListener pEntityModifierListener) { super(pEntityModifier, pLoopCount, pEntityModifierListener); } public LoopEntityModifier(final IEntityModifierListener pEntityModifierListener, final int pLoopCount, final ILoopEntityModifierListener pLoopModifierListener, final IEntityModifier pEntityModifier) { super(pEntityModifier, pLoopCount, pLoopModifierListener, pEntityModifierListener); } protected LoopEntityModifier(final LoopEntityModifier pLoopEntityModifier) throws DeepCopyNotSupportedException { super(pLoopEntityModifier); } @Override public LoopEntityModifier deepCopy() throws DeepCopyNotSupportedException { return new LoopEntityModifier(this); } // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== // =========================================================== // Methods // =========================================================== // =========================================================== // Inner and Anonymous Classes // =========================================================== public interface ILoopEntityModifierListener extends ILoopModifierListener<IEntity> { // =========================================================== // Constants // =========================================================== // =========================================================== // Methods // =========================================================== } }
最后要做的工作就是将修改器绑定到精灵,将精灵放置到场景中
face.registerEntityModifier(shapeModifier); rect.registerEntityModifier(shapeModifier.deepCopy()); mScene.attachChild(face); mScene.attachChild(rect); pOnCreateSceneCallback.onCreateSceneFinished(mScene);
3.制作完成的效果如下图所示
效果解释:两个精灵在5秒的时间内慢慢变为透明
在1秒时间内变为完全不透明
尺寸在2秒内变为0.5倍大小
暂停等待0.5秒
在三秒内完成由0.5倍大小到5倍大小渐变,同时旋转90度
在三秒内由5被大小变为一倍大小,同时由180度转回0度
本例子源代码:http://download.csdn.net/detail/cen616899547/4702761
我是10月13日参加2013百度校招在哈工大深研院的笔试,应聘的是移动软件研发岗位。笔试题目详见《求职那些事十》一文,笔试的内容主要包括数据结构、算法设计、面向对象思想、数据库设计、编程语言等。
10月15日参加百度的第一面,百度第一面的内容与体会详见《求职那些事十二之百度一面》一文。整个面试流程首先是面试官围绕笔试的试卷询问我的解答方法与思路,然后围绕我的简历提问,包括课题项目的简介、成教上课的收获、Android系统框架、Activity的生命周期,最后就是我的提问。总体来说,一面是在一种轻松地氛围下开始和结束,并且自我感觉答得还不错。
10月16日参加百度的第二面,因为我表现的不好,整个面试过程的时间很短。面试官的所问的问题不仅很细微,也很深入。比方说,什么是快速排序、什么是堆排序?设计模式的内容?Java语言的接口和类、同步与互斥?Android五大布局?课题项目简介?面对这些问题,我要么不知道,要么就是一知半解、要么就是回答不清楚、组织不条理、论述不完整。二面结束后,我知道自己肯定没戏了。
10月18日早上,百度HR给我电话,告知我二面没有通过,问我是否愿意调到开发测试岗位,我说我愿意。下午3点在一家酒店参加了面试。整个面试过程持续了50分钟,面试官的问题包括:1)你已工作了,为什么还要读研?2)你对开发测试怎么认识与理解的?3)写单链表倒置的代码?4)你熟悉那些语言,代码量有多大?5)谈谈你的课题?6)你觉得你做开发测试的最大问题是什么?7)若某一天,百度的流量突然倍增一倍,请分析下原因?8)什么是虚函数?9)LinuxOS,如何定时设置运行程序?10)LinuxOS,使用C语言写了一段代码读入文件并在屏幕上显示文件,请写出测试用例?11)什么是压力测试,什么是性能测试?我非常珍惜这次机会,对于面试官的问题,我都认真而细心地回答。
接下来的日子,就是等候这结果。有段时日,非常关注。我想,应该是自己太想进入这家公司了,所以才会非常在意任何一点与它相关的信息。直到今日,才知道自己没有通过。换句话说,就是百度校招被刷了。虽说有点失落,但也逐渐平静了。我问自己,为什么会失败?我找到了三个原因,原因一,我的软件研发的知识不强大,包括数据结构、算法设计、设计模式、软件工程和程序语言。原因二,我的推销能力不到位,主要表现在答问与提问;原因三,我的准备工作不充分,主要表现在没有集中所有时间与精力聚焦攻关。既然找到了原因,我想后续的日子里,我应该学习和具备更有用的知识,增强和提升自身的表达能力,做好更充分地准备迎接新的挑战。我相信,“失败是成功之母,失败是为了下一回成功!”
温馨提示:实力是王道,学习是根本,分享是追求,给予是幸福。
火红的深秋10月,万众瞩目的第三届中国移动开发者大会于19日在北京国家会议中心如期举行。本次大会邀请到了诸多互联网巨头公司中相关项目负责人及移动互联先驱精英,百家争艳齐聚一堂,共同探讨在移动互联网高速发展的2012年中,从规划到决策,从产品到市场,从企业到用户,从投资到产业链的方方面面的经验与困难,与到场的数千名移动APP开发团队或个人分享了这机遇与挑战并存的移动开发主流时代。
笔者在两天的大会议程中,着重观察了今年几个比较惹眼的话题:首先,是如同雨后春笋般在上海、北京等IT一线城市成立的小型创新移动应用开发公司或团队。这些公司规模有限,前期投入资本不多,产品也不多,甚至一两种也有之。但其在如今已经日趋成熟的移动市场领域却形成了一股不可忽视的力量。其次,在20日笔者参与的产品与设计分论坛中,诸位来自北美著名高校或IT巨头企业的产品监理们提出了以用户体验为主导方向的产品设计蓝图,这些设计通过深入体贴的人机交互,想人所想,行人所期,使得产品在市场上脱颖而出,硬的消费者认可。最后,在19日的全体大会中,众位巨头都提到的移动互联网货币化的期待与愿景,从目前的发展趋势看来,移动市场虽然面临着诸多困难,如竞争激烈,盈利困难等等,但其拥有广阔的市场前景,开放共赢或许会成为下一步盈利的出路之一。
详细看来,从当天的一些站台的情况可以看出,目前的创新性APP应用及其开发团队有着如下特点:关注具有代表性需求的特殊群体开发应用、有孵化企业扶植或者资金走向简单,具有一定的微创新特性。例如,本次的创新应用展中,以婴幼儿早教类APP为代表的消费者导向应用和以做数据分析和反馈统计大红大紫的友盟为代表的面向开发者和公司需求导向的应用成为了今年的亮点。这些具有较强针对性,面向特殊人群市场并抢得先机的开发者们已经打响了开拓战的第一枪。另外,我们发现一些小团队的背后,都有着像创新工场这类有影响力和财力支持的孵化公司的影子。这些小到3人的团队,凭借着优秀的创意和不懈的努力赢得了孵化企业的青睐和注资,而就展会的现场表现看来,其锐意的想法和活泼开放的发展态度也赢得了一些合作方的赞赏。同时,笔者在同一些创意团队的交流中得知,这些团队大多是在产品设计和市场方面做足了功夫,也就是说,在迎合市场需求和消费者心理的前提下,充分设计产品的每个细节,以用户的角度考虑问题,在一些人性化的设计理念上推陈出新,博得了关注。
而在笔者一直持续关注的产品与设计方面,今年大家的讨论视角则由如何吸引用户眼球向用户体验的角度转变着。美国斯坦福大学助理教授,Smule创始人兼首席创意师王戈先生在20日举行的产品与设计论坛中,延续了在前一天的全体大会上技惊四座的数字乐器APP表演。其代表应用 Ocarina ,Magic Piano以及声感打火机,体感吉他等都给在场观众留下了极为深刻的印象。另外,来自三星中国设计研究所用户体验中心的林敏则提出了许多微创新方面的独到见解:创新无论是对于刚刚起步的创意公司还是大型企业,都是严峻的研究课题与发展需求,需要投入很高的研究成本并承担风险,但是,对于已经成型的产品,这里指的是自主研发并良好发展的产品,进行细节和客户需求体验方面的创新,却可以收获意想不到的效果,例如在网站的销售和注册环节的变通,可以为企业带来额外的数百万元的收益,而来自上海frog(青蛙设计)的Ryan Rowe则对于跳脱于互联网之外的网络销售和产品设计有着独到的见解,其对于人体工学与移动设备及市场的结合使得虚拟市场成为了现实,并在上海等地率先试点,取得惊艳的效果。
本次的移动开发者大会较去年最大的区别就是,所有人对于移动市场的期待持续升温,但同时,也开始理性面对其中涌现出来的方方面面的问题:商业模式不清,盈利困难,广告收入乏力等,对此,李开复,马化腾等业界巨头都给出了自己独到的见解,总的看来,似乎龙头企业都在寻求互利共赢,以开放合作的态度来处理目前以至于未来在市场方面出现的各种问题。我们希望这种态度能够持续下去,并同时寻找更加适合中小企业及团队的生存之道。
乱花渐欲迷人眼,浅草才能没马蹄。虽然北京已是满山红叶,但移动开发领域的春天却真正的向广大的开发者们敞开了怀抱。在用户体验为导向的新兴浪潮中,让我们共同期待移动开发的明天更加绚丽多彩