Cocos2D-X2.2.3学习笔记19(地图系统)

坚持一下,还有最后三个重要的环节,Cocos2dx的基础教程就宣告结束了,一个地图系统,一个Box2D,还有一个chipmunk。


还有音频系统和cocosbuild工具。其中地图系统和两个物理引擎是比较重要的,得学好。


进入正题,首先我们创建一个项目,把该删的都删了。


然后呢,Copy我们的图片资源到Resources


这里,我们先来介绍一个地图编辑工具,Tiled


下载地址:http://www.mapeditor.org/download.html


各种版本的,我的电脑是win7的所有下载了windows版。安装的时候安装成汉语的。因为英语不行啊   硬伤。。。。。


1.使用Tiled


ok,打开软件,选择文件-->新建文件


如下图


TiledMap新建地图


这里,地图的方向有正常和斜45度的,区别在于什么,大家百度一下

这里我们就来建 30X20块的地图,块大小都是32


Tiled块层

Ctrl++可以放大   Ctrl+-缩小

如果看不到网格,可以下视图-->显示网格


图层有了,接着,我们来新建图块


地图,新图块,浏览。找到我们的资源目录,选择我们的图片  tmw_desert_spacing.png


图块名称,自动帮我们取好了,下面的配置,都是中文的,应该看得懂,我这里配置如下

Tiled新图块


接着我们刷背景。


Tiled编辑地图


背景好了,接下来我新键一个障碍物的图层,

Tiled添加障碍物


这时候地图已经做好了,ok


我们文件,保存,到Resouces目录下,这里取个名字  TestMap吧


2.加载tmx


#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
USING_NS_CC;
class  HelloWorld : public cocos2d::CCLayer
{
public:
	HelloWorld();

    virtual bool init();  

    static cocos2d::CCScene* scene();
    
    void menuCloseCallback(CCObject* pSender);
    
    CREATE_FUNC(HelloWorld);
private:
	CC_SYNTHESIZE_RETAIN(CCTMXTiledMap*,m_testmap,TestMap);
};

#endif 

#include "HelloWorldScene.h"


HelloWorld::HelloWorld()
	:m_testmap(NULL)
{
}
CCScene* HelloWorld::scene()
{
    CCScene *scene = CCScene::create();
    
    HelloWorld *layer = HelloWorld::create();

    scene->addChild(layer);

    return scene;
}

bool HelloWorld::init()
{
    if ( !CCLayer::init() )
    {
        return false;
    }
    
    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
	this->setTestMap( CCTMXTiledMap::create("TestMap.tmx"));
	m_testmap->setPosition(CCPointZero);
	this->addChild(m_testmap);
    return true;
}


void HelloWorld::menuCloseCallback(CCObject* pSender)
{

}

代码很简单,注意头文件,我们用了getset宏

加了构造函数用来初始化,这是个很好的习惯哦

效果如下图

加载tmx

这里,我们发现的是,地图并没有因我们的屏幕小而缩小,只显示了左下角一点点

至于怎么让地图动起来,我们稍后再介绍,

现在我们需要在左下角添加一个主角,

然后添加上下左右四个按钮,

最后我们在让主角在地图上跑动起来

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
USING_NS_CC;
class  HelloWorld : public cocos2d::CCLayer
{
public:
	HelloWorld();

    virtual bool init();  

    static cocos2d::CCScene* scene();
    
    void menuCloseCallback(CCObject* pSender);
    
    CREATE_FUNC(HelloWorld);
private:
	CC_SYNTHESIZE_RETAIN(CCTMXTiledMap*,m_testmap,TestMap);
	CC_SYNTHESIZE_RETAIN(CCSprite*,m_player,Player);
};

#endif 

#include "HelloWorldScene.h"
#define TMXBLOCKSIZE 32	//宏,图块的大小

HelloWorld::HelloWorld()
	:m_testmap(NULL)
	,m_player(NULL)
{
}
CCScene* HelloWorld::scene()
{
    CCScene *scene = CCScene::create();
    
    HelloWorld *layer = HelloWorld::create();

    scene->addChild(layer);

    return scene;
}

