/* 说明:

**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里面加入方法:

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对象。 然后不想要的对象,再点击一次就消失
----------------------------------------------------------------------------------------------------------------------

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

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

next Level:编辑下一级的关卡

pre Level:编辑前一关卡

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

好吧,这里採用的方法是。弄一个PosEditorOprLayer层,层里有四个button。 那么这个层保留了PosEditorLayer的引用,四个button相应的功能就有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 button的控件和会滴函数。其它的类似

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

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

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

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

四:下节内容预览

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

五:代码&资源

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

资源&代码

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

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

转载于:https://www.cnblogs.com/jzssuanfa/p/6740005.html

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. 6、Cocos2dx 3.0游戏开发的基本概念找个小三场比赛

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...

最新文章

  1. 第二十七讲 微分方程组解的图像
  2. SAP ERP系统业务优化之采购订单追踪
  3. .NET分布式缓存Redis从入门到实战
  4. java解析url字符串,将字符串解析为URL
  5. [20171107]dbms_shared_pool.pin.txt
  6. Windows RDP协议重大漏洞后发现黑客开始大规模扫瞄
  7. TCP/IP学习笔记(3)----IP,ARP,RARP协议
  8. Linux各类压宿包的压缩和解压方法
  9. sublime基本命令和使用
  10. python基础1-字符串
  11. 收藏| 一些可供参考的游戏出海技术架构与经验总结
  12. python 视频分段_Python 视频文件的分割和合并
  13. 市政管理学试题及答案
  14. E3 1200 系列服务器,至强E3-1200 v2增加图形核心_服务器评测与技术-中关村在线
  15. 计算机主机号怎么产看,怎么查看笔记本电脑出厂编号
  16. 2021年读书节书单推荐
  17. 用户计算机脱域了如何处理,AD域计算机经常脱域
  18. 官网下载Eclipse(包含历史版本及该版本的子版本)
  19. 手机连接电脑不读手机的终极解决方案
  20. Scratch课程设计(一)

热门文章

  1. 你自己写春联吗?你会贴春联吗?还是毛笔墨水早就不见了?
  2. 《计算机应用基础》第三套作业,《计算机应用基础》第三套试卷和答案.doc
  3. doraemon的python 列表
  4. 万恶的咖喱味英文口音
  5. 【CJY学习笔记】Linux防火墙基本操作(基于centos7)
  6. 运维工程师历年企业笔试真题汇总
  7. 2020-10-8 用户注册界面简单代码
  8. 视频爬虫js逆向——我搜不到密参怎么办
  9. 前台--中台--后台,什么是中台呢?看这一篇足矣
  10. Faiss之PQ详解