下面我们呢来编写一个敌人类,这个类目前主要有如下几个功能:

  1. 实现各个方向的帧动画切换
  2. 从起点走到终点
  3. 可改变行走速度
  4. 到达终点后消失

是不是觉得功能有点少啊,还是那句话,以后慢慢添加。


写在最前面:

首先说说怎么实现上面说的这几个功能,流程如下:

第一步.首先我是定义了几个可能用到的私有变量

  1. //敌人图片
  2. CCSprite  * _creep;
  3. //怪物血量
  4. int _creepHP;
  5. //怪物移动速度,每秒多少像素
  6. float _CreepMoveSpeed;
  7. //当前路点序号
  8. int _wayPointNow;
  9. //当前方向
  10. int _nowDirection;
  11. //creep是否正在移动
  12. bool _moving;

这几个变量的用途很简单,大部分都能看懂,说说几个用途很乱的吧(新手没办法)

  1. //当前路点序号
  2. int _wayPointNow;

上面这个就是保存了敌人行走的路点序号,就是敌人刚刚走过的路点,比如:敌人走过了a路点,正向着b路点前进,_waypoint就是路点A 。这样说明白了吧。(路点我是为了测试自己瞎写的)

这个路点的序号作用是什么呢?

塔防吗,就要有敌人按照路径走到一个终点,在这走的过程中会有许多转弯的地方,敌人有一个行走的帧动画,在变化方向的时候,我们也要让动画做相应的改变,这样看着才有意思。我是这样让敌人切换转向的:通过比对当前路点和下一个路点得出相对的方向,也就是一个坐标系中a,b两点,b点在a点的上面还是下面,左还是右。得到这个方向之后我们就可以写个函数改变敌人的动画了。


第二步. 初始化一些参数

  1. //--------------对敌人进行初始化-------------------
  2. //设置移动速度
  3. _CreepMoveSpeed = 100;
  4. //设置血量
  5. _creepHP = 100;
  6. //初始化路点序列
  7. _wayPointNow = 0;
  8. //初始化当前方向
  9. _nowDirection= getDirection();
  10. //初始化精灵
  11. //_creep  = CCSprite::create("CloseNormal.png");
  12. //初始化是否正在移动
  13. _moving = false;
  14. _creep  = CCSprite::create();
  15. _creep->setTag(kSprite);
  16. _creep->setPosition(sHWorld->_wayPoint->getControlPointAtIndex(_wayPointNow));
  17. setDirectionAnimation(getDirection());
  18. this->addChild(_creep);

第17行的setDirectionAnimation就是一个改变动画方向的函数,其参数就是一个关于放心的枚举,getDirection就是计算方向.

第三步:永远运行的游戏逻辑

在初始化init函数最后加上

  1. schedule(schedule_selector(mC_Creep::gamelogic));

让每帧都调用gamelogic函数

  1. void mC_Creep::gamelogic( float dt )
  2. {
  3. /*  CCLOG("xy is %f %f",x,y);*/
  4. //如果不移动则运行
  5. if(!_moving) creepMove();
  6. if (_creepHP == 0 )
  7. {
  8. this->stopAllActions();
  9. this->unscheduleAllSelectors();
  10. sHWorld->_creepGroup->removeObject(this,true);
  11. this->removeChildByTag(kSprite,true);
  12. }
  13. }

首先判断,如果不是在移动就会判断一下,当HP为0 的时候(被敌人杀死,或者走到了终点我就设置HP 为0),我就做了一些释放,SHworld是用来保存所有的敌人的一个CCArray,作用以后再说。

看看CreepMove函数有什么东西:

  1. void mC_Creep::creepMove()
  2. {
  3. //1是computeFinishTime()计算直线行走的时间
  4. //2.是下一个露点的坐标
  5. CCActionInterval * t_Action = CCMoveTo::create(
  6. computeFinishTime(),//1
  7. sHWorld->_wayPoint->getControlPointAtIndex(_wayPointNow+1)//2
  8. );
  9. //修改标签,以方便获得
  10. t_Action->setTag(kSpeedAction);
  11. //生产一个回调函数动作
  12. CCCallFunc * callfun = CCCallFunc::create(this,callfunc_selector(mC_Creep::movebyActionCallBack));
  13. //生产一个系列动作,让移动完后调用movebyActionCallBack函数
  14. CCFiniteTimeAction * seq = CCSequence::create(t_Action,callfun,NULL);
  15. //生产速度动作,用于后面的炮弹减速效果
  16. CCSpeed * speedaction = CCSpeed::create((CCActionInterval *)seq,1.0f);
  17. speedaction->setTag(kSpeedAction);
  18. //设置成正在移动。前面有判断如果正在移动就不运作这个函数了
  19. _moving = true;
  20. //开始所有的动作
  21. _creep->runAction(speedaction);
  22. }

首先是一个moveto动画,computeFinishTime是用路程除以速度得到的时间,当然这路程是一小段一小段的直线距离。

