[cocos2d-x]地图的应用

简介:

前言:

cocos2d-x地图的应用最典型的例子就是塔防类游戏,下面我们就来简单学习一下地图的应用吧!

工具应用介绍:

我们应用的地图编辑软件是Tiled,一款免费的软件,首先是文件->新文件,然后地图->新图块导入图片资源,然后就可以在地图上绘制。


Tiled有四种方式可以编辑瓷砖地图,菜单位于软件界面的右上角。 
Stamp Brush(快捷键 B),可以把当前从瓷砖集中选择的瓷砖画在地图上; 
Bucket Fill(快捷键 F),可以填充空白区域或者由相同瓷砖连接起来的区 域; 
Eraser(快捷键 E),用于擦掉瓷砖; 
Rectangular Select(快捷键 R), 你可以选择一个区域,然后用Ctrl+c或者菜单项Edit > Copy来复制选中的区域, 接着Ctrl+v或者菜单项Edit > Paste粘贴到当前鼠标在地图上所处的位置 – 在实际使用中你会看到,其实在粘贴时,软件是自动却换到了Stamp Brush模式 进行粘贴的。还有个小技巧,如果想清除当前的瓷砖选择,只要鼠标右键点击一下就可以了。 

友情提醒:

一个图层上面不得使用两个图片上的资源,不然后面调用的代码编译会报错;

其次就是将图片资源和生成的tmx文件要保持在同级路径下,不然后面代码也会报错,当然也可以修改tmx下的图片资源路径来解决问题。


简单应用:

1.点击屏幕获取坐标点

bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) {     CCPoint point = this->tilePosFromLocation(pTouch->getLocation(), (CCTMXTiledMap *)this->getChildByTag(1));     CCLog("%f,%f",point.x,point.y);     return true; }  CCPoint HelloWorld:: tilePosFromLocation(CCPoint location,CCTMXTiledMap *tileMap) {     //pos是地图上的坐标,当前屏幕的坐标+地图的偏移量     CCPoint pos = ccpSub(location, tileMap->getPosition());     pos.x = (int)(pos.x / tileMap->getTileSize().width);     //(地图总块数*每块的像素 - 现在的y坐标)/ 每块的像素     //getMapSize().height是地图高度的瓷砖数     pos.y = (int)(((tileMap->getMapSize().height * tileMap->getTileSize().height - pos.y)) / tileMap->getTileSize().height);     CCLog("%f,%f",pos.x,pos.y);     return pos; }

2.鼠标点击地图,会显示对应的瓷砖块的属性

//获取瓷砖的属性     CCPoint playerindex = ccp(a,b);     //根据坐标点获取GID     int tiledid = layer->tileGIDAt(playerindex);     if (tiledid > 0) {   //根据GID获取指定瓷砖块的属性         CCDictionary *tiledic = (CCDictionary *)tileMap->propertiesForGID(tiledid);         //判断瓷砖块是否有属性,如果有就用它的属性,如果没有         if (tiledic) {             CCString * value = (CCString *)tiledic->objectForKey("isTree");             int va = value->intValue();             if (va == 1) {                 CCLog("这是一棵树");             }         }         else         {             CCLog("该瓷砖快没有属性");         }     }


Cocos2d: a:12,b:2

Cocos2d: 这是一棵树


3.点击对象图层获取对象图层的属性

/**************获取对象图层********************************/     CCTMXObjectGroup * objectLayer = tileMap->objectGroupNamed("objLayer");     //判断触摸点是否在对象图层上     bool isTouchInRectangle = false;     //获取对象图层的对象数目     int numObjects = objectLayer->getObjects()->count();          for (int i=0; i<numObjects; i++) {         //获取到这个对象的属性         CCDictionary * properties = (CCDictionary *)objectLayer->getObjects()->objectAtIndex(i);                  CCRect rect = getRectFromObjectPropertier(properties, tileMap);         //看看触摸点是否在对象图层上         if (rect.containsPoint(location)) {             isTouchInRectangle = true;             break;         }     }     if (isTouchInRectangle) {         CCLog("碰到图层了");     } 

CCRect HelloWorld::getRectFromObjectPropertier(cocos2d::CCDictionary *properties, cocos2d::CCTMXTiledMap *tileMap) {     //这里的valueForKey的四个参数是图层中默认有的属性     float x,y,width,height;     x = properties->valueForKey("x")->floatValue()+tileMap->getPosition().x;     y = properties->valueForKey("y")->floatValue()+tileMap->getPosition().y;     width = properties->valueForKey("width")->floatValue();     height = properties->valueForKey("height")->floatValue();     CCRect pos = CCRectMake(x, y, width, height);     return pos; }

4.点击图层能实现地图的移动(将点击的地方移动到屏幕的中央)

bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) {     CCPoint point = this->tilePosFromLocation(pTouch->getLocation(), (CCTMXTiledMap *)this->getChildByTag(1));     //CCLog("%f,%f",point.x,point.y);          //点击让地图移动     this->centerTileMapOnTileCoord(point,(CCTMXTiledMap *)this->getChildByTag(1));          return true; }

//让图层移动的方法 void HelloWorld::centerTileMapOnTileCoord(cocos2d::CCPoint tilePos, cocos2d::CCTMXTiledMap *tileMap) {     CCSize screenSize = CCDirector::sharedDirector()->getWinSize();     CCPoint screenCenter = CCPointMake(screenSize.width / 2, screenSize.height / 2);     tilePos = CCPointMake(tilePos.x, (tileMap->getMapSize().height - 1) - tilePos.y);     CCPoint scrollPosition = ccp(-(tilePos.x*tileMap->getTileSize().width),-(tilePos.y*tileMap->getTileSize().height));     scrollPosition.x+=screenCenter.x-tileMap->getTileSize().width/2;     scrollPosition.y+=screenCenter.y-tileMap->getTileSize().height/2;          scrollPosition.x=(MIN(scrollPosition.x, 0));     scrollPosition.x=(MAX(scrollPosition.x, -screenSize.width));     scrollPosition.y= (MIN(scrollPosition.y, 0));     scrollPosition.y= (MAX(scrollPosition.y, -screenSize.height));          //移动     CCAction * move = CCMoveTo::create(0.2f, scrollPosition);     tileMap->stopAllActions();     tileMap->runAction(move); }


5.在图层上划线

//如果是DEBUG版本就会出现,如果是RELEASE版本就不会出现这段代码 #ifdef DEBUG //画图 //draw函数是系统自动不断调用的 void HelloWorld::draw() {     //获取地图     CCNode * node = this->getChildByTag(1);     CCTMXTiledMap * tileMap = (CCTMXTiledMap *)node;     //获取对象图层     CCTMXObjectGroup * objectLayer = tileMap->objectGroupNamed("objLayer");     //设置画笔颜色     ccDrawColor4B(255, 0, 0, 255);     //一次遍历对象图层中每一块瓷砖     for (int i = 0; i<objectLayer->getObjects()->count(); i++) {         CCDictionary * properties = (CCDictionary *)objectLayer->getObjects()->objectAtIndex(i);         CCRect rect = this->getRectFromObjectPropertier(properties, tileMap);         this->drawRect(rect);     }          CCSize screenSize = CCDirector::sharedDirector()->getWinSize();     CCPoint center = CCPointMake(screenSize.width/2, screenSize.height/2);     ccDrawCircle(center, 10, 240, 8, true);          //线的宽度     glLineWidth(2.0f); }  void HelloWorld::drawRect(CCRect rect) {     CCPoint pos1,pos2,pos3,pos4;     pos1 = CCPointMake(rect.origin.x, rect.origin.y);     pos2 = CCPointMake(rect.origin.x, rect.origin.y + rect.size.height);     pos4 = CCPointMake(rect.origin.x + rect.size.width, rect.origin.y);     pos3 = CCPointMake(rect.origin.x + rect.size.width, rect.origin.y + rect.size.height);          ccDrawLine(pos1, pos2);     ccDrawLine(pos2, pos3);     ccDrawLine(pos3, pos4);     ccDrawLine(pos4, pos1); } #endif 


注意:地图的z轴属性要设置低一点,不然红线显示不出来被地图遮盖了。


















本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366376,如需转载请自行联系原作者
相关文章
|
存储 固态存储 大数据
阿里云服务器各收费项目最新收费标准与活动报价参考
阿里云服务器收费项目有实例价格、预留实例券、专有宿主机、块存储价格、存储容量单位包、带宽价格和快照服务价格,收费模式有包年包月和按量付费模式。2024年,阿里云继续推出各种云服务器的优惠,其中轻量应用服务器最低61元/1年,经济型e实例云服务器最低99元/1年,2核4G轻量应用服务器165元/1年,4核8G配置云服务器按量付费带宽模式最低299元/1年。本文为大家汇总了2024年阿里云服务器各个收费项目的最新收费标准与云服务器的最新活动报价,以供参考和了解。
1348 0
阿里云服务器各收费项目最新收费标准与活动报价参考
|
数据采集 Web App开发 JavaScript
Puppeteer自动化:使用JavaScript定制PDF下载
在现代Web开发中,自动化工具如Puppeteer可显著提升效率并减少重复工作。Puppeteer是一款强大的Node.js库,能够控制无头Chrome或Chromium浏览器,适用于网页快照生成、数据抓取及自动化测试等任务。本文通过示例展示了如何使用Puppeteer自动化生成定制化的PDF文件,并介绍了如何通过配置代理IP、设置user-agent和cookie等技术增强自动化过程的灵活性与稳定性。具体步骤包括安装Puppeteer、配置代理IP、设置user-agent和cookie等,最终生成符合需求的PDF文件。此技术可应用于报表生成、发票打印等多种场景。
557 6
Puppeteer自动化:使用JavaScript定制PDF下载
|
Web App开发 安全 前端开发
新一代WebOffice高版本谷歌Chrome打开、编辑、保存微软Office/金山WPS解决方案大盘点
随着互联网技术的不断发展,越来越多的企业开始采用在线办公模式,微软Office Word 是最好用的文档编辑工具,然而doc、docx、xls、xlsx、ppt、pptx等格式的Office文档是无法直接在浏览器中直接打开的,如果可以实现Web在线预览编辑OffIce,肯定会还带来了更高效、便捷的办公体验,为我们的工作带来了更多可能性。
1573 91
|
人工智能 自然语言处理 数据挖掘
免费获得AI的力量:探索顶级AI工具的免费替代品
免费获得AI的力量:探索顶级AI工具的免费替代品
500 0
免费获得AI的力量:探索顶级AI工具的免费替代品
|
移动开发 前端开发 数据处理
探索前端性能优化的新思路:使用Web Workers提升网页响应速度
传统的前端性能优化方法已经不能完全满足日益增长的网页需求。本文提出了一种新的思路,即利用Web Workers技术来提升网页的响应速度。通过将耗时的计算任务交给Web Workers处理,可以避免主线程阻塞,从而提高网页的用户体验。本文将介绍Web Workers的基本原理、使用方法以及在前端性能优化中的应用实例,帮助开发者更好地理解和运用这一技术。
|
弹性计算 Java 关系型数据库
阿里云的e实例评测
阿里云的e实例是一款针对个人开发者、学生、小微企业的入门级云服务器,旨在满足中小型网站建设、开发测试、轻量级应用等场景的需求。
515 5
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP 2023】基于知识迁移的跨语言机器阅读理解算法
近日,阿里云人工智能平台PAI与华南理工大学朱金辉教授团队、达摩院自然语言处理团队合作在自然语言处理顶级会议EMNLP2023上发表基于机器翻译增加的跨语言机器阅读理解算法X-STA。通过利用一个注意力机制的教师来将源语言的答案转移到目标语言的答案输出空间,从而进行深度级别的辅助以增强跨语言传输能力。同时,提出了一种改进的交叉注意力块,称为梯度解缠知识共享技术。此外,通过多个层次学习语义对齐,并利用教师指导来校准模型输出,增强跨语言传输性能。实验结果显示,我们的方法在三个多语言MRC数据集上表现出色,优于现有的最先进方法。
|
移动开发 小程序 Java
良心分享:基于Java+SpringBoot+Netty+WebSocket+Uniapp轻松搭建在线互动问答程序
本文将详细介绍如何基于你自己的开源项目搭建一个在线互动问答程序,包括微信小程序和H5网页版。 该项目服务端主要使用了Java + Spring Boot + Netty + WebSocket等技术栈,聊天客户端使用的是UniApp来轻松搭建微信小程序和H5网页端。
310 1
|
智能硬件
Prompt基础 | 3-Prompt的基本框架
Prompt基础 | 3-Prompt的基本框架
929 0
Prompt基础 | 3-Prompt的基本框架
|
存储 异构计算
FPGA片内RAM读写测试实验 1
FPGA片内RAM读写测试实验
649 0