【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第二十二课:Cocos2D-X地图系统1-8

【麦可网】Cocos2d-X跨平台游戏开发---学习笔记

第二十二课:Cocos2D-X地图系统1-8

=======================================================================================================================================================================

课程目标:

 - 学习Cocos2D-X的地图系统

课程重点:

 - 地图编辑器的使用

 - Cocos2D-X中的地图系统

考核目标:

 - 能够用地图编辑器编辑不同类型的地图

 - 能在Cocos2D-X中使用地图编辑器编辑出的地图

=======================================================================================================================================================================

一、两种不同类型的地图


二、地图载入

	CCTMXTiledMap* mapTile = CCTMXTiledMap::create("desert.tmx");
	this->addChild(mapTile);


三、动态更新

CCNode::reorderChild(CCNode *child, int zOrder);


四、例子

载入地图

添加精灵

添加菜单

如图:


bool HelloMap::init()
{
	//
	// 1. super init first
	if ( !CCLayer::init() )
	{
		return false;
	}
	CCSize screenSize = CCDirector::sharedDirector()->getWinSize();

	mapTile = CCTMXTiledMap::create("map_desert.tmx");
	mapTile->setPosition(CCPointZero);
	this->addChild(mapTile);
	
	//SpinningPeas.png
	sprite = CCSprite::create("SpinningPeas.png");
	sprite->setPosition(ccp(	SPR_WIDTH/2, SPR_HEIGHT/2));
	mapTile->addChild(sprite);

	CCMenuItemFont* upMenuItem = CCMenuItemFont::create("UP", this, menu_selector(HelloMap::menuCallback));
	CCMenuItemFont* downMenuItem = CCMenuItemFont::create("DOWN", this, menu_selector(HelloMap::menuCallback));
	CCMenuItemFont* leftMenuItem = CCMenuItemFont::create("LEFT", this, menu_selector(HelloMap::menuCallback));
	CCMenuItemFont* rightMenuItem = CCMenuItemFont::create("RIGHT", this, menu_selector(HelloMap::menuCallback));
	CCMenuItemFont* updateMenuItem = CCMenuItemFont::create("UPDATE", this, menu_selector(HelloMap::menuCallback));

	CCMenu* menu = CCMenu::create(upMenuItem, downMenuItem ,leftMenuItem, rightMenuItem, updateMenuItem ,NULL);
	menu->setPosition(CCPointZero);
	this->addChild(menu);

	CCLOG("height=%f",screenSize.height);
	CCLOG("width=%f",screenSize.width);

	upMenuItem->setPosition(ccp(screenSize.width/2, screenSize.height-40));
	downMenuItem->setPosition(ccp(screenSize.width/2, 40));
	leftMenuItem->setPosition(ccp(40, screenSize.height/2));
	rightMenuItem->setPosition(ccp(screenSize.width-40, screenSize.height/2));
	updateMenuItem->setPosition(ccp(screenSize.width/2, screenSize.height/2));

	upMenuItem->setTag(TAG_UP);
	downMenuItem->setTag(TAG_DOWN);
	leftMenuItem->setTag(TAG_LEFT);
	rightMenuItem->setTag(TAG_RIGHT);
	updateMenuItem->setTag(TAG_UPDATE);

	return true;
}

