[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轴属性要设置低一点,不然红线显示不出来被地图遮盖了。

时间: 2024-09-10 13:34:07

[cocos2d-x]地图的应用的相关文章

Cocosd2d实例教程(三) Cocos2d瓦片地图的导入

上一节讲了如何使用Tiled制作瓦片地图,下面讲一下如何将地图导入游戏中. 第一步:将生成的文件导入resource中,如图,分别为地图和图片集 第二步:在HelloWorldLayer.h中修改代码,有一定基础的人还是比较好理解的. #import <GameKit/GameKit.h> // When you import this file, you import all the cocos2d classes #import "cocos2d.h" // Hello

cocos2d-x-关于cocos2d创建地图 vs2010报错

问题描述 关于cocos2d创建地图 vs2010报错 cocos2dx2.2.6版本 创建一个地图报错,怎么改 解决方案 野指针 ,把运行调用堆栈或者该位置代码贴上来吧,这里看不出来.

cocos2d 瓦片地图 如何获取 所有gid非零的瓦片集合或gid非零的坐标集合

问题描述 cocos2d 瓦片地图 如何获取 所有gid非零的瓦片集合或gid非零的坐标集合 获取 所有gid非零的瓦片集合或gid非零的坐标集合,不用for循环,有没有可用的函数, 解决方案 获取 所有gid非零的瓦片集合或gid非零的坐标集合,不用for循环,有没有可用的函数,

Cocos2D瓦块地图高清屏(retina)显示比例问题的解决

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在Cocos2D的游戏编程里,常用到瓦块地图.而cocos2D 3.4.9中在高清屏下地图的显示模式总是处在普清屏的状态,如下图所示: 可以看到地图中每一个瓦块相当模糊,这在retina屏中是不能接受的,在国内和国外论坛上都找了一番没有满意的解决办法. 后来自己尝试解决了,非常简单只是在App进入点加上一行: [CCDirector sharedDirecto

【Cocosd2d实例教程三】Cocos2d瓦片地图的导入

(转载请注明出处:http://blog.csdn.net/buptgshengod)    上一节讲了如何使用Tiled制作瓦片地图,下面讲一下如何将地图导入游戏中.     第一步:将生成的文件导入resource中,如图,分别为地图和图片集     第二步:在HelloWorldLayer.h中修改代码,有一定基础的人还是比较好理解的. #import <GameKit/GameKit.h> // When you import this file, you import all the

Cocos2D实现RPG游戏人物地图行走的跟随效果

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在一些RPG游戏中,人物队列在地图中行走的时候有时需要实现一个跟随效果,比如大家都玩过的FC游戏<<吞食天地>>. 效果为当队列只有一个人时,Ta可以自由在地图中行走,当队列多于一人时,我们让其他角色跟随在游戏主角之后行走,达到一种"萌萌的"拖尾效果. 如上图,可以看到游戏队列中有4位角色,但我们设定只显示后2位,当然后面跟着

【IOS-COCOS2D游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/图片缩放后模糊透明/图片不清晰【2013年12月13日补充】/动画播放出现毛边以及禁止游戏中自动锁屏问题!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/507.html 本章节主要为大家介绍在游戏开发过程中经常遇到的两个问题:  1. 解决滚屏背景或拼接地图有黑边! 对于游戏开发中,背景(游戏地图)是必要的元素之一,那么对于大部分游戏的背景都是动态,或者不断移动的:例如RPG中的背景随着人物.主角而移动,那么一般情况下背景都是由地图编辑器(图块)拼出来的,要不就

忍者无敌-实例讲解Cocos2d-x瓦片地图

实例比较简单如图所示地图上有一个忍者精灵玩家点击他周围的上.下.左.右他能够向这个方向行走.当他遇到障碍物后是无法穿越的障碍物是除了草地以为部分包括了树.山.河流等. 忍者实例地图TODO用这个精灵替换图中的 设计地图我们采用David Gervais提供开源免费瓦片集下载的文件dg_grounds32.gifgif文件格式会有一定的问题我们需要转换为.jpg或.png文件.本实例中我是使用PhotoShop转换为dg_grounds32.jpg.David Gervais提供的瓦片集中的瓦片是

Cocosd2d实例教程(二) 地图编辑器Tiled的安装使用

我们知道cocos2d是一个基于2d效果的游戏引擎,那么如果制作一个2d手机游戏我们需要创建相应的游戏画面,而cocos2d支持的游戏画面就是通过Tiled来制作的.这是一款通过通过像素来拼凑画面的软件,界面如下图所示 下面讲一下安装以及使用. 第一步:下载Tiled,地址:www.mapeditor.org 第二步:新建一个map,展示的是一个空的地图. 第三步:在地图的右下角加入一些图片集,这个在Tiled的example下面应该有,然后要做的就是拖动这些小的图片集拼凑大的地图!图片集可以从

Cocos2D-X入门(7)无限地图滚动

地图的滚动原理很简单,就是持续设置地图的位置即可.具体实现用schedule()函数. pMap = CCSprite::create("MapHenn.png"); pMap->setPosition(ccp(mSize.width/2, mSize.height/2)); this->addChild(pMap, 0); schedule(schedule_selector( SpriteScene::updateMap),0.1f); schedule()函数的作用就