Cocos2dx 3.0 过渡篇(二十四)死不了的贪食蛇(重力版)(2)

来源:未知 责任编辑:责任编辑 发表时间:2014-04-20 03:36 点击:
2、帮助界面其实就一menu,所以我就不啰嗦介绍了,直接看下游戏界面的代码实现:
1)首先在onEnter()中打开重力感应

void GameLayer::onEnter()
{
	Layer::onEnter();
	CCLOG("GameLayer onEnter");


	Device::setAccelerometerEnabled(true);//打开设备的重力感应
    auto listener = EventListenerAcceleration::create(CC_CALLBACK_2(HelloWorld::onAcceleration, this));//创建一个重力监听事件
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);//将listener放到事件委托中
}
2)在init()中初始化蛇头和食物的坐标,并开启定时器实时更新蛇的坐标
bool GameLayer::init()
{
	if ( !Layer::init() )
	{
		return false;
	}


	auto labhelp = LabelTTF::create("this is game","宋体",15);
	labhelp->setPosition(Point(0,340));
	this->addChild(labhelp);


	auto labback = LabelTTF::create("MainMenu","宋体",15);
	auto miback = MenuItemLabel::create(labback,[](Ref* sender)
	{
		Director::getInstance()->replaceScene(HelloWorld::createScene());
	});
	miback->setPosition(Point(360,200));


	//chead=::CCTextureCache::sharedTextureCache()->addImage("head.png");


	//初始化蛇头坐标和食物的坐标,用下面这种方法随机出来的坐标每次运行时都是一样一样的......
	sHead = new SnakeNode();
	sHead->row = rand()%10;
	sHead->col = rand()%10;


	//初始化食物的坐标
	sFood = new SnakeNode();
	sFood->row = rand()%10;
	sFood->col = rand()%10;


	//执行定时任务
	this->schedule(schedule_selector(GameLayer::logic01),0.5);
	return true;
}
//定时器
void GameLayer::logic01(float t)
{   
	//移动蛇的身体
	for(int i = allBody.size()-1; i>=0; i--)
	{ 
		SnakeNode * sn = (SnakeNode *)allBody.at(i);//获取蛇身体上的某个节点
		
		if(i>0) 
		{ 
			//如果该节点不是第一个节点,那么该节点的下一个坐标就是其前一个点的坐标(这里不用多解释,玩过蛇的都懂)
			SnakeNode * snpre = (SnakeNode *)allBody.at(i-1);//获取前一个节点,把前一个节点的方向,坐标传给当前节点
			sn->dir = snpre->dir;
			sn->row = snpre->row;
			sn->col = snpre->col;
		}
		else if(i==0)
		{
			//如果i=0则是第一个节点,蛇头的坐标便是该节点的坐标
			sn->dir = sHead->dir;
			sn->row = sHead->row;
			sn->col = sHead->col;
		}
	}


	//移动蛇头,根据dir来判断蛇头的移动方向
	switch(sHead->dir)
	{
	case DIR_DEF::UP:
		sHead->row++;//上移
		if(sHead->row >= 10)
		{
			sHead->row=0;//超过顶部边界后便从底部出来
		}
		break;
	case DIR_DEF::DOWN:
		sHead->row--;
		if(sHead->row < 0)
		{
			sHead->row=9;
		}
		break;
	case DIR_DEF::LEFT:
		sHead->col--;
		if(sHead->col < 0)
		{
			sHead->col=9;
		}
		break;
	case DIR_DEF::RIGHT:
		sHead->col++;
		if(sHead->col >= 10)
		{
			sHead->col=0;
		}
		break;
	};  


	//碰撞检测
	//如果蛇头的横、列位置一样,说明蛇吃到了这个食物
	if(sHead->row == sFood->row && sHead->col == sFood->col)
	{ 
		//食物从当前位置消失,随机出现在下一个坐标
		sFood->row = rand()%10;
		sFood->col = rand()%10;


		//添加身体到集合
		SnakeNode * sn = new SnakeNode();//创建一个新的节点(也就是吃掉的那个食物),将其放到蛇的尾巴上
		SnakeNode * lastNode = NULL;
		//获取蛇的最后一个节点,如果allBody的size()为0,则说明蛇是第一次捕食,那么它的最后一个节点也就是蛇头啦。
		if(allBody.size()>0)
			lastNode = (SnakeNode *)allBody.back();
		else
			lastNode = sHead;//最后一个节点是蛇头


		//通过最后一个节点的方向来个新的节点初始化横、列坐标
		switch(lastNode->dir)
		{
		case DIR_DEF::UP:
			sn->row = lastNode->row-1;
			sn->col = lastNode->col;
			break;
		case DIR_DEF::DOWN:
			sn->row = lastNode->row+1;
			sn->col = lastNode->col;
			break;
		case DIR_DEF::LEFT:
			sn->row = lastNode->row;
			sn->col = lastNode->col+1;
			break;
		case DIR_DEF::RIGHT:
			sn->row=lastNode->row;
			sn->col=lastNode->col-1;
			break;
		}
		this->allBody.pushBack(sn);//将新的节点加入到蛇的身体中。
	}
}
	
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • cocos2d-x学习笔记(19)--label 、label atlas
  • cocos2d-x学习笔记(23)--地图的使用3--CCTMXLayer
  • Cocos2d-x学习(一):HelloWorld
  • cocos2dx在xcode下开发,编译到android上(2)
  • cocos2d 设置屏幕默认方向
  • Cocos2d-x 2.0 之 Actions “三板斧” 之一
  • cocos2d-x学习笔记(22)--地图的使用2(TMX) --Z-Order、AnchorPoi
  • cocos2d-x学习笔记(18)--游戏打包(windows平台)
  • cocos2d-x学习笔记(16)--spritesheet(精灵表单)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1