【麦可网】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",menu_selector(HelloMap::menuCallback));
	CcmenuItemFont* leftMenuItem = CcmenuItemFont::create("LEFT",menu_selector(HelloMap::menuCallback));
	CcmenuItemFont* rightMenuItem = CcmenuItemFont::create("RIGHT",menu_selector(HelloMap::menuCallback));
	CcmenuItemFont* updateMenuItem = CcmenuItemFont::create("UPDATE",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

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

  1. ios – Marmalade SDK是否与游戏开发更相关或更常用?

    我是移动应用程序开发的新手,并且正在寻找一个适合的平台.我遇到了一个项目,人们希望将交换机和家庭自动化公司的自助广告实施到移动应用程序中.他们最初想要一个iPhone应用程序,但也希望随后在Android和其他平台上部署.一个类似的应用程序是这one.在投入大量时间研究各种SDK和开发人员计划之后,Marmalade通过它的多平台部署功能引起了我的注意.然而,在经历了一些教程之后,我发现these

  2. Swift游戏开发案例实战——互动出版网

    通过完整的过程,帮助读者更好的掌握开发过程内容简介本书是国内第一本Swift游戏开发图书。本书由浅入深、全面、系统地讲解了Swift游戏开发的基础知识和各项关键技术,其中重点介绍了5个游戏项目案例的开发,供读者实战演练。本书涉及面广,从基本的操作到游戏开发的关键技术,再到游戏项目案例实战,几乎涉及SwiftiOS游戏开发的各方面的重要知识。出版了《Swift入门很简单》和《Swift游戏开发案例实战》等图书。

  3. 早期Swift中Cocos2D初始化代码的重构

    但是遗憾的是Swift2.2中还是不支持Type的class属性关键字,只能用static,我们期待Swift3的改进吧!

  4. 手把手教你swift项目添加cocos2dx-lua

    去倒杯水吧,这个过程会很久。。。至此,工程已经全部配置完毕,你已经解决一个大Boss了;今天就到这里吧,之后我们再续如何用swift调用lua手把手教你swift项目添加cocos2dx-lua

  5. 手把手教你swift项目集成cocos2dx-js模块

    前几天在swift项目中集成了Lua模块,使得在swift工程中用Lua写游戏逻辑成为了可能,具体工程及配置见手把手教你swift项目添加cocos2dx-lua,由于公司最近要把js做的小游戏集成到iOS原生应用中,于是我们将解锁另外一个场景,好了,下面开始;同样的,首先你得有一个swift项目我们从头开始,建立一个swift项目;我们默认你已经可以自己创建一个全新的swift项目了,这很简单,不是么?

  6. android – 是否有可能创建一个可以由非Mono开发人员使用的MonoDroid和MonoTouch的跨平台共享库?

    Android库我们可以生成一个Android库作为MonoDroid的输出,其他开发人员使用ADT和Java开发能够使用他们的应用?iOS库我们可以从MonoTouch生成一个库,ObjectiveC开发人员能够在他们的应用程序中使用吗?解决方法对于这两种情况,答案都是否定的,无法在MonoTouch或MonoforAndroid上创建非托管应用程序可以使用的托管库.这是因为托管库严重依赖托管运行时,它们不是独立库.

  7. unity3d – Android游戏开发使用统一3D教程

    我是团结3D的新手.我打算用Unity3D开发一个安卓游戏,我已经在网上搜索了Unity3D中的android相关教程,但是找不到一个好的开发人员教我一个应用程序启动,所以大家请建议我一个网站我可以启动.我需要android教程,而不是独立的平台教程.提前致谢.解决方法你可以使用Google或Unity3Dofficialdocumentation.

  8. android – 轻量级跨平台C GUI(OpenGL)

    我正在寻找一个轻量级的跨平台GUI库,用于不同的信号处理应用程序.ANSI-C程序必须与其静态链接,并且大小很重要.完成的应用程序必须在iPad,iPhone,Android,Ubuntu,Leopard,Windows等平台上具有相同的外观.Qt不合适,因为它太大了,并且在iOS设备上不起作用.我倾向于基于OpenGL的GUI库,因为每个现代目标平台都支持OpenGL,并且OpenGL应用程序在

  9. android – 从HTML网页向移动设备地址簿添加联系人

    我目前正在建立一个网站,只需轻轻一点,您就可以在IPhone/Android地址簿中添加联系人.该网站目前是HTML5,但可以实现Javascript和/或PHP选项.那么有没有一种方法,点击链接,移动设备将打开已经填写了我想要的信息的地址簿.我到处寻找只能找到能够做同样事情的应用程序的方法.我想从网页上创建它.在哪里,我可以学习如何做到这一点?

  10. 如何在Xamarin android和ios中安装线程?

    解决方法使用XamarinForms的多平台方式将是编辑:在阅读之后你真的想要阻止mainthread继承阻止线程的多平台方式:

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部