欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    植物大战僵尸ppt课件.ppt

    • 资源ID:1344256       资源大小:452.50KB        全文页数:86页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    植物大战僵尸ppt课件.ppt

    北京传智播客教育 ,植物大战僵尸,讲师:曹睿,北京传智播客教育 ,大纲,框架核心SurfaceView+SurfaceHolder+ThreadCocos2d-android游戏引擎图形引擎Cocos2D Graphic 声音引擎CocosDenshion 植物vs僵尸,框架核心,SurfaceViewSurfaceView是View的子类,等同于TextView、ImageView等一系列控件。核心功能可以通过子线程进行界面的绘制.绘制需要注意的内容:所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surfaceSurfaceHolder对象获取:SurfaceView. getHolder();用于管理Surface,核心的内容是Callback接口,我们需要依据绘图中提到的注意内容确保Callback中的方法是在UI线程中调用。Callback的调用:使用SurfaceHolder.addCallback(Callback callback)方法进行调用Thread,界面的绘制,在子线程(Thread)中绘制界面绘制的周期SurfaceHolder.Callback.surfaceCreated() SurfaceHolder.Callback.surfaceDestroyed() 一个周期的绘制步骤SurfaceHolder锁定界面:SurfaceHolder.lockCanvas();图像绘制(绘制一个矩形,说明当前的坐标系统)SurfaceHolder解除界面锁定:SurfaceHolder.unlockCanvasAndPost(Canvas canvas);绘制内容的量决定着绘制时间,在一个时间段内绘制的次数越多那么用户的体验越好。关于帧率FPS即Frames per Second,中文翻译为每秒显示帧数,俗称帧率。多用于影视制作和游戏。 由于人类眼睛的特殊生理结构,如果所看画面显示的速率在29.97时候,就会认为是连贯的,这也就是为什么电影胶片是一格一格拍摄出来,然后快速播放的。而对游戏,一般来说,第一人称射击游戏比较注重FPS的高低,如果FPS30的话,游戏会显得不连贯。所以有一句有趣的话:“FPS(指FPS游戏)重在FPS(指帧率)。代码的改进,屏蔽掉draw时出现异常的情况,小案例,模拟射击类小游戏实现步骤:创建自定义的SurfaceView-GameUI使GameUI实现SurfaceHolder.Callback接口使GameUI实现Runnable接口完成界面绘制工作将Activity中setContentView参数修改为GameUI对象,案例分析,抽取共性图片坐标绘制自己的方法游戏元素小人移动的方法用户点击屏幕时产生一个笑脸笑脸移动的方法按键:需要设置按压之后的图片判断用户是否点击方向按键,处理点击效果,案例总结,如果在现有的基础上继续开发,需要完善那些功能功能一:游戏界面的切换切换方式一:进行Activity之间切换切换方式二:在SurfaceView中完成不同界面的切换需要将当前界面需要显示的内容进行统一管理,就像在电影放映时会将当前场景显示的内容放置到一张胶片上。同时电影放映时需要有人控制胶片的切换。功能二:元素动作处理速度变化快的动作(显示、隐藏)有一个执行时间的动作(移动、跳跃等)功能三:游戏声音处理(音乐、音效)其他功能这些工作是否已经有人帮我们干了?,Cocos2d-android游戏引擎,什么是游戏引擎 游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。Cocos2d家族cocos2d是一个开源的游戏开发框架,利用它可以非常容易的开发2D游戏。 包括以下成员Cocos2d-x Cocos2d-iphoneCocos2d-androidCocos2D-html5本质区别:开发的语言不一样:Cocos2d-x使用c+、Cocos2d-iphone使用Object-C共同点:api名字基本一致 我们为什么要使用cocos2d一款开源的,跨平台,轻量级的2D游戏引擎。性能良好广泛的社区支持拥护很多成功案例。比如捕鱼达人,三国塔防、植物大战僵尸、保卫萝卜等使用MIT授权协议。可以自由使用,修改源码,不需要像GPL一样公开源码,可以商用,架构,架构说明,Cocos2D Graphic图形引擎CocosDenshion Audio声音引擎物理引擎Box2dChipmunkLua脚本库,图形引擎Cocos2D Graphic,图形引擎说明,CCDirector(导演)引擎的控制者,控制场景的切换,游戏引擎属性的设置 CCScene (场景)场景类,例如游戏的闪屏,主菜单,游戏主界面等。 CCLayer(布景)图层类,每个图层都有自己的触发事件,该事件只能对其拥有的元素有效,而图层之上的元素所包含的元素,是不受其事件管理的 CCSprite(人物)精灵类,界面上显示的最小单元CCNode引擎中最重要的元素,所有可以被绘制的东西都是派生于此。它可以包含其它CCNode,可以执行定时器操作,可以执行CCAction。CCAction(动作)动作类,如平移、缩放、旋转等动作,CCDirector,CCGLSurfaceView 引擎中SurfaceView的子类,实现了SurfaceHolder.Callback接口,但并未实现Runnable接口。存在问题:1、绘制界面的线程是谁?2、该线程是如何启动的?CCDirector的作用界面的绘制工作是由GLThread来完成,而GLThread的开启是在CCDirector的attachInView方法中完成的。管理场景CCScene,CCDirector,主要方法摘要:对象的获取:sharedDirector()取得对象启动绘图线程attachInView()连接SurfaceView场景的管理runWithScene()运行场景replaceScene()替换场景生命周期onResume()进入运行状态onPause()暂停end()结束屏幕切换setDeviceOrientation()设置横屏竖屏setScreenSize(480, 320)设置屏幕分辨率,高于设置的分辨率时,引擎会自动适配,引擎将屏幕水平方向分成480份,垂直方向分成320份,代码中使用的数值是相对于这些进行计算的帧率设置setDisplayFPS(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事件。注意事项:需要设置setIsTouchEnabled(true)让你的Layer可以接受到Touch事件。,CCSprite(精灵),原点当前的坐标系统,规定屏幕的左下角为坐标原点。通过sprite.getPosition()获得当前加载的精灵的坐标值。锚点(anchor point)CCSprite显示时需要设置锚点信息,默认为(0.5f,0.5f),即将CCSprite图片的中间点作为图片在当前坐标系统中的基准点,通过sprite.getAnchorPoint()获取当前精灵的锚点信息。锚点的设置:setRelativeAnchorPoint(false)时锚点为(0,0) 或者调用setAnchorPoint指定相关信息,当调用setAnchorPoint时setRelativeAnchorPoint方法无效,CCSprite,主要方法摘要锚点setRelativeAnchorPoint(boolean relative) 设置描点,默认值为true,当设置锚点为(0,0)时使用falsesetAnchorPoint(float x, float y)设置锚点指定值,重载方法setAnchorPoint(CGPoint anchor) ,CGPoint封装了x、y信息坐标setPosition(float x, float y)设置精灵的坐标信息镜像setFlipX(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 the container with z order and tag。Tag指定精灵的id,默认值是-1。透明度setOpacity(int)0-255之间,值越小越透明,反之越不透明,CCSprite点击事件分析,CCSprite对象是否被点击的判断依据 在前面讲解的小例子中,我们了解到,判断是否用户点击了某些按钮的图片,是依据用户点击屏幕上的坐标来完成的。 在cocos2d中我们也需要依据用户点击屏幕的坐标来判断到底是哪个CCSprite对象被点击了。但是由于在cocos2d中已经将坐标系统进行调整了,所以当判断是否被点击时需要将两个坐标系进行统一。 另外,由于每个精灵只对应一个坐标值,所以当判断CCSprite对象是否被点击时,需要获取整个CCSprite对象在屏幕上覆盖的范围,这需要结合锚点信息,同时获取到CCSprite对象的宽度和高度。特别需要说明的是:处理用户的触摸事件是在CCLayer中。,CCSprite点击事件处理,实现步骤创建类MyCCLayer继承CCLayer类,重写用户触屏事件的处理方法Overridepublic boolean ccTouchesBegan(MotionEvent event) return super.ccTouchesBegan(event);Overridepublic boolean ccTouchesEnded(MotionEvent event) return super.ccTouchesEnded(event);Overridepublic boolean ccTouchesMoved(MotionEvent event) return super.ccTouchesMoved(event);转换屏幕坐标到cocos2d坐标系调用CCNode.convertTouchToNodeSpace(MotionEvent event) ,将event中封装的用户点击坐标信息转换成CGPoint对象判断CGPoint对象是否在CCSprite对象的范围之内,判断CGPoint对象是否在CCSprite对象的范围之内,判断思想获取到当前CCSprite对象,利用getChildByTag(int)计算这个CCSprite对象所占据屏幕的矩形范围,CCNode.getBoundingBox()方法可以获取到CCSprite对象占用的矩形范围,这些信息封装在CGRect信息中。判断用户的触摸点是否包含在CGRect中,利用CGRect的方法containsPoint进行判断特别注意:如果让CCLayer能处理用户触屏事件需要设置当前的CCLayer.setIsTouchEnabled(true);,CCLayer,小结使用方法:创建类MyCCLayer继承CCLayer类处理用户触摸事件用于管理CCSprite,控制CCSprite的添加和删除,CCAction,对于一个游戏来说,动作是非常重要的,好的动作可以使游戏的可玩性大大提高,在cocos2d引擎中有一个动作类,CCAction是动作类的基类,动作是定义在节点(CCNode)上的,以节点为目标,主要分为两类瞬时动作和延时动作,CCIntervalAction(延时动作),Cocos2d提供的基本延时类动作都提供了ActionTo和ActionBy两种(七种) :ActionTo是指动作结束的状态,也就是动作的终点。ActionBy是指动作执行的状态,也就是动作的执行过程。常用的延时动作类包括:移动动作:CCMoveBy CCMoveTo缩放动作:CCScaleBy CCScaleTo旋转动作:CCRotateBy CCRotateTo跳跃动作:CCJumpBy CCJumpTo贝赛尔曲线动作:CCBezierBy CCBezierTo淡入淡出动作:CCFadeBy CCFadeIn CCFadeOut,CCIntervalAction(基本动作),位置变动移动(move)弹跳(jump)贝塞尔曲线运动(bezier)渐快(EaseIn)渐慢(EaseOut)先渐快后渐慢特效,先缓冲再加速正弦曲线速度变化定点变动缩放(Scale)旋转(Rotate)颜色渐变动作(Tint)闪烁(Blink)播放序列帧,CCIntervalAction(组合动作),按顺序执行动作 同时执行要被执行的动作 间歇动作(中间暂停指定时间),CCAction移动,移动(CCMoveBy与CCMoveTo)创建对象:利用CCMoveBy(To).action(float duration, CGPoint pos) 。参数说明: duration持续时间,pos代表目标点不同点:CCMoveBy指定的CGPoint 是相对坐标即相对于当前的需要移动的精灵。 CCMoveTo指定CGPoint 是绝对坐标。 CCMoveBy将reverse()方法进行了处理,而CCMoveTo返回null值。当我们需要实现精灵的反复移动时使用CCMoveBy将很轻松的完成。应用场景:如游戏过关后会有一个箭头反复提示你前进的路线。首先我们需要使用CCSequence将一组移动的效果添加到一起,实现单次往返,再利用CCRepeatForever实现反复动作。,CCAction弹跳,弹跳(CCJumpBy与CCJumpTo)创建对象: CCJumpBy (To).action(float time, CGPoint pos, float height, int jumps)参数说明: time代表持续时间, pos代表目标点, height代表跳跃的高度,jumps代表跳动次数区别: CCJumpBy将 reverse()方法进行了处理,可以用于实现重复动作;应用场景:,CCAction贝塞尔曲线运动,贝塞尔曲线运动(CCBezierBy)创建对象:CCBezierBy(To).action(float t, CCBezierConfig c)参数说明: t代表持续时间, c曲线参数, CCBezierConfig.controlPoint_1起始点、CCBezierConfig.controlPoint_2顶点、CCBezierConfig.endPosition终点应用场景:子弹,pvz中屋顶关卡,CCAction渐快,渐快(CCEaseIn)对象创建: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与CCRotateTo)创建对象:CCRotateBy(To).action(float t, float a)参数说明:t代表持续时间,a代表旋转角度区别: CCScaleBy将 reverse()方法进行了处理,可以用于实现重复动作; CCRotateTo以最便捷的方式旋转到指定角度,如旋转角度为300时,使用CCRotateTo来实现的话会逆时针旋转60度应用场景:进度条旋转、旗子的左右摆动等特别注意:旋转动作是沿着锚点完成的,所以需要结合锚点统一协调旋转动作,CCAction颜色渐变动作,颜色渐变动作(CCTintBy与CCTintTo)创建对象: CCTintBy(To). 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, CCFiniteTimeAction. actions)对象说明:用于按顺序执行一连串动作,CCAction并发动作,并发动作CCSpawn对象创建:CCSpawn.actions(CCFiniteTimeAction action1, CCFiniteTimeAction. params)参数说明:指定一连串动作同时触发,如在跳跃过程中执行一个旋转动作。,CCAction间歇动作,间歇动作(CCDelayTime)对象创建:CCDelayTime. action(float t)参数说明:t 停止时间,即时动作(CCInstantAction),瞬时动作:就是不需要时间,马上就完成的动作。Cocos2d提供以下瞬时动作:放置 Place效果类似于 node.Position = ccp(x, y)。之所以作为一个动作来实现是为了可以与其他动作形成一个连续动作。隐藏 Hide效果类似于 node setVisible:NO. 之所以作为一个劢作来实现是为了可以与其他动作形成一个连续动作。显示 Show效果类似于 node setVisible:YES. 之所以作为一个动作来实现是为了可以与其他动作形成一个连续动作。可见切换 ToggleVisibility,CCAction显示隐藏,可见性(CCHide与CCShow )对象创建:调用action方法即可,无参数,CCAction无限动作,无限动作CCRepeatForever无限制的执行一个延时动作,通常用于连续执行一连串的重复动作,这些动作多放置在CCSequence中进行定义。,CocosDenshion Audio声音引擎,SoundEngine处理声音声音类型:音乐和音效可以从长短上来做区分,音乐一般用于游戏的背景声音,音效主要是短小的声音,如植物发射子弹,僵尸吃植物时发出的声音声音控制,如播放、暂停、声音大小调节、静音通过缓存音乐和音效文件来提高声音处理的效率,小案例,故事情景:在一个九曲十八弯的小路上,一个僵尸冒着大雪前行。最后雪停了,僵尸高兴的跳起了骑马舞。,案例分析,元素分析地图(Tiled绘图工具)僵尸飘雪的场景背景音乐切换,游戏地图制作,地图制作工具: Tiled绘图工具图层:展示整体效果块层:依据块划分图片后,整张图片会变成一个块层块:块层中的一个单元对象层:单独一层,放置一些指定的对象,游戏地图加载,加载:CCTMXTiledMap.tiledMap(name);添加到当前显示层,存在问题:无法进行图片的移动用户的touch事件处理:setIsTouchEnabled(true);CCTMXTiledMap.touchMove(MotionEvent event, CCTMXTiledMap tiledMap);存在问题:地图移动获取图片大小,设置图片位置为宽高的一半设置锚点为0.5,0.5,对象层加载,对象层功能保存着僵尸需要移动的点的坐标信息加载 CCTMXTiledMap.objectGroupNamed(String groupName);获取到CCTMXObjectGroup对象,该对象的objects字段中存储着对象层中元素信息,对该集合进行遍历,获取其中保存的坐标信息。,僵尸动作,移动规则:僵尸需要按照点的先后顺序进行连续移动实现方式:方案一:每次移动都创建一个动作,按顺序添加到CCSequence中方案二:递归方案三:执行回调动作(CCCallFunc),在动作执行完成后立即执行的动作。通过反射调用一个指定的方法,方法里面完成后续相关动作行走过程中播放序列帧利用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);/应对十以内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。经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等等。实现步骤:CCParticleSystem system= CCParticleSnow.node();system.setTexture(CCTextureCache.sharedTextureCache().addImage(f.png);this.addChild(system, 1);自定义效果:制作工具ParticleDesigner,使用工具将效果导出成.plist文件CCParticleSystem ps=CCParticleSystemPoint.particleWithFile(f.plist);ps.setPosition(0,winSize.height);addChild(ps);,游戏暂停处理,处理游戏暂停思路当前的主CCLayer处于暂停状态,处于暂停状态的CCLayer无法接收到用户的触摸事件在主CCLayer暂停之前需要启动另外一个CCLayer显示,除提示玩家游戏已经暂停外,如果玩家需要切换到游戏界面需要点击当前的CCLayer中的按钮完成继续游戏的处理。注意:1、该暂停用CCLayer必须添加到与主CCLayer相同的parent下,不能再主CCLayer继续添加2、点击完成时需要清除当前显示的CCLayer核心方法:onEnter()游戏继续 onExit()游戏暂停,植物vs僵尸,界面构成欢迎界面(界面展示logo等信息)主界面(游戏模式选择)对战界面,欢迎界面,背景音乐播放背景音乐机音效的预加载创建BaseLayer,管理各个界面用到的公共信息,在BaseLayer中利用SoundEngine加载背景音乐,同时加载按钮的点击音效,由于这些资源只需要加载一次,所以在静态代码块中完成。图片资源加载Logo展示进度条处理版本信息加载更新版本获取,菜单界面,CCMenu菜单使用调用CCMenu menu = CCMenu.menu();获取CCMenu对象。通过给menu添加CCMenuItem完成菜单项的添加。CCMenuItem菜单项调用CCMenuItem item = CCMenuItemSprite.item(CCSprite.sprite(resPath + “start_adventure_default.png”), CCSprite.sprite(resPath+ “start_adventure_press.png”), this,“onClick”);创建菜单项参数说明:第一个参数为按钮默认显示的内容,第二个参数为点击时显示的内容,第三个参数指定目标对象(利用反射调用指定对象的方法),第四个参数为调用的方法名(查看代码,该方法需要传递一个Object的参数),对战,地图展示植物选择开始游戏对战处理,地图展示,展示对战界面(展示时间:一秒钟)获取展示僵尸点位信息添加展示用僵尸,伴随着序列帧的播放平移地图,显示展示用僵尸,地图加载和僵尸展示,利用CCTMXTiledMap处理地图,地图无需处理拖动设置锚点为中心位置设置坐标为地图的中心解析地图中僵尸位置信息CCTMXTiledMap.objectGroupNamed(String groupName)获取指定名称的CCTMXObjectGroup获取CCTMXObjectGroup中objects信息,获取到分别以x和y为key存储的点位信息在这些点中任选部分点展示僵尸(僵尸原地不动的动作帧播放),对创建好的僵尸需要保存到一个容器当中,当地图移动到对战界面时这些僵尸需要被销毁,界面展示顺序,对战地图展示后停顿1秒动作的载体:地图移动到僵尸展示界面动作的载体:地图1秒钟后展示所有植物和植物选择框动作的载体:已选和可选容器实现方式:在地图的系列动作后添加CCCallFunc也可以利用CCCallFuncND指定参数在同一个方法中完成一系列动作,植物选择,显示两个容器玩家已选植物容器准备玩家已有植物信息玩家已有植物容器 玩家选择植物选择植物的处理取消植物的处理,植物信息加载,封装展示用植物唯一标示:预加载部分植物信息,模拟用户已有植物,每种植物均分配一个唯一标示信息,创建bean对象时需要指定该标示信息图片:显示植物的图片当用户选择后需要在原地留有一个灰色的图片消耗阳光数预加载部分植物信息构造中指定标示信息,设置图片锚点(0,0),背景图改变透明度(100),植物选择,处理步骤:判断用户touch点在可选容器中还是已选容器中在可选容器中需要判断是否点击的是“一起摇滚吧”当点击可选容器中的植物时,需要循环当前可选容器中的植物信息,判断那个植物被点击,将点击的植物移动到已选容器中,目标点需要依据已选容器中信息判断在已选容器中判断那个植物被点击,点击植物移动到保留的初始点在被点击植物后面的植物需要进行前移一个位置的动作,开始游戏,“一起摇滚”点击,但此时并没有真正的开启游戏,需要限制用户操作已选植物判断限制用户选择植物个数向日葵检查清理展示用僵尸清理玩家已有植物容器对用户已选植物容器进行处理移动地图到对战界面播放一组序列帧(准备安放植物)将播放序列帧精灵清除真正游戏开始,传递信息到游戏控制类地图(对战layer )+玩家选择植物,对战处理,战场划分将整个对战地图划分为五个行战场,以行为单位处理业务,当一个行战场业务处理完成后,整个对战地图对战业务完成战场元素,对战基本元素,BaseElement继承CCSprite 处理内容:创建:通过构造指定元素图片信息基本动作消亡(死亡监听)包含的内容:产物、僵尸、植物,产物,包括子弹、阳光、金币信息处理内容:通过构造指定元素图片信息,产物子弹,子弹类型:豌豆(一个或多个)、其他类型属性:伤害值、移动速度方法:移动,僵尸,处理内容:构造传递资源图片属性记录僵尸运动的起点和终点攻击力、移动速度、生命值动作处理攻击、被攻击、移动,植物,处理内容植物分类:生产、攻击、防御植物属性:生命值、所处的行列号、射程(块数)将所有植物的锚点定义在(0.5f, 0)被攻击处理(可以在当前类中完成)对生命值进行减少操作,减少依据传递的参数信息,当生命值小于等于零时,销毁植物,植物防御植物,处理内容:大生命值坚果:生命值:200原地摇摆,植物生产植物,处理内容:生产功能(每隔一个时间段触发),产品包括:阳光、金币向日葵:生命值:100生产功能:开启定时任务,每隔5秒生产一个阳光,植物攻击植物,处理内容:建立存储子弹的集合攻击方式:创建攻击用子弹监听子弹的消亡当子弹消亡时需要从集合中清除,产物阳光,生成方式:由生产植物创建(向日葵、阳光菇)系统生成依据阳光数量多少进行划分(大小)动作处理:基本动作:围绕中心点旋转移动动作:指定起始点、顶点和终点阳光收集:利用集合保存生成阳光,当被用户收集或到时自动从集合中清除保存阳光总数,当用户收集时数量变化,产物普通豌豆,基本配置速度:60攻击力:100移动动作:移动的起始点植物,终点地图边缘,如果这之间存在僵尸则遇到僵尸消失,初级僵尸基本动作,构造处理:无参构造用于展示僵尸种类有参构造指定起始点和终点僵尸图片确定属性处理:设置生命值(100)、攻击力(10)、移动速度(10)帧动作处理:基本动作、移动、攻击、被攻击(移动中死亡、攻击中死亡),初级僵尸行走,计算完成移动的时间利用公式:t=s/v计算僵尸当前的位置到移动的终点的距离利用设置好的速度值(10),完成移动动作当僵尸移动到终点时触发gameover移动过程中伴随着行走序列帧的播放,初级僵尸攻击,记录僵尸攻击状态,当僵尸已经处于攻击状态时不触发再次攻击如果僵尸未处于攻击状态时修改攻击状态记录攻击目标停止当前所有动作开启攻击动作持续杀伤开启定时任务,每隔0.5秒完成一次减血操作每次减血前判断当前攻击目标的生命值当生命值大于零时,调用被攻击目标的被攻击方法,传递当前僵尸的攻击力当生命值小于零时停止攻击定时任务修改攻击状态停止攻击动作开启行走动作,初级僵尸被攻击,判断生命值,当生命值大于零时减少生命值,依据传递的攻击力数值进行处理当生命值小于零时停止僵尸的所有动作播放僵尸脑袋掉下来的序列帧,之后播放慢慢趴在地上的序列帧,最后僵尸销毁。如果此时将死在攻击植物,需要停止攻击植物的定时任务。,攻击植物豌豆射手,基本属性生命值100攻击方式普通攻击植物:生产豌豆设置豌豆的基本参数调用豌豆的移动方法将豌豆添加到当前的CCLayer中添加豌豆到豌豆射手的子弹集合中当生产出的豌豆没有消失前,攻击植物不会再创建豌豆建立子弹与植物的监听关系,当子弹消亡时需要将子弹从植物的集合中清除,对战业务,战场控制对战逻辑处理交由游戏控制类完成GameContorller初始化行战场,为每个行战场指定一个行号控制僵尸的添加处理用户的添加植物操作阳光数管理每一独立的行战场由FightLine进行管理僵尸攻击植物植物攻击僵尸,游戏控制添加僵尸,僵尸行进路线加载添加僵尸到行战场在行战场中创建一个集合,用于存储添加到当前行中的僵尸战场控制僵尸种类僵尸添加的总数僵尸添加的速度控制进度我们在应用中作简单处理,即加载完僵尸行动路线后,每隔一个固定的时间段添加一种僵尸,对游戏进度暂不做控制。,游戏控制添加植物,处理用户点击事件判断是否开始游戏如果处于序列帧播放阶段,不处理用户点击请求判断用户点击点位当点击选择植物时,工作如下:需要判断是否已经选择植物,如果选择了需要还原选中状态,将已选信息清空;获取点击植物信息,判断当前阳光数是否满足创建该植物需求;缓存用户点击的可选植物容器中的植物信息,改变图片的透明度;依据植物的唯一标示进行植物对象创建当未点击植物时,需要判断当前用户是否选择了植物当选择植物了,需要判断当前用户点击的点在地图上的行和列信息,判断是否可以进行植物安放当未选择植物时,需要判断玩家是否在进行收集阳光的操作,游戏控制添加植物,是否可以添加植物判断的内容:玩家阳光数是否满足需求(后续完善)判断当前用户点击的位置是否在可以添加植物的行和列判断当前行和列是否已经添加了植物,具体的判断工作交由FightLine完成行列号计算获取用户点击坐标(转换后)计算行列号(地图)x轴:使用x除以块的宽度y轴:使用屏幕高度减y坐标除以块高度计算对应的安放植物的坐标(数组:计算数组的横纵索引,即在当前行列号基础上减一),游戏控制添加植物,添加植物依据植物的行号信息,获取行战场判断是否可以添加该植物到获取的行战场中如果满足要求,添加植物到行战场,同时显示在CCLayer中修改选中状态阳光数更新清空缓存对象:当前选择植物,当前选中植物行战场中添加植物构建添加到当前行战场中的植物集合,以列为key存储植物信息判断是否可以添加植物判断该集合中,对应的列上是否含有植物,以列号为key攻击植物的处理当判断添加进来的植物是攻击植物时,需要单独建立一个攻击植物集合,游戏控制僵尸攻击植物,攻击的触发:在FightLine创建时,开启一个定时任务,每个一个时间段触发一下攻击事件业务处理:判断当前的FightLine中是否含有僵尸如果含有,需要对僵尸进行循环,判断每个僵尸所在的列中是否含有植物如果含有植物进行攻击攻击处理调用僵尸的攻击方法植物被吃掉的处理当植物被僵尸吃掉之后需要在FightLine的植物集合中清除对应植物信息,清空的集合包括所有的植物集合和攻击的植物集合。清空的触发:使用死亡监听机制,当植物被销毁时通知监听者死亡监听创建接口,监听者需要实现该接口处理元素销毁操作当对战元素销毁时需要进行监听处理,即在BaseElement中的destroy方法中添加监听的触发。当前的行战场需要实现接口,处理元素销毁时的操作在行战场中添加植物时,关联当前行战场和植物,游戏控制植物攻击僵尸,攻击触发在FightLine创建时,开启一个定时任务,每个一个时间段触发一下攻击事件业务处理每隔一个时间段判断当前列中是否含有僵尸如果有僵尸,检查是否含有攻击植物如果含有攻击植物,发射豌豆攻击处理在攻击僵尸时需要获取到当前战场中跑的最慢的那个僵尸,如果跑的最慢的僵尸的x坐标在攻击植物的右侧(即x坐标大于当前的攻击植物),才进行攻击调用植物的攻击方法,游戏控制阳光,阳光的管理:阳光数的显示通过植物生产阳光收集阳光建造植物时增加阳光判断建造完植物时减少阳光阳光的增加和减少时都需要更新可选植物容器的显示样式,即阳光数不够的植物修改透明度,游戏进度更新,CCProgressTimer对象创建:CCProgressTimer.progressWithFile(“res)设置进度条类型:CCProgressTimer.setType(int newType)进度条值的改变: CCProgressTimer.setPercentage(float percentage),

    注意事项

    本文(植物大战僵尸ppt课件.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开