`
jishublog
  • 浏览: 870570 次
文章分类
社区版块
存档分类
最新评论

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




分享到:
评论

相关推荐

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台发布、程序代码管理、两大应用商店发布产品。...

    Cocos2D-X游戏开发技术精解

    第1章 Cocos2D-X引擎的介绍 1 1.1 何为游戏引擎 1 1.1.1 游戏的核心—引擎 1 1.1.2 引擎的特点 2 1.1.3 知名的引擎介绍 4 1.1.4 引擎的分类 5 1.2 Cocos2D-X引擎的来历 8 1.3 引擎的版本 9 1.4 下载与安装 10 1.5 ...

    cocos2d-x游戏开发之旅

    介绍Cocos2d-x更高阶的内容,包括渲染效率的提高、动画、TexturePacker图片打包、Tiled地图游戏实例、定时器、函数回调、内存管理、数据保存、Csv文件读取。介绍Lua、有限状态机启蒙知识和应用。分享基于Cocos2d-X的...

    Cocos2d-x实战 C++卷,完整扫描版

    全书内容涵盖了Cocos2d-x的核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、数据交换格式、内存管理、性能优化、平台移植、程序代码管理、三大应用商店发布产品等。本书共29章,按内容结构可分为六篇...

    cocos2d-js-breakouts:突破教程游戏的Cocos2d-html实现

    突破(Cocos2D HTML 2.x) 突破教程游戏的Cocos2d-html实现。 玩游戏 所有其他实现均已存档: 概述 这是用Cocos2D HTML编写的示例突破游戏。 最新版本是2.2.2,并且将在发布3.0时更新或分支。 此版本可在台式机...

    Cocos2D权威指南

    此外,还介绍了如何进行应用的测试与发布,以及Cocos3D、Cocos2D-x、Cocos2D-HTML5、Cocos2D-Python等衍生技术。 《Cocos2D权威指南》全书共19章,分为三个部分:基础篇(第1~9章)系统讲解了Cocos2D v2.0的功能...

    Android和PHP开发最佳实践第2版(高清带详细目录书签)Pdf版及epub电子书版

    黄隽实编著的《Android和PHP开发*实践(第2版移动开发)》以一个完整的微博应用项目实例为...此外,书中还介绍了AndroidNDK的开发以及Android游戏开发的相关内容,包括OpenGL的使用、流行游戏引擎Cocos2d-x和Unity3D。

    Android和PHP开发最佳实践

    此外,本书还介绍了Android NDK的开发以及Android游戏开发的相关内容,包括OpenGL的使用、流行游戏引擎Cocos2d-x和Unity 3D。 本书适合于所有对Android和PHP技术有兴趣的读者。不管是客户端还是服务端的开发者,都...

    word源码java-BallGo:BallGo手机游戏

    Go是基于Cocos2d-x游戏引擎(版本3.10),主要使用C++语言编写的休闲益智类安卓手机游戏。Ball Go于2016-11-02上线腾讯应用宝。 项目团队 导师:李兰 队长:张明睿 队员:施文强、秦凯、王森、徐依依 成员分工 张...

    史上最全的ios开发源码

    游戏引擎类--基于cocos2d的连连看游戏 游戏引擎类--简单炸弹人小游戏源码 游戏引擎类--切水果游戏 游戏引擎类幸运大转盘的抽奖游戏 游戏引擎-推箱子游戏 游戏引擎之雷电游戏的激光子弹 指示器类 指示器(HUD)之...

    《程序员》杂志2012年第7期

    (4)Cocos2D-X for XNA游戏开发指南(下)—《TweeJump》项目实战 (5)iOS即时语音聊天技术实践 本文讲解了如何在iOS设备上实现语音聊天应用开发,主要介绍了语音应用开发中的语音录制、播放、编解码等技术。 ...

Global site tag (gtag.js) - Google Analytics