AndEngine游戏开发系列教程(二)

2023-10-07 07:10

本文主要是介绍AndEngine游戏开发系列教程(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇地址: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())

最后一个参数是什么呢,就是这节讲的缓动函数。当一个Entity不使用EaseFunction时,它是呈线性变化的,也就是说为匀速的改变。比如使用MoveModifer时,从A点移动到B点,其速度是始终不变的。使用了EaseFunction,那么就将是变速运动了。
EaseFunction类的命名规范:
Ease<类型><端点> 如EaseElasticInOut
类型指的是缓动函数的类型,如Circular,Elastic,Quarter。端点是函数影响动作的哪个阶段,In是时间的初始阶段,Out是结束阶段,InOut两个阶段都影响。
      AndEngine中一共提供了34种缓动函数。
      EaseBackInOut
      EaseBounceInOut
      EaseCircularInOut
      EaseCublicInOut
      EaeExponentialInOut
      EaseLinearInOut
      EaseElasticInOut
      EaseQuadInOut
      EaseQuartInOut
      EaseQuintInOut
      EaseSineInOut
      EaseStrongInout


缓动函数的动态效果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);

十、Texture

贴图就是绘制在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);

Texture类
Texture(int pWidth, int pHeight, TextureOptions pTextureOptions)
因为在AndEngine中载入的贴图的宽高必须是2的整次幂,所有可以发现pWidth,pHeight的值都是遵循的。如果宽高值不是2的整次幂,会抛出IllegalArgumentException异常。可是在游戏中使用的图片宽高是多种多样的,不可能都是2整次幂。所以有了贴图区域TextureRegion的概念。我们可以暂时把Texture理解成一个存放图片的容器。
TexureOptions参数是控制OpenGL渲染图片的方式,通常使用默认的就可以了。

TexureRegionFatory类
在创建了空白的贴图储存区后,需要使用TextureRegion为Texture对象载入图像。
1.创建普通贴图TexureRegion:
使用Asset资源:使用存放在assets文件夹下的位图,可以通过TextureRegionFactory.setAssetBasePath(String pAssetBasePath)来设置查找资源的路径,参数为局部路径名,必须以 / 结尾,不能有空字符,否则会抛出异常。
TextureRegionFactory.createFromAsset(Texture pTexture, Context pContext, String pAssetPath, int pTexturePositionX, int pTexturePositionY)
pTexture:需要为其载入贴图的Texture对象。
         pContext:当前Activity对象的ConText环境对象。
         pAssetPath:资源的文件名,必须带后缀。支持png,jpg,bmp。
         int pTexturePositionX, int pTexturePositionY:载入的图片在Texture中所占据的位置。该位置为图像左上角的位置,所以 Texture必须足够大,能容下该图片。
使用Resource资源:
createFromResource(Texture pTexture, Context pContext, int pDrawableResourceID, int pTexturePositionX, int pTexturePositionY)
pDrawableResourceID:比如R.drawable.pic

2.创建瓦片贴图TileTextureRegion:
TileTextureRegion通常含有一张以上的图片,每张图片都具有相同的宽高,这些图片以矩阵的形式组织起来,每一张都可以通过在矩阵中的位置来定位。瓦片贴图可以用来创建动画精灵、储存地图的图块。
TextureRegionFactory.createTiledFromAsset(Texture pTexture, Context pContext, String pAssetPath, int pTexturePositionX, int pTexturePositionY, int pTileColumns, int pTileRows)
TextureRegionFactory.createTiledFromResource(Texture pTexture, Context pContext, int pDrawableResourceID, int pTexturePositionX, int pTexturePositionY, int pTileColumns, int pTileRows)   

所以Texture,TextureRegion共同整合组成了,我们游戏中需要图片。

十一、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);

在完成创建所用的TextureRegion对象后,在使用BuildableTexture之前要调用build方法,传入一个构建器。这样如果执行不成功会将异常捕捉下来

//属性状态组
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);

看到这里,可能大家会觉得安排图片的坐标好麻烦,恩,我也觉得很麻烦。所以我用了一个工具帮我导出坐标zwoptex
http://www.zwopple.com/zwoptex/assets/files/zwoptex-flashversion.zip
将图片导入工具中,调整好位置


然后File--Export Coordinates,可以得到一个plist文件,打开就能看到每个图的坐标了


这篇关于AndEngine游戏开发系列教程(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/156864

相关文章

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

python库fire使用教程

《python库fire使用教程》本文主要介绍了python库fire使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1.简介2. fire安装3. fire使用示例1.简介目前python命令行解析库用过的有:ar

LinuxMint怎么安装? Linux Mint22下载安装图文教程

《LinuxMint怎么安装?LinuxMint22下载安装图文教程》LinuxMint22发布以后,有很多新功能,很多朋友想要下载并安装,该怎么操作呢?下面我们就来看看详细安装指南... linux Mint 是一款基于 Ubuntu 的流行发行版,凭借其现代、精致、易于使用的特性,深受小伙伴们所喜爱。对