/* 说明:

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

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

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

*/

***每一步对应的所有代码以及用到的资源都会打包在最后给出

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

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

***为了方便移植到手机上,对于每一步都进行编译android测试;因为很多时候代码在win32下可以,编译就会出错,给出的代码会是测试过后的。

本次笔记内容:

1、完成的效果

2、设计思路

3、按照设计思路看代码

4、下节内容预览

5、本节源码&资源下载

一:完成效果

按照前面的设计,我们需要能够增加点在屏幕上,也要能删除已有的点,并且有按钮控制切换Type,点击屏幕编辑不同的点

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

效果图:

二:设计思路

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

2、对于那么多点,我们需要用容器装着,然后可以从容器删除,添加到容器

3、用一个操作层来添加一些按钮,方便编辑操作

关于操作方法,这里只实现changeMode,然后测试看到结果,其他按钮F5输出调用,方法由于和文件操作有关,留到下次笔记实现

三:按照设计思路看代码

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

bool PosBase::isClickMe(Point pos){//**3**根据posType 设置判断的半径float radius;if(_posType == enTowerPos){radius = Tower_Radius;}else{radius = Monster_Radius;}Point srcPos = Point(_pos.x-radius, _pos.y+radius);Point destPos = Point(_pos.x+radius, _pos.y-radius);if(pos.x >= srcPos.x && pos.x <= destPos.x && pos.y <= srcPos.y && pos.y >= destPos.y){return true;}return false;
}

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

方法在PosEditorLayer中添加如下

//**3**
Vector<PosBase*> m_towerPosList;
Vector<PosBase*> m_monsterPosList;

同时添加成员函数

void PosEditorLayer::editPos(Point pos){//**3**修改编辑函数PosBase* existPos = findExistPos(pos);if(existPos != NULL){deletePos(existPos);}else{createPos(pos);}
}PosBase* PosEditorLayer::findExistPos(Point pos){//**3**Vector<PosBase*>posList;if(_posType == enTowerPos){posList = m_towerPosList;}else{posList = m_monsterPosList;}for(auto ref : posList){auto tPos = dynamic_cast<PosBase*>(ref);if(tPos){if(tPos->isClickMe(pos)){return tPos;}}}return NULL;
}void PosEditorLayer::createPos(Point pos){//**3**PosBase* tPos = PosBase::create(pos, _posType,true);this->addChild(tPos);if(_posType == enTowerPos){m_towerPosList.pushBack(tPos);}else{m_monsterPosList.pushBack(tPos);}
}void PosEditorLayer::deletePos(PosBase* existPos){this->removeChild(existPos);if(_posType == enTowerPos){m_towerPosList.eraseObject(existPos);}else{m_monsterPosList.eraseObject(existPos);}}

那么到这里,测试,就可以达到点击屏幕创建任意位置得PosBase对象, 然后不想要的对象,再点击一次就消失
----------------------------------------------------------------------------------------------------------------------

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

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

next Level:编辑下一级的关卡

pre Level:编辑前一关卡

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

好吧,这里采用的方法是,弄一个PosEditorOprLayer层,层里有四个按钮, 那么这个层保留了PosEditorLayer的引用,四个按钮对应的功能就有PosEditorLayer 的引用去实现

看看PoaEditorLayer的四个方法:

void PosEditorLayer::changeType(){CCLOG("change Type");if(_posType == enTowerPos){_posType = enMonsterPos;}else{_posType = enTowerPos;}
}void PosEditorLayer::outputPosToPlistFile(){CCLOG("outputPosToPlistFile");
}void PosEditorLayer::nextLvl(){CCLOG("edit next level");
}void PosEditorLayer::preLvl(){CCLOG("edit pre level");
}

然后看看操作层

#include "cocos2d.h"
#include "PosEditorLayer.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;class PosEditorOprLayer : public Layer{
public:PosEditorOprLayer(); ~PosEditorOprLayer();static PosEditorOprLayer* create(PosEditorLayer* layer);virtual bool init(PosEditorLayer* layer);
private://**3**保留编辑层PosEditorLayer* _editorLayer;//**3**添加控件void addWins();//**3**outPut以及回调函数void outPutWin(Size visibleSize);void outputPosToPlistFile(Ref* pSender,Control::EventType event);//**3**改变Pos模式控件void changeTypeWin(Size visibleSize);void changePosType(Ref* pSender,Control::EventType event);//**3**下一关控件void nextLvlWin(Size visibleSize);void nextLvlToEditor(Ref* pSender,Control::EventType event);//**3**前一关控件void preLvlWin(Size visibleSize);void pretLvlToEditor(Ref* pSender,Control::EventType event);
};

.cpp

