版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、北京传智播客教育 ,植物大战僵尸,讲师:曹睿,北京传智播客教育 ,大纲,框架核心 SurfaceView+SurfaceHolder+Thread Cocos2d-android游戏引擎 图形引擎Cocos2D Graphic 声音引擎CocosDenshion 植物vs僵尸,框架核心,SurfaceView SurfaceView是View的子类,等同于TextView、ImageView等一系列控件。 核心功能可以通过子线程进行界面的绘制. 绘制需要注意的内容: 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程
2、。渲染线程所要访问的各种变量应该作同步处理。 由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface SurfaceHolder 对象获取:SurfaceView. getHolder(); 用于管理Surface,核心的内容是Callback接口,我们需要依据绘图中提到的注意内容确保Callback中的方法是在UI线程中调用。 Callback的调用:使用SurfaceHolder.add
3、Callback(Callback callback)方法进行调用 Thread,界面的绘制,在子线程(Thread)中绘制界面 绘制的周期 SurfaceHolder.Callback.surfaceCreated() SurfaceHolder.Callback.surfaceDestroyed() 一个周期的绘制步骤 SurfaceHolder锁定界面:SurfaceHolder.lockCanvas(); 图像绘制(绘制一个矩形,说明当前的坐标系统) SurfaceHolder解除界面锁定:SurfaceHolder.unlockCanvasAndPost(Canvas canvas)
4、; 绘制内容的量决定着绘制时间,在一个时间段内绘制的次数越多那么用户的体验越好。 关于帧率 FPS即Frames per Second,中文翻译为每秒显示帧数,俗称帧率。多用于影视制作和游戏。 由于人类眼睛的特殊生理结构,如果所看画面显示的速率在29.97时候,就会认为是连贯的,这也就是为什么电影胶片是一格一格拍摄出来,然后快速播放的。 而对游戏,一般来说,第一人称射击游戏比较注重FPS的高低,如果FPS30的话,游戏会显得不连贯。所以有一句有趣的话:“FPS(指FPS游戏)重在FPS(指帧率)。 代码的改进,屏蔽掉draw时出现异常的情况,小案例,模拟射击类小游戏 实现步骤: 创建自定义的S
5、urfaceView-GameUI 使GameUI实现SurfaceHolder.Callback接口 使GameUI实现Runnable接口完成界面绘制工作 将Activity中setContentView参数修改为GameUI对象,案例分析,抽取共性 图片 坐标 绘制自己的方法 游戏元素 小人 移动的方法 用户点击屏幕时产生一个笑脸 笑脸 移动的方法 按键: 需要设置按压之后的图片 判断用户是否点击方向按键,处理点击效果,案例总结,如果在现有的基础上继续开发,需要完善那些功能 功能一:游戏界面的切换 切换方式一:进行Activity之间切换 切换方式二:在SurfaceView中完成不同界
6、面的切换 需要将当前界面需要显示的内容进行统一管理,就像在电影放映时会将当前场景显示的内容放置到一张胶片上。 同时电影放映时需要有人控制胶片的切换。 功能二:元素动作处理 速度变化快的动作(显示、隐藏) 有一个执行时间的动作(移动、跳跃等) 功能三:游戏声音处理(音乐、音效) 其他功能 这些工作是否已经有人帮我们干了,Cocos2d-android游戏引擎,什么是游戏引擎 游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。 Cocos2d家族 co
7、cos2d是一个开源的游戏开发框架,利用它可以非常容易的开发2D游戏。 包括以下成员 Cocos2d-x Cocos2d-iphone Cocos2d-android Cocos2D-html5 本质区别:开发的语言不一样:Cocos2d-x使用c+、Cocos2d-iphone使用Object-C 共同点:api名字基本一致 我们为什么要使用cocos2d 一款开源的,跨平台,轻量级的2D游戏引擎。 性能良好 广泛的社区支持 拥护很多成功案例。比如捕鱼达人,三国塔防、植物大战僵尸、保卫萝卜等 使用MIT授权协议。可以自由使用,修改源码,不需要像GPL一样公开源码,可以商用,架构,架构说明,C
8、ocos2D Graphic图形引擎 CocosDenshion Audio声音引擎 物理引擎 Box2d Chipmunk Lua脚本库,图形引擎Cocos2D Graphic,图形引擎说明,CCDirector(导演) 引擎的控制者,控制场景的切换,游戏引擎属性的设置 CCScene (场景) 场景类,例如游戏的闪屏,主菜单,游戏主界面等。 CCLayer(布景) 图层类,每个图层都有自己的触发事件,该事件只能对其拥有的元素有效,而图层之上的元素所包含的元素,是不受其事件管理的 CCSprite(人物) 精灵类,界面上显示的最小单元 CCNode 引擎中最重要的元素,所有可以被绘制的东西都
9、是派生于此。它可以包含其它CCNode,可以执行定时器操作,可以执行CCAction。 CCAction(动作) 动作类,如平移、缩放、旋转等动作,CCDirector,CCGLSurfaceView 引擎中SurfaceView的子类,实现了SurfaceHolder.Callback接口,但并未实现Runnable接口。 存在问题: 1、绘制界面的线程是谁? 2、该线程是如何启动的? CCDirector的作用 界面的绘制工作是由GLThread来完成,而GLThread的开启是在CCDirector的attachInView方法中完成的。 管理场景CCScene,CCDirector,主
10、要方法摘要: 对象的获取: sharedDirector()取得对象 启动绘图线程 attachInView()连接SurfaceView 场景的管理 runWithScene()运行场景 replaceScene()替换场景 生命周期 onResume()进入运行状态 onPause()暂停 end()结束 屏幕切换 setDeviceOrientation()设置横屏竖屏 setScreenSize(480, 320)设置屏幕分辨率,高于设置的分辨率时,引擎会自动适配,引擎将屏幕水平方向分成480份,垂直方向分成320份,代码中使用的数值是相对于这些进行计算的 帧率设置 setDispla
11、yFPS(true)显示fps帧率。帧率的显示需要添加fps_images.png图片到assets文件夹下 setAnimationInterval(1.0f / 60)设置帧率,每秒刷新60次,CCScene,场景CCScene 目前该类没有什么具体的功能,它只是作为一个项目中需要展示内容的根节点存在,CCLayer,图层或布景 调用addChild(CCNode child)方法添加精灵 可以在CCLayer下添加CCLayer(类似VIewGroup) 可以在CCLayer上处理用户的TouchEvents事件。 使用方法:写一个Layer继承CCLayer,处理自身的onTouch事
12、件。 注意事项:需要设置setIsTouchEnabled(true)让你的Layer可以接受到Touch事件,CCSprite(精灵,原点 当前的坐标系统,规定屏幕的左下角为坐标原点。通过sprite.getPosition()获得当前加载的精灵的坐标值。 锚点(anchor point) CCSprite显示时需要设置锚点信息,默认为(0.5f,0.5f),即将CCSprite图片的中间点作为图片在当前坐标系统中的基准点,通过sprite.getAnchorPoint()获取当前精灵的锚点信息。 锚点的设置:setRelativeAnchorPoint(false)时锚点为(0,0) 或者
13、调用setAnchorPoint指定相关信息,当调用setAnchorPoint时setRelativeAnchorPoint方法无效,CCSprite,主要方法摘要 锚点 setRelativeAnchorPoint(boolean relative) 设置描点,默认值为true,当设置锚点为(0,0)时使用false setAnchorPoint(float x, float y)设置锚点指定值,重载方法setAnchorPoint(CGPoint anchor) ,CGPoint封装了x、y信息 坐标 setPosition(float x, float y)设置精灵的坐标信息 镜像 s
14、etFlipX(true)在x轴上的镜像,setFlipY(true)在y轴上的镜像,目标是为了重用图片资源 添加精灵 addChild(CCNode child) Adds a child to the container with z-order as 0。依据添加顺序决定显示循序,即后添加的显示在最前端。 addChild(CCNode child, int z) Adds a child to the container with a z-order。值越大显示的优先级越高。 addChild(CCNode child, int z, int tag) Adds a child to
15、the container with z order and tag。Tag指定精灵的id,默认值是-1。 透明度 setOpacity(int)0-255之间,值越小越透明,反之越不透明,CCSprite点击事件分析,CCSprite对象是否被点击的判断依据 在前面讲解的小例子中,我们了解到,判断是否用户点击了某些按钮的图片,是依据用户点击屏幕上的坐标来完成的。 在cocos2d中我们也需要依据用户点击屏幕的坐标来判断到底是哪个CCSprite对象被点击了。但是由于在cocos2d中已经将坐标系统进行调整了,所以当判断是否被点击时需要将两个坐标系进行统一。 另外,由于每个精灵只对应一个坐标值
16、,所以当判断CCSprite对象是否被点击时,需要获取整个CCSprite对象在屏幕上覆盖的范围,这需要结合锚点信息,同时获取到CCSprite对象的宽度和高度。 特别需要说明的是:处理用户的触摸事件是在CCLayer中,CCSprite点击事件处理,实现步骤 创建类MyCCLayer继承CCLayer类,重写用户触屏事件的处理方法 Override public boolean ccTouchesBegan(MotionEvent event) return super.ccTouchesBegan(event); Override public boolean ccTouchesEnded
17、(MotionEvent event) return super.ccTouchesEnded(event); Override public boolean ccTouchesMoved(MotionEvent event) return super.ccTouchesMoved(event); 转换屏幕坐标到cocos2d坐标系 调用CCNode.convertTouchToNodeSpace(MotionEvent event) ,将event中封装的用户点击坐标信息转换成CGPoint对象 判断CGPoint对象是否在CCSprite对象的范围之内,判断CGPoint对象是否在CCSp
18、rite对象的范围之内,判断思想 获取到当前CCSprite对象,利用getChildByTag(int) 计算这个CCSprite对象所占据屏幕的矩形范围,CCNode.getBoundingBox()方法可以获取到CCSprite对象占用的矩形范围,这些信息封装在CGRect信息中。 判断用户的触摸点是否包含在CGRect中,利用CGRect的方法containsPoint进行判断 特别注意:如果让CCLayer能处理用户触屏事件需要设置当前的CCLayer.setIsTouchEnabled(true,CCLayer,小结 使用方法:创建类MyCCLayer继承CCLayer类 处理用户
19、触摸事件 用于管理CCSprite,控制CCSprite的添加和删除,CCAction,对于一个游戏来说,动作是非常重要的,好的动作可以使游戏的可玩性大大提高,在cocos2d引 擎中有一个动作类,CCAction是动作类的基类,动作是定义在节点(CCNode)上的,以节点为 目标,主要分为两类瞬时动作和延时动作,CCIntervalAction(延时动作,Cocos2d提供的基本延时类动作都提供了ActionTo和ActionBy两种(七种) : ActionTo是指动作结束的状态,也就是动作的终点。 ActionBy是指动作执行的状态,也就是动作的执行过程。 常用的延时动作类包括: 移动动
20、作:CCMoveBy CCMoveTo 缩放动作:CCScaleBy CCScaleTo 旋转动作:CCRotateBy CCRotateTo 跳跃动作:CCJumpBy CCJumpTo 贝赛尔曲线动作:CCBezierBy CCBezierTo 淡入淡出动作:CCFadeBy CCFadeIn CCFadeOut,CCIntervalAction(基本动作,位置变动 移动(move) 弹跳(jump) 贝塞尔曲线运动(bezier) 渐快(EaseIn) 渐慢(EaseOut) 先渐快后渐慢 特效,先缓冲再加速 正弦曲线速度变化 定点变动 缩放(Scale) 旋转(Rotate) 颜色渐变
21、动作(Tint) 闪烁(Blink) 播放序列帧,CCIntervalAction(组合动作,按顺序执行动作 同时执行要被执行的动作 间歇动作(中间暂停指定时间,CCAction移动,移动(CCMoveBy与CCMoveTo) 创建对象:利用CCMoveBy(To).action(float duration, CGPoint pos) 。 参数说明: duration持续时间,pos代表目标点 不同点:CCMoveBy指定的CGPoint 是相对坐标即相对于当前的需要移动的精灵。 CCMoveTo指定CGPoint 是绝对坐标。 CCMoveBy将reverse()方法进行了处理,而CCMo
22、veTo返回null值。当我们需要实现精灵的反复移动时使用CCMoveBy将很轻松的完成。 应用场景:如游戏过关后会有一个箭头反复提示你前进的路线。首先我们需要使用CCSequence将一组移动的效果添加到一起,实现单次往返,再利用CCRepeatForever实现反复动作,CCAction弹跳,弹跳(CCJumpBy与CCJumpTo) 创建对象: CCJumpBy (To).action(float time, CGPoint pos, float height, int jumps) 参数说明: time代表持续时间, pos代表目标点, height代表跳跃的高度,jumps代表跳动次
23、数 区别: CCJumpBy将 reverse()方法进行了处理,可以用于实现重复动作; 应用场景,CCAction贝塞尔曲线运动,贝塞尔曲线运动(CCBezierBy) 创建对象:CCBezierBy(To).action(float t, CCBezierConfig c) 参数说明: t代表持续时间, c曲线参数, CCBezierConfig.controlPoint_1起始点、CCBezierConfig.controlPoint_2顶点、CCBezierConfig.endPosition终点 应用场景:子弹,pvz中屋顶关卡,CCAction渐快,渐快(CCEaseIn) 对象创
24、建:CCEaseIn.action(CCIntervalAction action, float rate) 参数说明: action被控制的动作, rate加速度,如果为1就匀速了 渐慢:CCEaseOut与CCEaseIn参数一致,动作相反,CCAction缩放,缩放(CCScaleBy与CCScaleTo) 创建对象:CCScaleBy(To).action(float t, float s) 参数说明:t代表持续时间,s代表缩放比例 区别: CCScaleBy将 reverse()方法进行了处理,可以用于实现重复动作 应用场景:心跳,CCAction旋转,旋转(CCRotateBy与C
25、CRotateTo) 创建对象:CCRotateBy(To).action(float t, float a) 参数说明:t代表持续时间,a代表旋转角度 区别: CCScaleBy将 reverse()方法进行了处理,可以用于实现重复动作; CCRotateTo以最便捷的方式旋转到指定角度,如旋转角度为300时,使用CCRotateTo来实现的话会逆时针旋转60度 应用场景:进度条旋转、旗子的左右摆动等 特别注意:旋转动作是沿着锚点完成的,所以需要结合锚点统一协调旋转动作,CCAction颜色渐变动作,颜色渐变动作(CCTintBy与CCTintTo) 创建对象: CCTintBy(To).
26、action(float t, ccColor3B c) 参数说明:t:时间间隔, c:RGB三色值封装对象 区别: CCTintBy对reverse()方法实现; CCTintBy需要设置的RGB三色值是相对值,即相对于当前的RGB值进行变动。 应用场景,CCAction闪烁,闪烁(CCBlink) 对象创建:CCBlink.action(float t, int b) 参数说明:t间隔时间,b闪烁次数,CCAction播放序列帧,CCAction连续动作,连续动作CCSequence 对象创建:CCSequence.actions(CCFiniteTimeAction action1, C
27、CFiniteTimeAction. actions) 对象说明:用于按顺序执行一连串动作,CCAction并发动作,并发动作CCSpawn 对象创建:CCSpawn.actions(CCFiniteTimeAction action1, CCFiniteTimeAction. params) 参数说明:指定一连串动作同时触发,如在跳跃过程中执行一个旋转动作,CCAction间歇动作,间歇动作(CCDelayTime) 对象创建:CCDelayTime. action(float t) 参数说明:t 停止时间,即时动作(CCInstantAction,瞬时动作:就是不需要时间,马上就完成的动作
28、。 Cocos2d提供以下瞬时动作: 放置 Place效果类似于 node.Position = ccp(x, y)。之所以作为一个动作来实现是为了可以与其他动作形成一个连续动作。 隐藏 Hide效果类似于 node setVisible:NO. 之所以作为一个劢作来实现是为了可以与其他动作形成一个连续动作。 显示 Show效果类似于 node setVisible:YES. 之所以作为一个动作来实现是为了可以与其他动作形成一个连续动作。 可见切换 ToggleVisibility,CCAction显示隐藏,可见性(CCHide与CCShow ) 对象创建:调用action方法即可,无参数,C
29、CAction无限动作,无限动作CCRepeatForever 无限制的执行一个延时动作,通常用于连续执行一连串的重复动作,这些动作多放置在CCSequence中进行定义,CocosDenshion Audio声音引擎,SoundEngine处理声音 声音类型:音乐和音效 可以从长短上来做区分,音乐一般用于游戏的背景声音,音效主要是短小的声音,如植物发射子弹,僵尸吃植物时发出的声音 声音控制,如播放、暂停、声音大小调节、静音 通过缓存音乐和音效文件来提高声音处理的效率,小案例,故事情景: 在一个九曲十八弯的小路上,一个僵尸冒着大雪前行。最后雪停了,僵尸高兴的跳起了骑马舞,案例分析,元素分析 地
30、图(Tiled绘图工具) 僵尸 飘雪的场景 背景音乐切换,游戏地图制作,地图制作 工具: Tiled绘图工具 图层:展示整体效果 块层:依据块划分图片后,整张图片会变成一个块层 块:块层中的一个单元 对象层:单独一层,放置一些指定的对象,游戏地图加载,加载:CCTMXTiledMap.tiledMap(name); 添加到当前显示层,存在问题: 无法进行图片的移动 用户的touch事件处理: setIsTouchEnabled(true); CCTMXTiledMap.touchMove(MotionEvent event, CCTMXTiledMap tiledMap); 存在问题:地图移动
31、 获取图片大小,设置图片位置为宽高的一半 设置锚点为0.5,0.5,对象层加载,对象层功能 保存着僵尸需要移动的点的坐标信息 加载 CCTMXTiledMap.objectGroupNamed(String groupName);获取到CCTMXObjectGroup对象,该对象的objects字段中存储着对象层中元素信息,对该集合进行遍历,获取其中保存的坐标信息,僵尸动作,移动规则:僵尸需要按照点的先后顺序进行连续移动 实现方式: 方案一:每次移动都创建一个动作,按顺序添加到CCSequence中 方案二:递归 方案三:执行回调动作(CCCallFunc),在动作执行完成后立即执行的动作。通
32、过反射调用一个指定的方法,方法里面完成后续相关动作 行走过程中播放序列帧 利用CCAnimate动作来完成CCAnimation中指定的一组图片的播放 CCAnimation anim = CCAnimation.animation(, 0.2f, frames); /在初始化时完成frames的处理 private ArrayList frames; / 添加序列帧 frames = new ArrayList(); for (int i = 1; i = 7; i+) / CCSprite item=CCSprite.sprite(String.format(z_1_0%d.png, i)
33、;/应对十以内 CCSprite item = CCSprite.sprite(String.format(z_1_%02d.png, i);/ 应对百以内 CCSpriteFrame frame = item.displayedFrame(); frames.add(frame); CCAnimate animate = CCAnimate.action(anim,粒子系统飘雪场景,什么是粒子系统 粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现的真实感的 game physics。经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、
34、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等等。 实现步骤: CCParticleSystem system= CCParticleSnow.node(); system.setTexture(CCTextureCache.sharedTextureCache().addImage(f.png); this.addChild(system, 1); 自定义效果: 制作工具ParticleDesigner,使用工具将效果导出成.plist文件 CCParticleSystem ps=CCParticleSystemPoint.particleWithFile(f.plist); p
35、s.setPosition(0,winSize.height); addChild(ps,游戏暂停处理,处理游戏暂停思路 当前的主CCLayer处于暂停状态,处于暂停状态的CCLayer无法接收到用户的触摸事件 在主CCLayer暂停之前需要启动另外一个CCLayer显示,除提示玩家游戏已经暂停外,如果玩家需要切换到游戏界面需要点击当前的CCLayer中的按钮完成继续游戏的处理。 注意: 1、该暂停用CCLayer必须添加到与主CCLayer相同的parent下,不能再主CCLayer继续添加 2、点击完成时需要清除当前显示的CCLayer 核心方法:onEnter()游戏继续 onExit(
36、)游戏暂停,植物vs僵尸,界面构成 欢迎界面(界面展示logo等信息) 主界面(游戏模式选择) 对战界面,欢迎界面,背景音乐播放 背景音乐机音效的预加载 创建BaseLayer,管理各个界面用到的公共信息,在BaseLayer中利用SoundEngine加载背景音乐,同时加载按钮的点击音效,由于这些资源只需要加载一次,所以在静态代码块中完成。 图片资源加载 Logo展示 进度条处理 版本信息加载 更新版本获取,菜单界面,CCMenu菜单使用 调用CCMenu menu = CCMenu.menu();获取CCMenu对象。通过给menu添加CCMenuItem完成菜单项的添加。 CCMenuI
37、tem菜单项 调用CCMenuItem item = CCMenuItemSprite.item(CCSprite.sprite(resPath + “start_adventure_default.png”), CCSprite.sprite(resPath+ “start_adventure_press.png”), this,“onClick”);创建菜单项 参数说明:第一个参数为按钮默认显示的内容,第二个参数为点击时显示的内容,第三个参数指定目标对象(利用反射调用指定对象的方法),第四个参数为调用的方法名(查看代码,该方法需要传递一个Object的参数,对战,地图展示 植物选择 开始游
38、戏 对战处理,地图展示,展示对战界面(展示时间:一秒钟) 获取展示僵尸点位信息 添加展示用僵尸,伴随着序列帧的播放 平移地图,显示展示用僵尸,地图加载和僵尸展示,利用CCTMXTiledMap处理地图,地图无需处理拖动 设置锚点为中心位置 设置坐标为地图的中心 解析地图中僵尸位置信息 CCTMXTiledMap.objectGroupNamed(String groupName)获取指定名称的CCTMXObjectGroup 获取CCTMXObjectGroup中objects信息,获取到分别以x和y为key存储的点位信息 在这些点中任选部分点展示僵尸(僵尸原地不动的动作帧播放),对创建好的僵
39、尸需要保存到一个容器当中,当地图移动到对战界面时这些僵尸需要被销毁,界面展示顺序,对战地图展示后停顿1秒 动作的载体:地图 移动到僵尸展示界面 动作的载体:地图 1秒钟后展示所有植物和植物选择框 动作的载体:已选和可选容器 实现方式: 在地图的系列动作后添加CCCallFunc 也可以利用CCCallFuncND指定参数在同一个方法中完成一系列动作,植物选择,显示两个容器 玩家已选植物容器 准备玩家已有植物信息 玩家已有植物容器 玩家选择植物 选择植物的处理 取消植物的处理,植物信息加载,封装展示用植物 唯一标示: 预加载部分植物信息,模拟用户已有植物,每种植物均分配一个唯一标示信息,创建be
40、an对象时需要指定该标示信息 图片: 显示植物的图片 当用户选择后需要在原地留有一个灰色的图片 消耗阳光数 预加载部分植物信息 构造中指定标示信息,设置图片锚点(0,0),背景图改变透明度(100,植物选择,处理步骤: 判断用户touch点在可选容器中还是已选容器中 在可选容器中 需要判断是否点击的是“一起摇滚吧” 当点击可选容器中的植物时,需要循环当前可选容器中的植物信息,判断那个植物被点击,将点击的植物移动到已选容器中,目标点需要依据已选容器中信息判断 在已选容器中 判断那个植物被点击,点击植物移动到保留的初始点 在被点击植物后面的植物需要进行前移一个位置的动作,开始游戏,一起摇滚”点击,
41、但此时并没有真正的开启游戏,需要限制用户操作 已选植物判断 限制用户选择植物个数 向日葵检查 清理展示用僵尸 清理玩家已有植物容器 对用户已选植物容器进行处理 移动地图到对战界面 播放一组序列帧(准备安放植物) 将播放序列帧精灵清除 真正游戏开始,传递信息到游戏控制类 地图(对战layer )+玩家选择植物,对战处理,战场划分 将整个对战地图划分为五个行战场,以行为单位处理业务,当一个行战场业务处理完成后,整个对战地图对战业务完成 战场元素,对战基本元素,BaseElement继承CCSprite 处理内容: 创建:通过构造指定元素图片信息 基本动作 消亡(死亡监听) 包含的内容: 产物、僵尸
42、、植物,产物,包括子弹、阳光、金币信息 处理内容: 通过构造指定元素图片信息,产物子弹,子弹类型:豌豆(一个或多个)、其他类型 属性:伤害值、移动速度 方法:移动,僵尸,处理内容: 构造传递资源图片 属性 记录僵尸运动的起点和终点 攻击力、移动速度、生命值 动作处理 攻击、被攻击、移动,植物,处理内容 植物分类:生产、攻击、防御植物 属性:生命值、所处的行列号、射程(块数) 将所有植物的锚点定义在(0.5f, 0) 被攻击处理(可以在当前类中完成) 对生命值进行减少操作,减少依据传递的参数信息,当生命值小于等于零时,销毁植物,植物防御植物,处理内容:大生命值 坚果: 生命值:200 原地摇摆,
43、植物生产植物,处理内容:生产功能(每隔一个时间段触发),产品包括:阳光、金币 向日葵: 生命值:100 生产功能:开启定时任务,每隔5秒生产一个阳光,植物攻击植物,处理内容: 建立存储子弹的集合 攻击方式:创建攻击用子弹 监听子弹的消亡 当子弹消亡时需要从集合中清除,产物阳光,生成方式: 由生产植物创建(向日葵、阳光菇) 系统生成 依据阳光数量多少进行划分(大小) 动作处理: 基本动作:围绕中心点旋转 移动动作:指定起始点、顶点和终点 阳光收集: 利用集合保存生成阳光,当被用户收集或到时自动从集合中清除 保存阳光总数,当用户收集时数量变化,产物普通豌豆,基本配置 速度:60 攻击力:100 移
44、动动作:移动的起始点植物,终点地图边缘,如果这之间存在僵尸则遇到僵尸消失,初级僵尸基本动作,构造处理: 无参构造用于展示僵尸种类 有参构造指定起始点和终点 僵尸图片确定 属性处理: 设置生命值(100)、攻击力(10)、移动速度(10) 帧动作处理: 基本动作、移动、攻击、被攻击(移动中死亡、攻击中死亡,初级僵尸行走,计算完成移动的时间 利用公式:t=s/v 计算僵尸当前的位置到移动的终点的距离 利用设置好的速度值(10),完成移动动作 当僵尸移动到终点时触发gameover 移动过程中伴随着行走序列帧的播放,初级僵尸攻击,记录僵尸攻击状态,当僵尸已经处于攻击状态时不触发再次攻击 如果僵尸未处
45、于攻击状态时 修改攻击状态 记录攻击目标 停止当前所有动作 开启攻击动作 持续杀伤 开启定时任务,每隔0.5秒完成一次减血操作 每次减血前判断当前攻击目标的生命值 当生命值大于零时,调用被攻击目标的被攻击方法,传递当前僵尸的攻击力 当生命值小于零时 停止攻击定时任务 修改攻击状态 停止攻击动作 开启行走动作,初级僵尸被攻击,判断生命值,当生命值大于零时 减少生命值,依据传递的攻击力数值进行处理 当生命值小于零时 停止僵尸的所有动作 播放僵尸脑袋掉下来的序列帧,之后播放慢慢趴在地上的序列帧,最后僵尸销毁。 如果此时将死在攻击植物,需要停止攻击植物的定时任务,攻击植物豌豆射手,基本属性 生命值10
46、0 攻击方式 普通攻击植物:生产豌豆 设置豌豆的基本参数 调用豌豆的移动方法 将豌豆添加到当前的CCLayer中 添加豌豆到豌豆射手的子弹集合中 当生产出的豌豆没有消失前,攻击植物不会再创建豌豆 建立子弹与植物的监听关系,当子弹消亡时需要将子弹从植物的集合中清除,对战业务,战场控制 对战逻辑处理交由游戏控制类完成GameContorller 初始化行战场,为每个行战场指定一个行号 控制僵尸的添加 处理用户的添加植物操作 阳光数管理 每一独立的行战场由FightLine进行管理 僵尸攻击植物 植物攻击僵尸,游戏控制添加僵尸,僵尸行进路线加载 添加僵尸到行战场 在行战场中创建一个集合,用于存储添加到当前行中的僵尸 战场控制 僵尸种类 僵尸添加的总数 僵尸添加的速度控制 进度 我们在应用中作简单处理,即加载完僵尸行动路线后,每隔一个固定的时间段添加一种僵尸,对游戏进度暂不做控制,游戏控制
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 衡阳市江东区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 呼伦贝尔市根河市2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 甘孜藏族自治州炉霍县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 牛肉营销策划方案
- 畜禽规模养殖生态改造方案
- 深度解析(2026)《CBT 3539-1994船用柴油机连杆衬套及活塞销孔衬套修理技术要求》
- 深度解析(2026)《2026-2027年用于个人心理健康监测与干预的脑电、皮电等多模态生物信号融合处理芯片在消费级设备中应用获数字心理健康平台硬件战略》
- 畜牧兽医考试题及答案
- 统编版语文四下第二单元 大单元整体说课稿
- 第二单元 中华传统文化经典研习-百家争鸣 (学生版讲义)语文统编版选择性必修上(共28份打包)
- 母婴三病传播知识培训课件
- 2026届陕西省高三二模高考数学模拟试卷试题(含答案详解)
- 地推销售话术与技巧
- 知情同意与拒绝治疗
- 甲钴胺的临床应用
- 杭州中考社会试卷及答案2025
- 全息路口解决方案-大华
- 渠道管理成员激励
- 水上抛石应急预案
- 中国2型糖尿病防治指南(2024年版)解读
- 老年人口腔护理要点
评论
0/150
提交评论