加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Cocos3.3横版游戏-Part1

发布时间:2020-12-14 20:15:08 所属栏目:百科 来源:网络整理
导读:在这一部分,我们简单说明一下文件的结构.在新建一个文件的基础上,加入自制的瓦片地图. 文件结构 说明: 合理的文件结构有利于后续开发理解,之前犯了错,到最后结构混乱修改不便 一. 创建项目 在文件夹下Shift+右键,选择:在此处打开命令行窗口,新建一个项目 二.

在这一部分,我们简单说明一下文件的结构.在新建一个文件的基础上,加入自制的瓦片地图.


文件结构

说明:

合理的文件结构有利于后续开发理解,之前犯了错,到最后结构混乱修改不便

一.创建项目

在文件夹下Shift+右键,选择:在此处打开命令行窗口,新建一个项目

二.获取资源.

我重新找了主角资源和地图资源,放在附件链接中.(之后可能会在此更新制作资源方法)

首先是地图,通过Tiled重新做了一个地图


地图有3层:

第一层是Wall,主角和敌人不能跑到墙上去,设定为7层

第二层是floor,主角主要在这里活动,设定为3层

第三层是BlackGround,拿来当填充背景的

每隔瓦片设定都是32X32大小的,地图总大小为80X10



第一步

修改APPDelegate.cpp,符合我们的屏幕大小

<span style="font-family:SimSun;">    auto director = Director::getInstance();
    auto eglView =director->getOpenGLView();
	  if(!eglView) {
        eglView = GLViewImpl::create("My Game");
		eglView->setFrameSize(480,320);
		//WIN32下窗体大小,宽高
        director->setOpenGLView(eglView);
    }
    //director->setOpenGLView(eglView);
	eglView->setDesignResolutionSize(480,320,ResolutionPolicy::SHOW_ALL);</span>


第二步

GameScene中添加我们需要的层

<span style="font-family:SimSun;">	auto scene = Scene::create();
	auto gamelayer=GameLayer::create();
	scene->addChild(gamelayer,0);
	auto operateLayer = OperateLayer::create();
	scene->addChild(operateLayer,1);
	auto statelayer =StateLayer::create();
	scene->addChild(statelayer);</span>

第三步

设置我们的层

GameLayer,游戏在这里处理

<span style="font-family:SimSun;">bool GameLayer::init()
{
	bool ret = false;
	do {
		CC_BREAK_IF( !Layer::init());
		_visiblesize = Director::getInstance()->getVisibleSize();
		_origin = Director::getInstance()->getVisibleOrigin();
		this->_viswidth = _visiblesize.width;
		this->_visheight = _visiblesize.height;
		auto map = MapLayer::create();
		this->addChild(map,-100);
		ret = true;
	} while(0);
	return ret;
}</span>

OperateLayer,我们的摇杆和按键等放在这里

<span style="font-family:SimSun;">bool OperateLayer::init()
{
	bool ret = false;
	do {
		CC_BREAK_IF( !Layer::init() );
		m_pjoystick = Joystick::create();
		m_pjoystick->setJoystick(Vec2(50,50));
		this->addChild(m_pjoystick);
		ret = true;
	} while(0);
	return ret;
}</span>


StateLayer,主角的状态放在这里,我们先空着这一层

<span style="font-family:SimSun;">bool StateLayer::init()
{
	bool ret = false;
	do {
		CC_BREAK_IF( !Layer::init() );
		ret = true;
	} while(0);
	return ret;
}</span>


其中摇杆的写法,在这里我用向量描述,如果你愿意的话可以用其他的比如笛卡尔坐标什么的,还有这个写法可以分段速度,让角色实现走动和跑动,贴得核心代码:

<span style="font-family:SimSun;">void Joystick::updateJoystick(Touch* touch)
{
	Vec2 hit = touch->getLocation();
	float distance = start.getDistance(hit);
	Vec2 direction = (hit - start).getNormalized();
	if(distance < m_pJoystickr/2)
	{
		m_pJoystick->setPosition(start + (direction * distance));
	}else if(distance >m_pJoystickr) {
		m_pJoystick->setPosition(start + (direction * m_pJoystickr));
	}else {
		m_pJoystick->setPosition(start + (direction * m_pJoystickr/2));
	}
}</span>

至于地图的载入方法:

<span style="font-family:SimSun;">bool MapLayer::init()
{
	bool ret = false;
	do {
		CC_BREAK_IF( !Layer::init() );
		this->initMapWithFile("mymap.tmx");
	ret = true;
	} while(0);

	return ret;
}
void MapLayer::initMapWithFile(const char * path)
{
	TMXTiledMap *TileMap = TMXTiledMap::create(path);
	TileMap->setPosition(Vec2(0,0));
	this->addChild(TileMap); 
	global->tileMap = TileMap;
}</span>


至此为止,运行之后应该可以看到一个可以拖动的摇杆+地图了

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读