`
frank__wang
  • 浏览: 22302 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

cocos2d-x 45度斜地图的应用

 
阅读更多

原文地址:http://blog.csdn.net/dingxiaowei2013/article/details/11894879


前言:

我们在做经典的格斗类的游戏的时候,场景常常用的是45°斜地图来创建的。下面我就来实现一个简单的Demo来展现一下斜地图的使用。

功能实现:

1.倾斜地图的加载;

2.点击地图居中;

3.主角只能在一定的范围内移动;

4.鼠标点击屏幕,主角移动一格,如果连续点击则主句不断的移动;

代码实现:

图层要设置z轴属性,方便可以隐藏主角:
在图层的属性中加上 cc_vertexz -400
如果前面的图层那就设置为automatic

在AppDelegate添加代码:

  1. //深度测试,方便实现遮盖效果
  2. CCDirector::sharedDirector()->setDepthTest(true);
  3. //Opengl渲染设置,如果地图有背景图层的话就需要加这句
  4. CCDirector::sharedDirector()->setProjection(kCCDirectorProjection2D);

Player类:

  1. #ifndef___5tilemap__Player__
  2. #define___5tilemap__Player__
  3. #include<iostream>
  4. #include"cocos2d.h"
  5. usingnamespacecocos2d;
  6. classPlayer:publicCCSprite
  7. {
  8. public:
  9. staticPlayer*create();
  10. virtualboolinitPlayer();
  11. voidupdateVertextZ(CCPointtilePos,CCTMXTiledMap*tileMap);
  12. };
  13. #endif/*defined(___5tilemap__Player__)*/

  1. #include"Player.h"
  2. staticPlayer*s;
  3. Player*Player::create()
  4. {
  5. s=newPlayer();
  6. if(s&&s->initPlayer()){
  7. s->autorelease();
  8. returns;
  9. }
  10. else
  11. {
  12. deletes;
  13. s=NULL;
  14. returnNULL;
  15. }
  16. }
  17. boolPlayer::initPlayer()
  18. {
  19. if(!CCSprite::initWithFile("ninja.png")){
  20. returnfalse;
  21. }
  22. returntrue;
  23. }
  24. voidPlayer::updateVertextZ(cocos2d::CCPointtilePos,cocos2d::CCTMXTiledMap*tileMap)
  25. {
  26. floatlowestZ=-(tileMap->getMapSize().width+tileMap->getMapSize().height);
  27. floatcurrentZ=tilePos.x+tilePos.y;
  28. this->setVertexZ(lowestZ+currentZ-1);
  29. }


HelloWorld.h:

  1. #ifndef__HELLOWORLD_SCENE_H__
  2. #define__HELLOWORLD_SCENE_H__
  3. #include"cocos2d.h"
  4. #include"Player.h"
  5. usingnamespacecocos2d;
  6. typedefenum{
  7. MoveDirectionNone=0,
  8. MoveDirectionUpperLeft,
  9. MoveDirectionLowerLeft,
  10. MoveDirectionUpperRight,
  11. MoveDirectionLowerRight,
  12. MAX_MoveDirections
  13. }EMoveDirection;
  14. classHelloWorld:publiccocos2d::CCLayer
  15. {
  16. public:
  17. //Method'init'incocos2d-xreturnsbool,insteadof'id'incocos2d-iphone(anobjectpointer)
  18. virtualboolinit();
  19. //there'sno'id'incpp,sowerecommendtoreturntheclassinstancepointer
  20. staticcocos2d::CCScene*scene();
  21. CREATE_FUNC(HelloWorld);
  22. virtualvoidccTouchesBegan(CCSet*pTouches,CCEvent*pEvent);
  23. CCPointlocationFromTouches(CCSet*touches);
  24. Player*player;
  25. CCPointplayableAreaMin,playableAreaMax;
  26. //获取瓷砖块的坐标
  27. CCPointtilePosFromLocation(CCPointlocation,CCTMXTiledMap*tilemap);
  28. //图层居中
  29. voidcenterTileMapOnTileCoord(CCPointtilePos,CCTMXTiledMap*tileMap);
  30. virtualvoidccTouchesEnded(CCSet*pTouches,CCEvent*pEvent);
  31. CCPointscreenCenter;
  32. CCTMXTiledMap*tileMap;
  33. CCRectupperLeft,lowerLeft,upperRight,lowerRight;
  34. CCPointmoveOffsets[MAX_MoveDirections];
  35. EMoveDirectioncurrentMoveDirection;
  36. voidupdate(floatdelta);
  37. CCPointensureTilePosIsWithinBounds(CCPointtilePos);
  38. };
  39. #endif//__HELLOWORLD_SCENE_H__

HelloWorldScene.cpp

  1. #include"HelloWorldScene.h"
  2. #include"SimpleAudioEngine.h"
  3. #include"Player.h"
  4. usingnamespacecocos2d;
  5. usingnamespaceCocosDenshion;
  6. CCScene*HelloWorld::scene()
  7. {
  8. //'scene'isanautoreleaseobject
  9. CCScene*scene=CCScene::create();
  10. //'layer'isanautoreleaseobject
  11. HelloWorld*layer=HelloWorld::create();
  12. //addlayerasachildtoscene
  13. scene->addChild(layer);
  14. //returnthescene
  15. returnscene;
  16. }
  17. //on"init"youneedtoinitializeyourinstance
  18. boolHelloWorld::init()
  19. {
  20. //1.superinitfirst
  21. if(!CCLayer::init())
  22. {
  23. returnfalse;
  24. }
  25. CCSizesize=CCDirector::sharedDirector()->getWinSize();
  26. //添加一个地图
  27. CCTMXTiledMap*tileMap=CCTMXTiledMap::create("huohuo.tmx");
  28. //CCTMXTiledMap*tileMap=CCTMXTiledMap::create("isometric.tmx");
  29. //tileMap->setAnchorPoint(CCPointMake(size.width/2,size.height/2));
  30. //tileMap->setPosition(CCPointMake(size.width/2,size.height/2));
  31. CCSizes=tileMap->getContentSize();
  32. CCLog("width:%f",-s.width/2);
  33. tileMap->setPosition(ccp(-s.width/2,0));
  34. this->addChild(tileMap,-1,1);
  35. this->setTouchEnabled(true);
  36. this->tileMap=tileMap;
  37. //添加主角精灵
  38. player=Player::create();
  39. player->setPosition(CCPointMake(size.width/2,size.height/2));
  40. player->setAnchorPoint(ccp(0.3f,0.1));
  41. this->addChild(player);
  42. constintborderSize=10;
  43. playableAreaMin=CCPointMake(borderSize,borderSize);
  44. playableAreaMax=CCPointMake(tileMap->getMapSize().width-1-borderSize,tileMap->getMapSize().height-1-borderSize);
  45. screenCenter=CCPointMake(size.width/2,size.height/2);
  46. upperLeft=CCRectMake(0,screenCenter.y,screenCenter.x,screenCenter.y);
  47. lowerLeft=CCRectMake(0,0,screenCenter.x,screenCenter.y);
  48. upperRight=CCRectMake(screenCenter.x,screenCenter.y,screenCenter.x,screenCenter.y);
  49. lowerRight=CCRectMake(screenCenter.x,0,screenCenter.x,screenCenter.y);
  50. moveOffsets[MoveDirectionNone]=CCPointZero;
  51. moveOffsets[MoveDirectionUpperLeft]=CCPointMake(-1,0);
  52. moveOffsets[MoveDirectionLowerLeft]=CCPointMake(0,1);
  53. moveOffsets[MoveDirectionUpperRight]=CCPointMake(0,-1);
  54. moveOffsets[MoveDirectionLowerRight]=CCPointMake(1,0);
  55. currentMoveDirection=MoveDirectionNone;
  56. //通过预约的更新方法来检查角色的移动
  57. this->scheduleUpdate();
  58. returntrue;
  59. }
  60. //返回点击的坐标点
  61. CCPointHelloWorld::locationFromTouches(cocos2d::CCSet*touches)
  62. {
  63. CCTouch*touch=(CCTouch*)touches->anyObject();
  64. returntouch->getLocation();
  65. }
  66. voidHelloWorld::ccTouchesBegan(cocos2d::CCSet*pTouches,cocos2d::CCEvent*pEvent)
  67. {
  68. //CCNode*node=this->getChildByTag(1);
  69. //CCTMXTiledMap*tileMap=(CCTMXTiledMap*)node;
  70. //CCPointtouchLocation=this->locationFromTouches(pTouches);
  71. //CCPointtilepos=this->tilePosFromLocation(touchLocation,tileMap);
  72. //CCLog("%f,%f",tilepos.x,tilepos.y);
  73. //
  74. //this->centerTileMapOnTileCoord(tilepos,tileMap);
  75. //
  76. //player->updateVertextZ(tilepos,tileMap);
  77. CCTouch*touch=(CCTouch*)pTouches->anyObject();
  78. CCPointtouchLocation=touch->getLocation();
  79. if(upperLeft.containsPoint(touchLocation)){
  80. currentMoveDirection=MoveDirectionUpperLeft;
  81. }
  82. elseif(lowerLeft.containsPoint(touchLocation))
  83. {
  84. currentMoveDirection=MoveDirectionLowerLeft;
  85. }
  86. elseif(upperRight.containsPoint(touchLocation))
  87. {
  88. currentMoveDirection=MoveDirectionUpperRight;
  89. }
  90. elseif(lowerRight.containsPoint(touchLocation))
  91. {
  92. currentMoveDirection=MoveDirectionLowerRight;
  93. }
  94. }
  95. //获取瓷砖块的坐标
  96. CCPointHelloWorld::tilePosFromLocation(cocos2d::CCPointlocation,cocos2d::CCTMXTiledMap*tilemap)
  97. {
  98. CCPointpos=ccpSub(location,tilemap->getPosition());
  99. floathalfMapWidth=tilemap->getMapSize().width*0.5f;
  100. floatmapHeight=tilemap->getMapSize().height;
  101. floattileWidth=tilemap->getTileSize().width;
  102. floattileHeight=tilemap->getTileSize().height;
  103. CCPointtilePasDiv=ccp(pos.x/tileWidth,pos.y/tileHeight);
  104. floatinverseTileY=mapHeight-tilePasDiv.y;
  105. floatposX=(int)(inverseTileY+tilePasDiv.x-halfMapWidth);
  106. floatposY=(int)(inverseTileY-tilePasDiv.x+halfMapWidth);
  107. //posX=MAX(0,posX);
  108. //posX=MIN(tilemap->getMapSize().width-1,posX);
  109. //posY=MAX(0,posY);
  110. //posY=MIN(tilemap->getMapSize().height-1,posY);
  111. posX=MAX(playableAreaMin.x,posX);
  112. posX=MIN(playableAreaMax.x,posX);
  113. posY=MAX(playableAreaMin.y,posY);
  114. posY=MIN(playableAreaMax.y,posY);
  115. pos=CCPointMake(posX,posY);
  116. returnpos;
  117. }
  118. //将地图居中
  119. voidHelloWorld::centerTileMapOnTileCoord(cocos2d::CCPointtilePos,cocos2d::CCTMXTiledMap*tileMap)
  120. {
  121. //获取屏幕大小和屏幕中心点
  122. CCSizesize=CCDirector::sharedDirector()->getWinSize();
  123. CCPointscreenCenter=CCPointMake(size.width/2,size.height/2);
  124. //获取地板层
  125. CCTMXLayer*layer=tileMap->layerNamed("Ground");
  126. //CCTMXLayer*layer=tileMap->layerNamed("GroundLayer1");
  127. //仅仅在内部使用;瓷砖的Y坐标减去1
  128. tilePos.y-=1;
  129. //获取瓷砖块坐标
  130. CCPointscrollPosition=layer->positionAt(tilePos);
  131. //考虑到地图移动的情况,我将像素坐标信息乘以-1,从而得到负值
  132. scrollPosition=ccpMult(scrollPosition,-1);
  133. //为屏幕中央坐标添加位移值
  134. scrollPosition=ccpAdd(scrollPosition,screenCenter);
  135. CCMoveTo*move=CCMoveTo::create(.2f,scrollPosition);
  136. tileMap->stopAllActions();
  137. tileMap->runAction(move);
  138. }
  139. voidHelloWorld::update(floatdelta)
  140. {
  141. if(tileMap->numberOfRunningActions()==0){
  142. if(currentMoveDirection!=MoveDirectionNone){
  143. CCPointtilePos=this->tilePosFromLocation(screenCenter,tileMap);
  144. CCPointoffset=moveOffsets[currentMoveDirection];
  145. tilePos=CCPointMake(tilePos.x+offset.x,tilePos.y+offset.y);
  146. tilePos=this->ensureTilePosIsWithinBounds(tilePos);
  147. this->centerTileMapOnTileCoord(tilePos,tileMap);
  148. }
  149. }
  150. //连续不断的修改角色的vertexz的值
  151. CCPointtilePos=this->tilePosFromLocation(tilePos,tileMap);
  152. player->updateVertextZ(tilePos,tileMap);
  153. }
  154. CCPointHelloWorld::ensureTilePosIsWithinBounds(CCPointtilePos)
  155. {
  156. tilePos.x=MAX(playableAreaMin.x,tilePos.x);
  157. tilePos.x=MIN(playableAreaMax.x,tilePos.x);
  158. tilePos.y=MAX(playableAreaMin.y,tilePos.y);
  159. tilePos.y=MIN(playableAreaMax.y,tilePos.y);
  160. returntilePos;
  161. }
  162. voidHelloWorld::ccTouchesEnded(cocos2d::CCSet*pTouches,cocos2d::CCEvent*pEvent)
  163. {
  164. currentMoveDirection=MoveDirectionNone;
  165. }


实现效果:



源码下载:

http://download.csdn.net/detail/s10141303/6302839

分享到:
评论

相关推荐

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

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

    cocos2d-x源码素材

    首先,cocos2d-x是一个跨平台的2D游戏开发框架,基于C++编写,广泛应用于iOS、Android、Windows等多个操作系统。它的强大之处在于提供了一整套易用的API,简化了游戏开发过程,使得开发者能够专注于游戏逻辑而不是...

    cocos2d-x 跑酷源码

    2. 地图拼接:TMX或CSV格式的文件描述了游戏地图的结构,cocos2d-x的TiledMap类可以加载这些文件,动态拼接地图,实现滚动效果。 3. 触摸事件处理:跑酷游戏通常需要响应玩家的触摸操作,如滑动屏幕控制角色移动,...

    cocos2d-x游戏源码 三国策略游戏源码

    cocos2d-x是一个开源的游戏开发框架,它基于cocos2d-x,用于创建2D游戏、演示程序和其他图形/交互式应用程序。cocos2d-x是用C++编写的,但同时也支持Lua和JavaScript作为脚本语言,使得开发者可以根据自己的喜好选择...

    cocos2d-x 《保卫萝卜》源代码

    总的来说,《保卫萝卜》的源代码揭示了Cocos2d-x在2D游戏开发中的应用,涵盖了游戏设计、动画、音频处理、跨平台发布等多个方面的知识。通过研究这套源代码,开发者可以学习到如何利用Cocos2d-x框架构建一款功能完备...

    cocos2d-x教程

    Cocos2d-x是一个开源的游戏开发框架,广泛用于创建2D和3D游戏,教育软件,模拟器等跨平台应用程序。这个教程将深入探讨cocos2d-x的使用方法,帮助开发者掌握其核心概念和功能。 一、cocos2d-x概述 cocos2d-x是基于...

    cocos2d-x-2.1.4帮助文档

    《cocos2d-x-2.1.4帮助文档》是针对游戏开发框架cocos2d-x的一个详细参考资料,该框架是用C++编写,广泛应用于2D游戏、实验性的3D游戏以及实时渲染应用程序的开发。cocos2d-x是开源的,基于cocos2d-iphone扩展而来,...

    Cocos2d-X by Example Beginner's Guide

    7. 2D图形渲染:Cocos2d-X支持纹理、精灵表(SpriteSheet)、图块地图(TMX Maps)等2D图形的渲染,同时还提供了TTF字体支持和自定义字体功能。 在《Cocos2d-X by Example Beginner's Guide》中,作者会详细讲解...

    Tiled地图编辑器cocos2d-x

    《Tiled地图编辑器与Cocos2d-x的深度融合:打造高效手机游戏开发》 在手机游戏开发领域,选择合适的工具和技术栈至关重要。Tiled地图编辑器和Cocos2d-x框架的组合,为开发者提供了强大的游戏场景构建和运行环境。...

    cocos2d-x贼来了塔防

    《cocos2d-x贼来了塔防》是一款基于Cocos2d-x引擎开发的塔防类游戏,旨在为玩家提供深度研究和策略构建的游戏体验。Cocos2d-x是一个广泛使用的开源游戏开发框架,它使用C++语言,支持多平台发布,包括iOS、Android...

    cocos2d-x权威指南源代码

    cocos2d-x是一个跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多操作系统环境。本指南的源代码旨在帮助开发者深入理解cocos2d-x的工作原理,提升游戏开发技能。 cocos2d-x是基于cocos2d的扩展,它用...

    cocos2d-x帮助文档

    《cocos2d-x帮助文档》是一份专为iOS游戏开发者设计的重要参考资料,它详尽地阐述了cocos2d-x框架的各种技术和应用方法。cocos2d-x是一款跨平台的2D游戏开发框架,基于C++,同时支持Objective-C和Python等语言,广泛...

    Cocos2d-x游戏引擎实战开发炸弹超人

    《Cocos2d-x游戏引擎实战开发炸弹超人》是一个基于Cocos2d-x框架的2D游戏开发教程,旨在帮助开发者深入理解并熟练运用这一强大的游戏引擎。Cocos2d-x是一个开源、跨平台的2D游戏开发工具,它支持iOS、Android、...

    cocos2d-x-2.2.2 中文帮助文档

    8. **Tiled地图编辑器支持**:cocos2d-x支持Tiled地图格式,可以方便地设计和导入复杂的关卡地图。 9. **音频管理**:cocos2d-x包含了音频播放功能,支持背景音乐和音效的播放和管理。 10. **Lua和JavaScript绑定*...

    Cocos2d-x 1.0.1-x-0.11.0 手册

    Cocos2d-x是一款开源的游戏开发框架,广泛用于2D游戏、实时应用和互动媒体的制作。1.0.1-x-0.11.0是Cocos2d-x的一个版本,这个版本的手册提供了丰富的开发指导和参考资料,旨在帮助开发者理解和使用这个框架。 ...

    Cocos2d-x游戏开发实战精解-教学PPT

    Cocos2d-x是一款强大的开源游戏开发框架,广泛应用于2D游戏、教育软件、商业应用等领域。本套教学PPT旨在深入浅出地讲解Cocos2d-x游戏开发的核心技术,帮助开发者快速掌握这一工具。 首先,"初识Cocos2d-x"章节将...

    Cocos2d-JS游戏开发

    Cocos2d-JS是一款强大的2D游戏开发框架,它结合了JavaScript的灵活性与Cocos2d-x的高效性能,让开发者能够轻松地创建跨平台的游戏。本篇将深入探讨Cocos2d-JS的游戏开发知识,从基础到进阶,帮助你掌握这一利器。 ...

    cocos2d-x-3.2_richer(第四部分).rar

    Cocos2d-x 是一个跨平台的游戏开发框架,广泛应用于2D游戏、应用及互动媒体的开发。这个压缩包“cocos2d-x-3.2_richer(第四部分).rar”包含了使用Cocos2d-x 3.2版本开发大富翁游戏项目的部分源代码,这将带我们深入...

    Cocos2d-x 3.x游戏开发之旅_PDF电子书下载 带书签目录 高清完整版

    Cocos2d-x是一个开源的游戏开发框架,广泛应用于移动平台,如iOS、Android以及Windows Phone等。该书的高清完整版提供了带书签目录的功能,使得读者在学习过程中能够更加便捷地查找和定位所需内容。 首先,Cocos2d-...

    Cocos2D-X游戏开发技术精解学习

    本书旨在帮助读者掌握Cocos2D-X的核心技术和实践应用,从而在游戏开发的道路上更加得心应手。 Cocos2D-X引擎基于C++,同时支持Lua和JavaScript脚本语言,提供了丰富的图形绘制、动画制作、物理模拟、音频处理等功能...

Global site tag (gtag.js) - Google Analytics