-----------------------------------------------
UP、DOWN、LEFT、RIGHT、UPDATE对应的回调函数
void HelloMap::menuCallback(CCObject* pSender)
{
//获取屏幕尺寸
	CCSize screenSize = CCDirector::sharedDirector()->getWinSize();
//获得菜单项标记
	CCMenuItem* item = (CCMenuItem*)pSender;
	int tag = item->getTag();

//获得当前位置和要移动的下个位置
	CCPoint spriteCurPos = ccp( (int)(sprite->getPositionX()/SPR_WIDTH), mapTile->getMapSize().height-1 - (int)(sprite->getPositionY()/SPR_HEIGHT) );
	CCPoint spriteNextPos = spriteCurPos;
	CCPoint flagPos = CCPointZero;

//获取图层
	CCTMXLayer* layer2 = mapTile->layerNamed("layer2");
	int gID = 0;

	switch(tag)
	{
//上移动
	case TAG_UP:
//越界返回
		spriteNextPos.y -= 1;
		if (spriteNextPos.y < 0) return;
		
//碰撞检测
		gID = layer2->tileGIDAt(spriteNextPos);
		if (gID) return;		

//移动地图和精灵
//1.如果 地图高度+地图Y位置 > 屏幕高度 (精灵Y位置 > 地图高度/2 滚屏,否则只		移动精灵)。
//2. 不满足1且精灵Y位置 < 地图高度 移动精灵
		if ( mapTile->getContentSize().height + mapTile->getPositionY() > screenSize.height + SPR_HEIGHT)
		{
			if (sprite->getPositionY() > screenSize.height/2)
			{
				mapTile->setPositionY(mapTile->getPositionY() - SPR_HEIGHT);
			}
			sprite->setPosition(ccp(	sprite->getPositionX(), sprite->getPositionY()+SPR_HEIGHT));
		}
		else if (sprite->getPositionY() < mapTile->getContentSize().height-SPR_HEIGHT)
		{
			sprite->setPosition(ccp(	sprite->getPositionX(), sprite->getPositionY()+SPR_HEIGHT));
		}
		break;

	case TAG_DOWN:
		spriteNextPos.y += 1;
		if (spriteNextPos.y > mapTile->getMapSize().height-1) return;

		gID = layer2->tileGIDAt(spriteNextPos);
		if (gID) return;

		if (mapTile->getPositionY() < 0)
		{
			if (sprite->getPositionY() < mapTile->getContentSize().height - screenSize.height/2)
			{
				mapTile->setPositionY(mapTile->getPositionY() + SPR_HEIGHT);
			}
			sprite->setPosition(ccp(	sprite->getPositionX(), sprite->getPositionY()-SPR_HEIGHT));
		}
		else if (sprite->getPositionY() > SPR_HEIGHT)
		{
			sprite->setPosition(ccp(	sprite->getPositionX(), sprite->getPositionY()-SPR_HEIGHT));
		}
		break;

	case TAG_LEFT:
		spriteNextPos.x -= 1;
		if (spriteNextPos.x < 0) return;

		gID = layer2->tileGIDAt(spriteNextPos);
		if (gID) return;

		if (mapTile->getPositionX() < 0)
		{
			if (sprite->getPositionX() < mapTile->getContentSize().width - screenSize.width/2)
			{
				mapTile->setPositionX(mapTile->getPositionX() + SPR_WIDTH);
			}
			sprite->setPosition(ccp(	sprite->getPositionX()-SPR_WIDTH, sprite->getPositionY()));
		}
		else if (sprite->getPositionX() > SPR_WIDTH)
		{
			sprite->setPosition(ccp(	sprite->getPositionX()-SPR_WIDTH, sprite->getPositionY()));
		}
		break;

	case TAG_RIGHT:
		spriteNextPos.x += 1;
		if (spriteNextPos.x > mapTile->getMapSize().width-1 ) return;

		gID = layer2->tileGIDAt(spriteNextPos);
		if (gID) return;

		if ( mapTile->getContentSize().width + mapTile->getPositionX() > screenSize.width + SPR_HEIGHT)
		{
			if (sprite->getPositionX() > screenSize.width/2)
			{
				mapTile->setPositionX(mapTile->getPositionX() - SPR_WIDTH);
			}
			sprite->setPosition(ccp(	sprite->getPositionX()+SPR_WIDTH, sprite->getPositionY()));
		}
		else if (sprite->getPositionX() < mapTile->getContentSize().width-SPR_WIDTH)
		{
			sprite->setPosition(ccp(	sprite->getPositionX()+SPR_WIDTH, sprite->getPositionY()));
		}
		break;
	case TAG_UPDATE:
//动态更新
		flagPos.x = spriteCurPos.x + 1;
		flagPos.y = spriteCurPos.y;
		layer2->setTileGID(46,flagPos);
		break;
	}
}

===================================================================

总结:

这一课有趣,有地图有角色啦。

 

开心一刻:

有两个神经病患.从病院里逃出来

两人跑啊跑.爬到一棵树上

其中一个人从树上跳下来

滚啊滚的

然後抬起头对上面的人说:------你怎么还不下来啊---------? 

上面的那个人回答他:------------ 

我还没有熟-----------  


==================================================================

【麦可网】Cocos2d-X跨平台游戏开发---教程下载:http://pan.baidu.com/s/1kTio1Av

【麦可网】Cocos2d-X跨平台游戏开发---笔记系列:http://blog.csdn.net/qiulanzhu





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值