/* 说明:

**1.本次游戏实例是《cocos2d-x游戏开发之旅》上的最后一个游戏,这里用3.0重写并做下笔记

**2.我也问过木头本人啦。他说:随便写,第一别全然照搬代码;第二能够说明是学习笔记---好人

**3.这里用cocos2d-x 3.0版本号重写,非常多地方不同。可是从重写过程中也非常好的学习了cocos2d-x

*/

***每一步相应的全部代码以及用到的资源都会打包在最后给出

***为避免代码过多,每一步的代码都做了标记--一看就晓得是第几步实现的避免出错改不回去(难不成还用Git?)

***能够依据设计思路(好吧。那名字太高大上。实际就是这一步要干啥)先自己实现---cocos2d-x本来就是如此。同样的功能有很多不同实现方法;先自己折腾是蛮不错的。

***为了方便移植到手机上,对于每一步都进行编译android測试。由于非常多时候代码在win32下能够。编译就会出错,给出的代码会是測试过后的。

本次笔记内容:

1、完毕的效果

2、设计思路

3、依照设计思路看代码

4、下节内容预览

5、本节源代码&资源下载

一:完毕效果

依照前面的设计,我们须要可以添加点在屏幕上,也要能删除已有的点,而且有button控制切换Type,点击屏幕编辑不同的点

能有button控制编辑不同级别关卡的地图,已经输出本关卡内容到文件

效果图:

二:设计思路

1、首先对于屏幕上已有的点,我们要能再次点击能将其删除,那么须要PosBase里面有点击范围推断

2、对于那么多点,我们须要用容器装着。然后能够从容器删除,加入到容器

3、用一个操作层来加入一些button,方便编辑操作

关于操作方法。这里仅仅实现changeMode。然后測试看到结果。其它buttonF5输出调用。方法因为和文件操作有关,留到下次笔记实现

三:依照设计思路看代码

编辑坐标过程中,发现一个点位置放错,那么再点击这个点。让它消失。首先在PosBase里面加入方法:

  1. bool PosBase::isClickMe(Point pos){
  2. //**3**依据posType 设置推断的半径
  3. float radius;
  4. if(_posType == enTowerPos){
  5. radius = Tower_Radius;
  6. }
  7. else{
  8. radius = Monster_Radius;
  9. }
  10.  
  11. Point srcPos = Point(_pos.x-radius, _pos.y+radius);
  12. Point destPos = Point(_pos.x+radius, _pos.y-radius);
  13.  
  14. if(pos.x >= srcPos.x && pos.x <= destPos.x && pos.y <= srcPos.y && pos.y >= destPos.y){
  15. return true;
  16. }
  17. return false;
  18. }

然后考虑。在PosEditorLayer里面。触摸到一个点的时候,我们调用editPos, 那么这里我们首先须要的是,用一个容器把全部的点保存起来,然后每次 触摸之后,看看这个点是否已经存在。若存在,则删除。不然測创建一个PosBase,增加容器,

方法在PosEditorLayer中加入例如以下

  1. //**3**
  2. Vector<PosBase*> m_towerPosList;
  3. Vector<PosBase*> m_monsterPosList;

同一时候加入成员函数

  1. void PosEditorLayer::editPos(Point pos){
  2. //**3**改动编辑函数
  3. PosBase* existPos = findExistPos(pos);
  4.  
  5. if(existPos != NULL){
  6. deletePos(existPos);
  7. }
  8. else{
  9. createPos(pos);
  10. }
  11. }
  12.  
  13. PosBase* PosEditorLayer::findExistPos(Point pos){
  14. //**3**
  15. Vector<PosBase*>posList;
  16. if(_posType == enTowerPos){
  17. posList = m_towerPosList;
  18. }
  19. else{
  20. posList = m_monsterPosList;
  21. }
  22.  
  23. for(auto ref : posList){
  24. auto tPos = dynamic_cast<PosBase*>(ref);
  25.  
  26. if(tPos){
  27. if(tPos->isClickMe(pos)){
  28. return tPos;
  29. }
  30. }
  31. }
  32. return NULL;
  33. }
  34.  
  35. void PosEditorLayer::createPos(Point pos){
  36. //**3**
  37. PosBase* tPos = PosBase::create(pos, _posType,true);
  38.  
  39. this->addChild(tPos);
  40.  
  41. if(_posType == enTowerPos){
  42. m_towerPosList.pushBack(tPos);
  43. }
  44. else{
  45. m_monsterPosList.pushBack(tPos);
  46. }
  47. }
  48.  
  49. void PosEditorLayer::deletePos(PosBase* existPos){
  50. this->removeChild(existPos);
  51.  
  52. if(_posType == enTowerPos){
  53. m_towerPosList.eraseObject(existPos);
  54. }
  55. else{
  56. m_monsterPosList.eraseObject(existPos);
  57. }
  58.  
  59. }

