原文地址:http://blog.csdn.net/dingxiaowei2013/article/details/11894879
前言:
我们在做经典的格斗类的游戏的时候,场景常常用的是45°斜地图来创建的。下面我就来实现一个简单的Demo来展现一下斜地图的使用。
功能实现:
1.倾斜地图的加载;
2.点击地图居中;
3.主角只能在一定的范围内移动;
4.鼠标点击屏幕,主角移动一格,如果连续点击则主句不断的移动;
代码实现:
图层要设置z轴属性,方便可以隐藏主角:
在图层的属性中加上 cc_vertexz -400
如果前面的图层那就设置为automatic
在AppDelegate添加代码:
-
//深度测试,方便实现遮盖效果
-
CCDirector::sharedDirector()->setDepthTest(true);
-
//Opengl渲染设置,如果地图有背景图层的话就需要加这句
-
CCDirector::sharedDirector()->setProjection(kCCDirectorProjection2D);
Player类:
-
#ifndef___5tilemap__Player__
-
#define___5tilemap__Player__
-
-
#include<iostream>
-
#include"cocos2d.h"
-
usingnamespacecocos2d;
-
classPlayer:publicCCSprite
-
{
-
public:
-
staticPlayer*create();
-
virtualboolinitPlayer();
-
voidupdateVertextZ(CCPointtilePos,CCTMXTiledMap*tileMap);
-
};
-
#endif/*defined(___5tilemap__Player__)*/
-
#include"Player.h"
-
-
staticPlayer*s;
-
-
Player*Player::create()
-
{
-
s=newPlayer();
-
if(s&&s->initPlayer()){
-
s->autorelease();
-
returns;
-
}
-
else
-
{
-
deletes;
-
s=NULL;
-
returnNULL;
-
}
-
}
-
-
boolPlayer::initPlayer()
-
{
-
if(!CCSprite::initWithFile("ninja.png")){
-
returnfalse;
-
}
-
returntrue;
-
}
-
-
voidPlayer::updateVertextZ(cocos2d::CCPointtilePos,cocos2d::CCTMXTiledMap*tileMap)
-
{
-
floatlowestZ=-(tileMap->getMapSize().width+tileMap->getMapSize().height);
-
floatcurrentZ=tilePos.x+tilePos.y;
-
this->setVertexZ(lowestZ+currentZ-1);
-
}
HelloWorld.h:
-
#ifndef__HELLOWORLD_SCENE_H__
-
#define__HELLOWORLD_SCENE_H__
-
-
#include"cocos2d.h"
-
#include"Player.h"
-
usingnamespacecocos2d;
-
-
typedefenum{
-
MoveDirectionNone=0,
-
MoveDirectionUpperLeft,
-
MoveDirectionLowerLeft,
-
MoveDirectionUpperRight,
-
MoveDirectionLowerRight,
-
MAX_MoveDirections
-
}EMoveDirection;
-
-
classHelloWorld:publiccocos2d::CCLayer
-
{
-
public:
-
//Method'init'incocos2d-xreturnsbool,insteadof'id'incocos2d-iphone(anobjectpointer)
-
virtualboolinit();
-
-
//there'sno'id'incpp,sowerecommendtoreturntheclassinstancepointer
-
staticcocos2d::CCScene*scene();
-
-
CREATE_FUNC(HelloWorld);
-
-
virtualvoidccTouchesBegan(CCSet*pTouches,CCEvent*pEvent);
-
-
CCPointlocationFromTouches(CCSet*touches);
-
-
-
Player*player;
-
-
CCPointplayableAreaMin,playableAreaMax;
-
-
//获取瓷砖块的坐标
-
CCPointtilePosFromLocation(CCPointlocation,CCTMXTiledMap*tilemap);
-
-
//图层居中
-
voidcenterTileMapOnTileCoord(CCPointtilePos,CCTMXTiledMap*tileMap);
-
-
virtualvoidccTouchesEnded(CCSet*pTouches,CCEvent*pEvent);
-
-
CCPointscreenCenter;
-
-
CCTMXTiledMap*tileMap;
-
-
CCRectupperLeft,lowerLeft,upperRight,lowerRight;
-
-
CCPointmoveOffsets[MAX_MoveDirections];
-
-
EMoveDirectioncurrentMoveDirection;
-
-
voidupdate(floatdelta);
-
-
CCPointensureTilePosIsWithinBounds(CCPointtilePos);
-
};
-
-
#endif//__HELLOWORLD_SCENE_H__
-
#include"HelloWorldScene.h"
-
#include"SimpleAudioEngine.h"
-
#include"Player.h"
-
-
usingnamespacecocos2d;
-
usingnamespaceCocosDenshion;
-
-
CCScene*HelloWorld::scene()
-
{
-
//'scene'isanautoreleaseobject
-
CCScene*scene=CCScene::create();
-
-
//'layer'isanautoreleaseobject
-
HelloWorld*layer=HelloWorld::create();
-
-
//addlayerasachildtoscene
-
scene->addChild(layer);
-
-
//returnthescene
-
returnscene;
-
}
-
-
//on"init"youneedtoinitializeyourinstance
-
boolHelloWorld::init()
-
{
-
//1.superinitfirst
-
if(!CCLayer::init())
-
{
-
returnfalse;
-
}
-
CCSizesize=CCDirector::sharedDirector()->getWinSize();
-
//添加一个地图
-
CCTMXTiledMap*tileMap=CCTMXTiledMap::create("huohuo.tmx");
-
//CCTMXTiledMap*tileMap=CCTMXTiledMap::create("isometric.tmx");
-
//tileMap->setAnchorPoint(CCPointMake(size.width/2,size.height/2));
-
//tileMap->setPosition(CCPointMake(size.width/2,size.height/2));
-
CCSizes=tileMap->getContentSize();
-
CCLog("width:%f",-s.width/2);
-
tileMap->setPosition(ccp(-s.width/2,0));
-
this->addChild(tileMap,-1,1);
-
this->setTouchEnabled(true);
-
this->tileMap=tileMap;
-
-
//添加主角精灵
-
player=Player::create();
-
player->setPosition(CCPointMake(size.width/2,size.height/2));
-
player->setAnchorPoint(ccp(0.3f,0.1));
-
this->addChild(player);
-
-
constintborderSize=10;
-
-
playableAreaMin=CCPointMake(borderSize,borderSize);
-
playableAreaMax=CCPointMake(tileMap->getMapSize().width-1-borderSize,tileMap->getMapSize().height-1-borderSize);
-
-
-
-
screenCenter=CCPointMake(size.width/2,size.height/2);
-
upperLeft=CCRectMake(0,screenCenter.y,screenCenter.x,screenCenter.y);
-
lowerLeft=CCRectMake(0,0,screenCenter.x,screenCenter.y);
-
upperRight=CCRectMake(screenCenter.x,screenCenter.y,screenCenter.x,screenCenter.y);
-
lowerRight=CCRectMake(screenCenter.x,0,screenCenter.x,screenCenter.y);
-
-
moveOffsets[MoveDirectionNone]=CCPointZero;
-
moveOffsets[MoveDirectionUpperLeft]=CCPointMake(-1,0);
-
moveOffsets[MoveDirectionLowerLeft]=CCPointMake(0,1);
-
moveOffsets[MoveDirectionUpperRight]=CCPointMake(0,-1);
-
moveOffsets[MoveDirectionLowerRight]=CCPointMake(1,0);
-
currentMoveDirection=MoveDirectionNone;
-
//通过预约的更新方法来检查角色的移动
-
this->scheduleUpdate();
-
-
returntrue;
-
}
-
-
//返回点击的坐标点
-
CCPointHelloWorld::locationFromTouches(cocos2d::CCSet*touches)
-
{
-
CCTouch*touch=(CCTouch*)touches->anyObject();
-
returntouch->getLocation();
-
}
-
-
voidHelloWorld::ccTouchesBegan(cocos2d::CCSet*pTouches,cocos2d::CCEvent*pEvent)
-
{
-
//CCNode*node=this->getChildByTag(1);
-
//CCTMXTiledMap*tileMap=(CCTMXTiledMap*)node;
-
//CCPointtouchLocation=this->locationFromTouches(pTouches);
-
//CCPointtilepos=this->tilePosFromLocation(touchLocation,tileMap);
-
//CCLog("%f,%f",tilepos.x,tilepos.y);
-
//
-
//this->centerTileMapOnTileCoord(tilepos,tileMap);
-
//
-
//player->updateVertextZ(tilepos,tileMap);
-
CCTouch*touch=(CCTouch*)pTouches->anyObject();
-
CCPointtouchLocation=touch->getLocation();
-
if(upperLeft.containsPoint(touchLocation)){
-
currentMoveDirection=MoveDirectionUpperLeft;
-
}
-
elseif(lowerLeft.containsPoint(touchLocation))
-
{
-
currentMoveDirection=MoveDirectionLowerLeft;
-
}
-
elseif(upperRight.containsPoint(touchLocation))
-
{
-
currentMoveDirection=MoveDirectionUpperRight;
-
}
-
elseif(lowerRight.containsPoint(touchLocation))
-
{
-
currentMoveDirection=MoveDirectionLowerRight;
-
}
-
}
-
-
//获取瓷砖块的坐标
-
CCPointHelloWorld::tilePosFromLocation(cocos2d::CCPointlocation,cocos2d::CCTMXTiledMap*tilemap)
-
{
-
CCPointpos=ccpSub(location,tilemap->getPosition());
-
-
floathalfMapWidth=tilemap->getMapSize().width*0.5f;
-
floatmapHeight=tilemap->getMapSize().height;
-
floattileWidth=tilemap->getTileSize().width;
-
floattileHeight=tilemap->getTileSize().height;
-
-
CCPointtilePasDiv=ccp(pos.x/tileWidth,pos.y/tileHeight);
-
floatinverseTileY=mapHeight-tilePasDiv.y;
-
floatposX=(int)(inverseTileY+tilePasDiv.x-halfMapWidth);
-
floatposY=(int)(inverseTileY-tilePasDiv.x+halfMapWidth);
-
-
//posX=MAX(0,posX);
-
//posX=MIN(tilemap->getMapSize().width-1,posX);
-
//posY=MAX(0,posY);
-
//posY=MIN(tilemap->getMapSize().height-1,posY);
-
-
posX=MAX(playableAreaMin.x,posX);
-
posX=MIN(playableAreaMax.x,posX);
-
posY=MAX(playableAreaMin.y,posY);
-
posY=MIN(playableAreaMax.y,posY);
-
-
pos=CCPointMake(posX,posY);
-
-
returnpos;
-
}
-
-
//将地图居中
-
voidHelloWorld::centerTileMapOnTileCoord(cocos2d::CCPointtilePos,cocos2d::CCTMXTiledMap*tileMap)
-
{
-
//获取屏幕大小和屏幕中心点
-
CCSizesize=CCDirector::sharedDirector()->getWinSize();
-
-
CCPointscreenCenter=CCPointMake(size.width/2,size.height/2);
-
-
//获取地板层
-
CCTMXLayer*layer=tileMap->layerNamed("Ground");
-
//CCTMXLayer*layer=tileMap->layerNamed("GroundLayer1");
-
-
//仅仅在内部使用;瓷砖的Y坐标减去1
-
tilePos.y-=1;
-
-
//获取瓷砖块坐标
-
CCPointscrollPosition=layer->positionAt(tilePos);
-
-
//考虑到地图移动的情况,我将像素坐标信息乘以-1,从而得到负值
-
scrollPosition=ccpMult(scrollPosition,-1);
-
-
//为屏幕中央坐标添加位移值
-
scrollPosition=ccpAdd(scrollPosition,screenCenter);
-
-
CCMoveTo*move=CCMoveTo::create(.2f,scrollPosition);
-
-
tileMap->stopAllActions();
-
tileMap->runAction(move);
-
}
-
-
voidHelloWorld::update(floatdelta)
-
{
-
if(tileMap->numberOfRunningActions()==0){
-
if(currentMoveDirection!=MoveDirectionNone){
-
CCPointtilePos=this->tilePosFromLocation(screenCenter,tileMap);
-
CCPointoffset=moveOffsets[currentMoveDirection];
-
tilePos=CCPointMake(tilePos.x+offset.x,tilePos.y+offset.y);
-
tilePos=this->ensureTilePosIsWithinBounds(tilePos);
-
this->centerTileMapOnTileCoord(tilePos,tileMap);
-
}
-
}
-
-
//连续不断的修改角色的vertexz的值
-
CCPointtilePos=this->tilePosFromLocation(tilePos,tileMap);
-
player->updateVertextZ(tilePos,tileMap);
-
}
-
-
CCPointHelloWorld::ensureTilePosIsWithinBounds(CCPointtilePos)
-
{
-
tilePos.x=MAX(playableAreaMin.x,tilePos.x);
-
tilePos.x=MIN(playableAreaMax.x,tilePos.x);
-
tilePos.y=MAX(playableAreaMin.y,tilePos.y);
-
tilePos.y=MIN(playableAreaMax.y,tilePos.y);
-
returntilePos;
-
}
-
-
voidHelloWorld::ccTouchesEnded(cocos2d::CCSet*pTouches,cocos2d::CCEvent*pEvent)
-
{
-
currentMoveDirection=MoveDirectionNone;
-
}
实现效果:
源码下载:
http://download.csdn.net/detail/s10141303/6302839
分享到:
相关推荐
JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台发布、程序代码管理、两大应用商店发布产品。...
首先,cocos2d-x是一个跨平台的2D游戏开发框架,基于C++编写,广泛应用于iOS、Android、Windows等多个操作系统。它的强大之处在于提供了一整套易用的API,简化了游戏开发过程,使得开发者能够专注于游戏逻辑而不是...
2. 地图拼接:TMX或CSV格式的文件描述了游戏地图的结构,cocos2d-x的TiledMap类可以加载这些文件,动态拼接地图,实现滚动效果。 3. 触摸事件处理:跑酷游戏通常需要响应玩家的触摸操作,如滑动屏幕控制角色移动,...
cocos2d-x是一个开源的游戏开发框架,它基于cocos2d-x,用于创建2D游戏、演示程序和其他图形/交互式应用程序。cocos2d-x是用C++编写的,但同时也支持Lua和JavaScript作为脚本语言,使得开发者可以根据自己的喜好选择...
总的来说,《保卫萝卜》的源代码揭示了Cocos2d-x在2D游戏开发中的应用,涵盖了游戏设计、动画、音频处理、跨平台发布等多个方面的知识。通过研究这套源代码,开发者可以学习到如何利用Cocos2d-x框架构建一款功能完备...
Cocos2d-x是一个开源的游戏开发框架,广泛用于创建2D和3D游戏,教育软件,模拟器等跨平台应用程序。这个教程将深入探讨cocos2d-x的使用方法,帮助开发者掌握其核心概念和功能。 一、cocos2d-x概述 cocos2d-x是基于...
《cocos2d-x-2.1.4帮助文档》是针对游戏开发框架cocos2d-x的一个详细参考资料,该框架是用C++编写,广泛应用于2D游戏、实验性的3D游戏以及实时渲染应用程序的开发。cocos2d-x是开源的,基于cocos2d-iphone扩展而来,...
7. 2D图形渲染:Cocos2d-X支持纹理、精灵表(SpriteSheet)、图块地图(TMX Maps)等2D图形的渲染,同时还提供了TTF字体支持和自定义字体功能。 在《Cocos2d-X by Example Beginner's Guide》中,作者会详细讲解...
《Tiled地图编辑器与Cocos2d-x的深度融合:打造高效手机游戏开发》 在手机游戏开发领域,选择合适的工具和技术栈至关重要。Tiled地图编辑器和Cocos2d-x框架的组合,为开发者提供了强大的游戏场景构建和运行环境。...
《cocos2d-x贼来了塔防》是一款基于Cocos2d-x引擎开发的塔防类游戏,旨在为玩家提供深度研究和策略构建的游戏体验。Cocos2d-x是一个广泛使用的开源游戏开发框架,它使用C++语言,支持多平台发布,包括iOS、Android...
cocos2d-x是一个跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多操作系统环境。本指南的源代码旨在帮助开发者深入理解cocos2d-x的工作原理,提升游戏开发技能。 cocos2d-x是基于cocos2d的扩展,它用...
《cocos2d-x帮助文档》是一份专为iOS游戏开发者设计的重要参考资料,它详尽地阐述了cocos2d-x框架的各种技术和应用方法。cocos2d-x是一款跨平台的2D游戏开发框架,基于C++,同时支持Objective-C和Python等语言,广泛...
《Cocos2d-x游戏引擎实战开发炸弹超人》是一个基于Cocos2d-x框架的2D游戏开发教程,旨在帮助开发者深入理解并熟练运用这一强大的游戏引擎。Cocos2d-x是一个开源、跨平台的2D游戏开发工具,它支持iOS、Android、...
8. **Tiled地图编辑器支持**:cocos2d-x支持Tiled地图格式,可以方便地设计和导入复杂的关卡地图。 9. **音频管理**:cocos2d-x包含了音频播放功能,支持背景音乐和音效的播放和管理。 10. **Lua和JavaScript绑定*...
Cocos2d-x是一款开源的游戏开发框架,广泛用于2D游戏、实时应用和互动媒体的制作。1.0.1-x-0.11.0是Cocos2d-x的一个版本,这个版本的手册提供了丰富的开发指导和参考资料,旨在帮助开发者理解和使用这个框架。 ...
Cocos2d-x是一款强大的开源游戏开发框架,广泛应用于2D游戏、教育软件、商业应用等领域。本套教学PPT旨在深入浅出地讲解Cocos2d-x游戏开发的核心技术,帮助开发者快速掌握这一工具。 首先,"初识Cocos2d-x"章节将...
Cocos2d-JS是一款强大的2D游戏开发框架,它结合了JavaScript的灵活性与Cocos2d-x的高效性能,让开发者能够轻松地创建跨平台的游戏。本篇将深入探讨Cocos2d-JS的游戏开发知识,从基础到进阶,帮助你掌握这一利器。 ...
Cocos2d-x 是一个跨平台的游戏开发框架,广泛应用于2D游戏、应用及互动媒体的开发。这个压缩包“cocos2d-x-3.2_richer(第四部分).rar”包含了使用Cocos2d-x 3.2版本开发大富翁游戏项目的部分源代码,这将带我们深入...
Cocos2d-x是一个开源的游戏开发框架,广泛应用于移动平台,如iOS、Android以及Windows Phone等。该书的高清完整版提供了带书签目录的功能,使得读者在学习过程中能够更加便捷地查找和定位所需内容。 首先,Cocos2d-...
本书旨在帮助读者掌握Cocos2D-X的核心技术和实践应用,从而在游戏开发的道路上更加得心应手。 Cocos2D-X引擎基于C++,同时支持Lua和JavaScript脚本语言,提供了丰富的图形绘制、动画制作、物理模拟、音频处理等功能...