最后看看

  1. void mC_Creep::movebyActionCallBack()
  2. {
  3. //设置成动作已经完成,可以调用creepMove()让精灵移动
  4. _moving = false;
  5. do
  6. {
  7. // CCLOG("pointnow is :%d",_wayPointNow);
  8. //改变当前露点。我们已经移动过来了
  9. _wayPointNow++;
  10. //如果下一个露点序号超出了,所有露点序列的范围
  11. if(_wayPointNow>(sHWorld->_wayPoint->count()))
  12. {
  13. //定制所有动作
  14. _creep->stopAllActions();
  15. //HP 设为 0 ,让它消失
  16. _creepHP = 0;
  17. //设置为永远在动,不让它再运行creepMove();
  18. _moving = true;
  19. break;
  20. }
  21. //修改动画
  22. setDirectionAnimation(getDirection());
  23. } while (0);
  24. }

基本上也就这个意思了,我是个新手水平肯定是不高的,如果有错误请指出,欢迎。

转载于:https://blog.51cto.com/farsa/1137360

cocos2d-x 2x 菜鸟编塔防 02 添加敌人相关推荐

  1. Unity_塔防游戏(7)敌人炮塔之间的Collider碰撞优化

    1.给炮塔Turret添加刚体和碰撞器: 2.给敌人和炮塔 添加两个层 Turret 和 Enemy 完成上面两部 再给 游戏prefab预制体 加上Turret 和 Enemy 层标签 3.Edit ...

  2. 用Unity开发一款塔防游戏(一):攻击方设计

    大家好.偶尔想起了这个手把手教学的.但现已长满杂草的坑,还是来挖几铲子. 这一期的游戏是最常见的类型之一--塔防. 塔防游戏相信大家并不陌生,几个主要元素如下: 1.敌方士兵 2.我方防御塔 3.我方 ...

  3. canvas塔防小游戏-保卫大司马

    项目地址: http://codeape.site:8181/#/protectTheHorse b站地址: https://www.bilibili.com/video/bv1xZ4y1v7ju 基 ...

  4. 使用Unity创建塔防游戏(Part1)

    How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...

  5. 微信小程序做塔防类游戏

    开发一款塔防游戏需要以下步骤: 设计游戏规则和关卡设计,包括塔防类型.敌人类型.塔类型.升级系统等. 使用微信开发者工具创建新的小程序项目. 使用小程序框架(WXML.WXSS和JavaScript) ...

  6. 微信塔防小游戏开发教程,唤境引擎制作塔防游戏分享

    今天带来的是塔防游戏制作攻略! 点击这里来下载工程文件, 点击这里可以下载工程中所用的素材哦~ 预览状态时敌人会从四个生成点随机生成,并且会自动寻路绕过黑色墙体走向红色终点.点击黑色墙体可以创建炮塔, ...

  7. 如何制作一个塔防游戏 Cocos2d x 2 0 4

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...

  8. (译)如何使用cocos2d制作一个塔防游戏:第三部分

    原文链接地址:http://www.iphonegametutorials.com/2011/04/19/cocos2d-game-tutorial-%E2%80%93-how-to-build-a- ...

  9. (译)如何做一个塔防游戏(cocos2d 2012-8-17)

    PS:一直关注http://www.raywenderlich.com/这个网站,前几天看了他们8月17发的一个塔防游戏教程,试了一下感觉不错,搜了一下没发现没有译成中文的(不知道现在有没有),就自己 ...

最新文章

  1. 管理已“死”,经营为王时代来临
  2. 千亿级市场赛道,阿里云视频云拿下 “三连冠”
  3. BCVP开发者说第4期:Remember.Core
  4. Silverlight+WCF 新手实例 象棋 棋子定位与象棋类(四)
  5. 几何画板中该如何插入公式
  6. ZXing实现扫描或选取图片识别二维码及条码功能
  7. for of 的基本用法
  8. 使用python制作属于自己的地铁图
  9. JAVA 仿XP画图板的总结
  10. 夜深人静写算法(九)- Dancing Links X(跳舞链)
  11. 好记性不如烂笔头,要保持学习
  12. 【软件project】 文档 - 银行业务管理 - 需求分析
  13. win11家庭版如何彻底关闭病毒实时保护
  14. bzoj3238 [ AHOI2013 ] --后缀自动机
  15. php语言中Excel表格导入数据库的方法详解
  16. (英国剑桥大学)部署机器学习中的挑战:案例研究综述(上)中文译文 Challenges in Deploying Machine Learnings: a Survey of Case Studies
  17. 基于 Python 的图书借阅管理系统(附报告源码)
  18. 学习笔记(2020.9.21)
  19. 采用七对策远离白内障
  20. c 语言的数据类型ppt,C语言第3章数据类型.ppt

热门文章

  1. 日志管理:(二)og4j.xml警告log4j:WARN The content of element type log4j:configuration m
  2. 再高深的 Python 面试难题,这门课都给你整得明明白白!
  3. 【年度盘点】10个热门Python练习项目
  4. 黑客秘籍:7个有趣的信息安全项目
  5. kubernetes之一步一个坑
  6. mysql每秒57000_MySQL 性能:使用 MySQL 5.7 实现每秒 50 万查询
  7. 匹配正则_Day233:正则表达式匹配方法 match()
  8. 关联查询的延迟加载是怎么实现的?
  9. 支付宝支付 - 构建支付表单填并提交
  10. 微信支付 - 支付中心回调通知