bool HelloWorld::init()
{
    if ( !CCLayer::init() )
    {
        return false;
    }
    
    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
	this->setTestMap( CCTMXTiledMap::create("TestMap.tmx"));
	m_testmap->setPosition(CCPointZero);
	this->addChild(m_testmap);
	//添加主角
	this->setPlayer(CCSprite::create("Player.png"));
	m_player->setPosition(ccp(TMXBLOCKSIZE/2,TMXBLOCKSIZE/2));
	//注意:这里是把主角加到地图上
	m_testmap->addChild(m_player);
    return true;
}


void HelloWorld::menuCloseCallback(CCObject* pSender)
{

}

效果图

新增npc到地图上


呃,我们在增加四个按钮菜单

#include "HelloWorldScene.h"
#define TMXBLOCKSIZE 32	//宏,图块的大小
enum MENUENUM
{
	TOPMENUITEM=100,BUTTOMMENUITEM,LEFTMENUITEM,RIGHTMENUITEM
};
HelloWorld::HelloWorld()
	:m_testmap(NULL)
	,m_player(NULL)
{
}
CCScene* HelloWorld::scene()
{
    CCScene *scene = CCScene::create();
    
    HelloWorld *layer = HelloWorld::create();

    scene->addChild(layer);

    return scene;
}

bool HelloWorld::init()
{
    if ( !CCLayer::init() )
    {
        return false;
    }
    
    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
	this->setTestMap( CCTMXTiledMap::create("TestMap.tmx"));
	m_testmap->setPosition(CCPointZero);
	this->addChild(m_testmap);
	//添加主角
	this->setPlayer(CCSprite::create("Player.png"));
	m_player->setPosition(ccp(TMXBLOCKSIZE/2,TMXBLOCKSIZE/2));
	//注意:这里是把主角加到地图上
	m_testmap->addChild(m_player);

	//增加菜单
	CCMenuItemImage*  topItem=CCMenuItemImage::create("top_press.png","top.png",this,menu_selector(HelloWorld::menuCallback));
	CCMenuItemImage*  buttomItem=CCMenuItemImage::create("buttom_press.png","buttom.png",this,menu_selector(HelloWorld::menuCallback));
	CCMenuItemImage*  leftItem=CCMenuItemImage::create("left_press.png","left.png",this,menu_selector(HelloWorld::menuCallback));
	CCMenuItemImage*  rightItem=CCMenuItemImage::create("right_press.png","right.png",this,menu_selector(HelloWorld::menuCallback));
	CCMenu* menu=CCMenu::create(topItem,buttomItem,leftItem,rightItem,NULL);
	menu->setPosition(CCPointZero);
	this->addChild(menu);
	topItem->setPosition(ccp(visibleSize.width/2,visibleSize.height-50));
	buttomItem->setPosition(ccp(visibleSize.width/2,50));
	leftItem->setPosition(ccp(50,visibleSize.height/2));
	rightItem->setPosition(ccp(visibleSize.width-50,visibleSize.height/2));
	topItem->setTag(TOPMENUITEM);
	buttomItem->setTag(BUTTOMMENUITEM);
	leftItem->setTag(LEFTMENUITEM);
	rightItem->setTag(RIGHTMENUITEM);
    return true;
}


void HelloWorld::menuCallback(CCObject* pSender)
{

}

这里用到了枚举来设置几个菜单的tag

新增虚拟摇杆

现在,我们需要点击相应的按钮得让我们的主角动起来才行

void HelloWorld::menuCallback(CCObject* pSender)
{
	CCMenuItemImage* item=(CCMenuItemImage*)pSender;
	switch (item->getTag())
	{
	case TOPMENUITEM:
		m_player->setPosition(ccp(m_player->getPositionX(),m_player->getPositionY()+TMXBLOCKSIZE));
		break;
	case BUTTOMMENUITEM:
		m_player->setPosition(ccp(m_player->getPositionX(),m_player->getPositionY()-TMXBLOCKSIZE));
		break;
	case LEFTMENUITEM:
		m_player->setPosition(ccp(m_player->getPositionX()-TMXBLOCKSIZE,m_player->getPositionY()));
		break;
	case RIGHTMENUITEM:
		m_player->setPosition(ccp(m_player->getPositionX()+TMXBLOCKSIZE,m_player->getPositionY()));
		break;
	default:
		break;
	}
}
最后的效果图

tiledmap小游戏

这里大家看,有BUG的,遇到障碍物能穿墙   这要是玩CF就爽爆了

还有,这只是主角在动,地图并没有动

而且,到了最边缘任然可以移动。

所以,这部分的问题,我们下次再来解决。

块下班咯!


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值