上一篇地址:http://blog.csdn.net/lan410812571/article/details/9716743
六、场景Scene
场景Scene是Entity的子类,在AndEngine中,该类用来创建游戏中的场景。每个Scene对象都有背景,默认的背景是黑色色块。可以通过setBackground(final IBackgruond pBackground)来修改。
构造器:
Scene(final int pLayerCount)
其参数为图层数,注意的是,Sence对象一旦被创建,其图层数就不可改变。所以如果要在游戏中加入新图层,就要新的数值重新实例化Snece对象。
Layer图层:layer类是Entity类的子类,用来组织Scene类所需的图形,图层叠加来组成场景。(例如近处图层移动快一点,远处图层移动慢一点,可以形成景深的效果)
子Scene对象:
Scene对象可以有一个非layer类型的子对象,管理方法:
void setChildrenScene(final Scene pChildrenScene)
Scene getChildrenScene()
上级Scene对象:
Scene对象可以有一个上级Scene对象,当把一个scene对象作为子对象加入其他scene时,其上级scene对象会被自动设置。当然,AndEngin也一个管理的方法void setParentScene(final Scene pParentscene)
Scene对象有一套相应触摸事件的系统,在之后的会详细讲到。有些Scene类的子类是为了构建特殊场景。
1.CameraScene
CameraScene(final int pLayerCount ,finl Camera pCamera)
在一般的Scene的基础上加入了摄像头功能
2.MenuScene
MenuScene(final Camera pCamera,final IOnMenuItemClickListener pOnMenuItemClickListener)
在之前的第3章,我用来创建菜单的就是这个场景。
3.PopupScene
可以在当前Scene上临时弹出的Scene对象。
七、Modifier修改器
之前的几节都是比较无聊的概念介绍,接下来的教程就会比较有趣了。在AndEngine中,Modifier修改器是实体的修改器,只要是实体,但可以通过Modifier来修改相关属性。当需要使用Modifier时需要调用registerEntityModifier(final IEntityModifier pEntityModifier)方法进行注册,接下来讲的Modifier方法都是EntityModifier的子类。
位置相关的Modifier:
MoveModifier(final float pDuration ,final float pFromX,final float pToX,final float pFromY,final float pToY,final IEntityModifierListener pEntityModifierListener,final IEaseFunction pEaseFunction)
红色为可选参数,表示修改器的完成时的监听回调和缓动函数。这个之后会讲到。
pDuration为移动所持续的秒数。
除此之外,还有MoveXModifier(...),及MoveYModifier(...),顾名思义,当实体只要在一个正交方向上移动时可以使用。
缩放相关的Modifier:
ScaleModifier(final float pDuration,final float pFromScale,final float pToScale,final IEntityModifierListener pEntityModifierListener,final IEaseFunction pEaseFunction)
缩放因子为1.0f时为原大小。
this.mMenuScene.registerEntityModifier(new ScaleAtModifier(0.5f, 1.0f, 0.0f,CAMERA_WIDTH/2,CAMERA_HEIGHT/2) );
除此之外,还有基于指定中心点的缩放
ScaleAtModifier(float pDuration, float pFromScale, float pToScale, float pScaleCenterX, float pScaleCenterY)
延迟相关的Modifier:
DelayModifier(final float pDurationfinal IEntityModifierListener pEntityModifierListener)
pDuration为延迟的时间, pEntityModifierListener会在延迟动作完成时回调。
旋转相关的Modifier:
RotationModifier(float pDuration, float pFromRotation, float pToRotation)
RotationAtModifie(...)
透明度相关的Modifier:
AlphaModifier(float pDuration, float pFromAlpha, float pToAlpha)
颜色相关的Modifier:
ColorModofier(....)
Modifier的组合
有时候,仅仅一种效果是不够用的。此时,就需要构建一系列的Modifier组合来改变。
ParallelEntityModifier:当需要对某个Entity同时应用两个以上Modifier时使用
ParallelEntityModifier(IEntityModifier... pEntityModifiers)
SequenceEntityModifier:当需要对某个Entity顺序地应用两个以上Modfier时使用
SequenceEntityModifier(IEntityModifier... pEntityModifiers)
card.registerEntityModifier(new SequenceEntityModifier( new ParallelEntityModifier( new AlphaModifier(5, 0.2f, 0.8f), new ScaleModifier(5, 0.2f, 0.8f), new MoveModifier(5, CAMERA_WIDTH / 2- this.mCardTextureRegion.getWidth()/ 2, CAMERA_WIDTH / 2- this.mCardTextureRegion.getWidth()/ 2, -this.mCardTextureRegion.getHeight(), CAMERA_HEIGHT / 2- this.mCardTextureRegion.getHeight()/ 2, EaseElasticInOut.getInstance()) ), new ParallelEntityModifier( new AlphaModifier(3, 0.8f, 1.0f), new RotationModifier(3, 0, 361), new MoveModifier(3,CAMERA_WIDTH / 2- this.mCardTextureRegion.getWidth()/ 2, -135, CAMERA_HEIGHT / 2- this.mCardTextureRegion.getHeight()/ 2, -195), new ScaleModifier(3, 0.8f, 0.2f) ) ));
示例免费下载地址:http://download.csdn.net/detail/lan410812571/5858831
八、EaseFunction缓动函数
在上一节中可以发现卡牌的运动会有回弹的效果,有段代码
new MoveModifier(5, CAMERA_WIDTH / 2- this.mCardTextureRegion.getWidth()/ 2, CAMERA_WIDTH / 2- this.mCardTextureRegion.getWidth()/ 2, -this.mCardTextureRegion.getHeight(), CAMERA_HEIGHT / 2- this.mCardTextureRegion.getHeight()/ 2, EaseElasticInOut.getInstance())
缓动函数的动态效果http://easings.net/zh-cn
九、绘制线条与矩形
AndEngine没有提供大量的绘制功能。对于大多数游戏,图片资源都是由一系列的位图组成的。很少游戏需要在游戏运行时绘制大量图形。AndEngine提供了绘制线条和矩形的方式。
线条:
Line(final float pX1,final float pY1,final float pX2,final float pY2,final foat pLineWidth)
很简单,两点确定一个线段。pLineWidth为线宽。
矩形:
Rectangule(final float px,final float py,fianl float pWidth ,final flat pHeight,final RectangleVretexBuffer pRectangleVertexBuffer)
px,py为矩形左上角的坐标,pWidth,pHeight为宽高。可选参数pRectangleVertexBuffer是用来绘制大量矩形时提高绘制时的速度,也可以用来扭曲矩形。
使用Line绘制六芒星
//绘制六芒星 final float X0=CAMERA_WIDTH/2,Y0=CAMERA_HEIGHT/2;//绘制基点 Line star1=new Line(X0-100,Y0-57,X0+100,Y0-57,3.0f); Line star2=new Line(200,0,100,173,3.0f); Line star3=new Line(-100,173,-200,0,3.0f); Line star4=new Line(0,114,-200,114,3.0f); Line star5=new Line(-100,-57,-200,114,3.0f); Line star6=new Line(-100,-57,0,114,3.0f); star1.attachChild(star2); star1.getLastChild().attachChild(star3); star1.getLastChild().attachChild(star4); star1.getLastChild().attachChild(star5); star1.getLastChild().attachChild(star6); star1.setRotationCenter(100, 57); star1.setScaleCenter(100, 57); star1.registerEntityModifier(new SequenceEntityModifier( new RotationModifier(3.0f, 0.0f, 360.0f), new ScaleModifier(0.5f, 1.0f, 9.0f) )); scene.getLastChild().attachChild(star1);
贴图就是绘制在Sprite对象上的位图,AndEngine在内存中以Texture对象的形式储存所有贴图,并通过TextureManager来管理游戏中的所有Texture对象。在前几节,可以经常看到形如下的代码。
mBgTexture = new Texture(1024, 1024, TextureOptions.BILINEAR_PREMULTIPLYALPHA); mBgTextureRegion = TextureRegionFactory.createFromAsset(mBgTexture, this, "level1_bg.jpg", 0, 0); mEngine.getTextureManager().loadTexture(mBgTexture);
十一、BuildableTexture
通过上一节,我们会发现Texture实在是挺麻烦的,每次需要告诉TextureRegionFactory所加载的图片在Texture对象中所处的位置。我们要规划出如何安排这些图像,小心地计算出调用TextureRegionFactory方法所使用的坐标。所以,AndEngine提供一组可以自动安排图片位置的方法。
BuidableTexture类
//武力,速度,血量状态标记组 mPropertyTexture=new BuildableTexture(512, 512, TextureOptions.BILINEAR_PREMULTIPLYALPHA); mCaseTextureRegion=TextureRegionFactory.createFromAsset(mPropertyTexture, this, "case.png"); mSwordTextureRegion=TextureRegionFactory.createFromAsset(mPropertyTexture, this, "sword.png"); mShiftTextureRegion=TextureRegionFactory.createFromAsset(mPropertyTexture, this, "shift.png"); mBloodTextureRegion=TextureRegionFactory.createFromAsset(mPropertyTexture, this, "blood.png"); try{ mPropertyTexture.build(new BlackPawnTextureBuilder(2)); }catch(final TextureSourcePackingException e){ Log.d("Leekao", "don't fit"); } this.mEngine.getTextureManager().loadTexture(mPropertyTexture);
//属性状态组 final Sprite casebox=new Sprite(566, 3, mCaseTextureRegion); final Sprite sword=new Sprite(579, 14, mSwordTextureRegion); final Sprite shift=new Sprite(653, 14, mShiftTextureRegion); final Sprite blood=new Sprite(731, 14, mBloodTextureRegion); scene.getLastChild().attachChild(casebox); scene.getLastChild().attachChild(sword); scene.getLastChild().attachChild(shift); scene.getLastChild().attachChild(blood);
然后File--Export Coordinates,可以得到一个plist文件,打开就能看到每个图的坐标了