那么到这里,測试,就能够达到点击屏幕创建任何位置得PosBase对象。 然后不想要的对象,再点击一次就消失

----------------------------------------------------------------------------------------------------------------------

那么到这一步之后。发现,总是在加入删除默认的炮台类的点,想要加入删除怪物的路线点还得改动代码,那么这里就来加入一些操作button

changType:这个button随意切换 _posType 为炮台和怪物的坐标种类;

next Level:编辑下一级的关卡

pre Level:编辑前一关卡

outPut :将本关的 坐标点都输出到文件

好吧,这里採用的方法是。弄一个PosEditorOprLayer层,层里有四个button。 那么这个层保留了PosEditorLayer的引用,四个button相应的功能就有PosEditorLayer 的引用去实现

看看PoaEditorLayer的四个方法:

  1. void PosEditorLayer::changeType(){
  2. CCLOG("change Type");
  3. if(_posType == enTowerPos){
  4. _posType = enMonsterPos;
  5. }
  6. else{
  7. _posType = enTowerPos;
  8. }
  9. }
  10.  
  11. void PosEditorLayer::outputPosToPlistFile(){
  12. CCLOG("outputPosToPlistFile");
  13. }
  14.  
  15. void PosEditorLayer::nextLvl(){
  16. CCLOG("edit next level");
  17. }
  18.  
  19. void PosEditorLayer::preLvl(){
  20. CCLOG("edit pre level");
  21. }

然后看看操作层

  1. #include "cocos2d.h"
  2. #include "PosEditorLayer.h"
  3. #include "cocos-ext.h"
  4. USING_NS_CC;
  5. USING_NS_CC_EXT;
  6.  
  7. class PosEditorOprLayer : public Layer{
  8. public:
  9. PosEditorOprLayer();
  10. ~PosEditorOprLayer();
  11.  
  12. static PosEditorOprLayer* create(PosEditorLayer* layer);
  13. virtual bool init(PosEditorLayer* layer);
  14. private:
  15. //**3**保留编辑层
  16. PosEditorLayer* _editorLayer;
  17.  
  18. //**3**加入控件
  19. void addWins();
  20.  
  21. //**3**outPut以及回调函数
  22. void outPutWin(Size visibleSize);
  23. void outputPosToPlistFile(Ref* pSender,Control::EventType event);
  24.  
  25. //**3**改变Pos模式控件
  26. void changeTypeWin(Size visibleSize);
  27. void changePosType(Ref* pSender,Control::EventType event);
  28.  
  29. //**3**下一关控件
  30. void nextLvlWin(Size visibleSize);
  31. void nextLvlToEditor(Ref* pSender,Control::EventType event);
  32.  
  33. //**3**前一关控件
  34. void preLvlWin(Size visibleSize);
  35. void pretLvlToEditor(Ref* pSender,Control::EventType event);
  36. };

.cpp

  1. PosEditorOprLayer::PosEditorOprLayer(){
  2. _editorLayer = NULL;
  3. }
  4. PosEditorOprLayer::~PosEditorOprLayer(){
  5. CC_SAFE_RELEASE(_editorLayer);
  6. }
  7.  
  8. PosEditorOprLayer* PosEditorOprLayer::create(PosEditorLayer* layer){
  9. PosEditorOprLayer* oprLayer = new PosEditorOprLayer();
  10.  
  11. if(oprLayer && oprLayer->init(layer)){
  12. oprLayer->autorelease();
  13. }
  14. else{
  15. CC_SAFE_DELETE(oprLayer);
  16. }
  17. return oprLayer;
  18. }
  19.  
  20. bool PosEditorOprLayer::init(PosEditorLayer* layer){
  21. if(!Layer::init()){
  22. return false;
  23. }
  24.  
  25. CC_SAFE_RETAIN(layer);
  26. this->_editorLayer = layer;
  27.  
  28. addWins();
  29.  
  30. return true;
  31. }
  32.  
  33. void PosEditorOprLayer::addWins(){
  34. auto visibleSize = Director::getInstance()->getVisibleSize();
  35.  
  36. //输出控件
  37. outPutWin(visibleSize);
  38.  
  39. //改变Pos模式控件
  40. changeTypeWin(visibleSize);
  41.  
  42. //
  43. nextLvlWin(visibleSize);
  44.  
  45. //
  46. preLvlWin(visibleSize);
  47. }
  48.  
  49. void PosEditorOprLayer::outPutWin(Size visibleSize){
  50.  
  51. auto btnTitle = Label::create("output","Arial",30);
  52. auto norSprite = Scale9Sprite::create("Button/public_ui_blue_btn.png");
  53. auto highLightSprite = Scale9Sprite::create("Button/public_ui_green_btn.png");
  54.  
  55. auto outPutBtn = ControlButton::create(btnTitle,norSprite);
  56. outPutBtn->setBackgroundSpriteForState(highLightSprite,Control::State::HIGH_LIGHTED);
  57. outPutBtn->setPosition(
  58. ccp(visibleSize.width-norSprite->getContentSize().width/2,
  59. norSprite->getContentSize().height));
  60.  
  61. outPutBtn->addTargetWithActionForControlEvents(
  62. this,
  63. cccontrol_selector(PosEditorOprLayer::outputPosToPlistFile),
  64. Control::EventType::TOUCH_UP_INSIDE);
  65.  
  66. this->addChild(outPutBtn);
  67. }
  68. void PosEditorOprLayer::outputPosToPlistFile(Ref* pSender,Control::EventType event){
  69. _editorLayer->outputPosToPlistFile();
  70. }