PosEditorOprLayer::PosEditorOprLayer(){_editorLayer = NULL;
}
PosEditorOprLayer::~PosEditorOprLayer(){CC_SAFE_RELEASE(_editorLayer);
}PosEditorOprLayer* PosEditorOprLayer::create(PosEditorLayer* layer){PosEditorOprLayer* oprLayer = new PosEditorOprLayer();if(oprLayer && oprLayer->init(layer)){oprLayer->autorelease();}else{CC_SAFE_DELETE(oprLayer);}return oprLayer;
}bool PosEditorOprLayer::init(PosEditorLayer* layer){if(!Layer::init()){return false;}CC_SAFE_RETAIN(layer);this->_editorLayer = layer;addWins();return true;
}void PosEditorOprLayer::addWins(){auto visibleSize = Director::getInstance()->getVisibleSize();//输出控件outPutWin(visibleSize);//改变Pos模式控件changeTypeWin(visibleSize);//nextLvlWin(visibleSize);//preLvlWin(visibleSize);
}void PosEditorOprLayer::outPutWin(Size visibleSize){auto btnTitle = Label::create("output","Arial",30);auto norSprite = Scale9Sprite::create("Button/public_ui_blue_btn.png");auto highLightSprite = Scale9Sprite::create("Button/public_ui_green_btn.png");auto outPutBtn = ControlButton::create(btnTitle,norSprite);outPutBtn->setBackgroundSpriteForState(highLightSprite,Control::State::HIGH_LIGHTED);outPutBtn->setPosition(ccp(visibleSize.width-norSprite->getContentSize().width/2,norSprite->getContentSize().height));outPutBtn->addTargetWithActionForControlEvents(this,cccontrol_selector(PosEditorOprLayer::outputPosToPlistFile),Control::EventType::TOUCH_UP_INSIDE);this->addChild(outPutBtn);
}
void PosEditorOprLayer::outputPosToPlistFile(Ref* pSender,Control::EventType event){_editorLayer->outputPosToPlistFile();
}

为了节省篇幅,这里只贴出output 按钮的控件和会滴函数,其他的类似

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

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

那么测试,点击屏幕,添加炮台,点击chang type 按钮, 之后,在点击屏幕,添加的是怪物的坐标

点击其他按钮,可F5在输出看到方法调用

四:下节内容预览

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

五:代码&资源

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

资源&代码

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

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

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

  1. 笨木头老师《卡牌塔防》学习中遇到问题记录

    首先感谢笨木头,<cocos2d-x 3.x开发之旅>是一本很精彩的书,很庆幸自己能坚持把最后的卡牌塔防的实例学完,现把实例学习中碰到问题记录下来,希望碰到问题的伙伴们能一起交流..... ...

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

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

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

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

  4. coco2d-x 3.0游戏实例学习笔记 《跑酷》 第二步---游戏界面amp;全新的3.0物理世界...

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

  5. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环amp;主角加入动作

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

  6. cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--button控制主角Jumpamp;Crouch

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

  7. 当年的三国java游戏_三国卡牌类手游塞班 分享问几年前玩的一个三国

    分享问几年前玩的一个三国卡牌手机游戏,好像是塞班...分享问几年前玩的一个三国卡牌手机游戏,好像是塞班,或者安卓的,单机的...是塞班的,之前也玩过.里面有霹雳车,攻城云梯,什么的.骑兵,枪兵,盾兵, ...

  8. 电脑运行时经常卡顿,只需三步就可以解决这个问题

    电脑运行时经常卡顿,只需三步就可以解决这个问题! 2018-08-19 18:40 来源:97视角 计算机作为互联网时代不可或缺的产物,很多人在使用它的时候都会出现各种各样的问题,例如打开某个软件或者 ...

  9. C++游戏编程:卡牌游戏

    CardGame 一段时间一直喜欢玩欢乐斗地主~~本来打算做出一个"跑得快"(有的地方叫争上游),技术有点欠缺,于是做出了一个类似打牌的卡牌游戏. 玩家将与两个电脑玩家进行游戏,一 ...

最新文章

  1. spring-cloud eureka注册发现
  2. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170319
  3. android模拟器启动没有拨号功能
  4. python wxpython backend wxagg_如何刷新wx.面板正确地?
  5. SAP Spartacus单元测试用例中Component构造函数的调用上下文
  6. Java中的PrintWriter的write方法和print方法的区别是什么?
  7. Web开发者一定会用的5个google浏览器插件
  8. java定时运行一个url_Swift 4:如何异步使用URLSessionDataTask但请求是否在一个定时队列中?...
  9. printf 小代码 大问题
  10. The Most Important Skill for Software Architects
  11. 我是怎么定义微服务平台?
  12. MathType中公式不对齐怎么办
  13. 【Flask】flask不能访问静态文件问题
  14. bootdo项目war包部署流程
  15. Java Applet及其应用
  16. 苹果一体机电脑计算机图标找不到,mac电脑airplay图标不见了怎么办
  17. Win10 安装 Tomcat 解压版
  18. bzoj1488[HNOI2009] 图的同构
  19. LeetCode题解:707.设计链表
  20. 使用cmd查看电脑显卡的信息

热门文章

  1. 【UE4】4.26安卓打包流程
  2. python turtle绘图中角度坐标系的绝对零度方向是_ABAQUS 子程序VUMAT 的坐标系的问题的讨论...
  3. 易中天品汉代风云人物12:刘邦对手之谜
  4. 自然语言处理入门(7)——基于TF-IDF的文本自动打标
  5. 无人叉车市场现状与发展趋势分析|无人叉车专题(一)
  6. 基础篇:3.1.4)注塑件-热熔
  7. Android studio推荐插件以及升级后插件丢失问题解决
  8. D530实用小技巧、使用中的问题、app2sd后的问题
  9. 麦咖啡未来三年将投资25亿,在中国内地布局超过4000家
  10. php 传递指针,windtear 追求完美