为了节省篇幅,这里仅仅贴出output button的控件和会滴函数。其它的类似

那么最后再PosEditorScene 里面  把操作层也增加

  1. auto posEditorOprLayer = PosEditorOprLayer::create(posEditorLayer); //依据编辑层来创建
  2. scene->addChild(posEditorOprLayer);

那么測试,点击屏幕,加入炮台,点击chang type button, 之后,在点击屏幕,加入的是怪物的坐标

点击其它button。可F5在输出看到方法调用



四:下节内容预览

那么节实现多Level 的关卡地图编辑,以及和文件打交道,每一关的点坐标都保存到文件。而且对于已保存的文件内容进行改动的话。也须要载入与解析问题



五:代码&资源

-------------------------------

资源&代码

-------------------------------

个人愚昧观点。欢迎指正与讨论

cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第三步---编辑器(2)---更方便很多其它操作更像编辑器的更多相关文章

  1. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第一步---開始界面&amp;关卡选择

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦.他说:随便写,第一别全然照搬代码:第二能够说 ...

  2. cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  3. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第二步---编辑器(1)--触摸加入点

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...

  4. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第六步---炮台&amp;点击炮台加入英雄&amp;英雄升级

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...

  5. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第0步---知识点总结&amp;效果预览&amp;设计思路

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏.这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写.第一别全然照搬代码:第二能够说 ...

  6. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第七步---英雄要升级&amp;属性--解析csv配置文件

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦.他说:随便写,第一别全然照搬代码:第二能够说 ...

  7. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第八部---怪物出场

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写.第一别全然照搬代码.第二能够说 ...

  8. cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机

    说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  9. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第一步--- 开始界面

    说明:这里是平局:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

随机推荐

  1. linux学习笔记22---命令diff和diff3

    diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...

  2. hdu 1213 (How Many Tables)(简单的并查集,纯模板)

    How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. django 模板报错

    "Requested setting TEMPLATE_DEBUG, but settings are not configured. You must either define the ...

  4. dirname(__FILE__) 的使用总结 2(转)

    比如当前文件是放在(d:\www\)下,文件名是test.php. 测试的代码如下: 复制代码 代码如下: <?php echo __FILE__ ; // 取得当前文件的绝对地址,结果:D:\ ...

  5. go 语言学习笔计之结构体

    go 语言中的结构体方法 结构体名称的大小写有着不同的意义: 小写表示不能被别的包访问 package main import "fmt" type Rect struct { w ...

  6. 关于css中层叠性的一点理解

    关于css层叠性的一点理解 标签(空格分隔): html css 我们平时在写css的时候会遇到这样的情况 <!DOCTYPE html> <html lang="en&q ...

  7. datatable.js 服务端分页+fixColumns列固定

    前言 记得还是15年的时候,工作需要,独自写后台管理系统..记得那时候,最让我头疼的不是后台逻辑,而是数据的列表展示. 列很多的时候,页面显示问题;分页样式问题;表格样式问题;数据加载...很多细节的 ...

  8. 用e2fsck修复受损的linux文件系统

    今天想尝试直接从linux deepin拷贝一些文件到windows 10而不重启电脑,所以就安装Ext2Mgr了并加载了linux的几个磁盘: / /home 再次重启系统想进入linux的时发现系 ...

  9. text样式

    text-stroke(文本描边)和text-fill-color(文本填充色)注意点: 目前这两个属性只有webkit内核的Safari和Chrome支持,例如: -webkit-text-stro ...

  10. 【Raspberry pi】GPIO注意事项

    1.GPIO编码的方法 第三列是树莓派板子上的自然编号(左边引脚为1-15,右边引脚为2-26),RPi.GPIO.setmode(GPIO.BOARD)采用这列编号 树莓派主芯片提供商Broadco ...