博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cocos2dx 3.0 过渡篇(二十五)死不了的贪食蛇(触摸版)
阅读量:5025 次
发布时间:2019-06-12

本文共 3882 字,大约阅读时间需要 12 分钟。

上一篇写的贪食蛇的重力感应控制版,这一篇就讲下触摸控制版吧。额,也不知道写了那个贪食蛇教程究竟有没有获得沈老师的书,假设没有的话,看我不拿西瓜刀砍掉 偶尔E往事 的那啥!

重力版链接:

触摸版与重力版的代码大部分都一样,不一样的地方就是要将打开重力感应换成创建一个触摸监听
。步骤例如以下:


1、在GameLayer的init()中创建一个触摸监听事件

[cpp] 
  1. //初始化游戏层  
  2. bool GameLayer::init()  
  3. {  
  4.     if ( !Layer::init() )  
  5.     {  
  6.         return false;  
  7.     }  
  8.   
  9.     auto labhelp = LabelTTF::create("this is game","宋体",15);  
  10.     labhelp->setPosition(Point(0,340));  
  11.     this->addChild(labhelp);  
  12.   
  13.     auto labback = LabelTTF::create("MainMenu","宋体",15);  
  14.     auto miback = MenuItemLabel::create(labback,[](Ref* sender)  
  15.     {  
  16.         Director::getInstance()->replaceScene(HelloWorld::createScene());  
  17.     });  
  18.     miback->setPosition(Point(360,200));  
  19.   
  20.   
  21.     //接受触摸事件  
  22.     auto listener = EventListenerTouchOneByOne::create();  
  23.     listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);//指定触摸的回调函数      
  24.     listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);    
  25.     listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);  
  26.     _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);//将listener放入事件托付中    
  27.   
  28.     //初始化蛇头坐标和食物的坐标  
  29.     sHead = new SnakeNode();  
  30.     sHead->row = rand()%10;  
  31.     sHead->col = rand()%10;  
  32.   
  33.   
  34.     //初始化食物的坐标  
  35.     sFood = new SnakeNode();  
  36.     sFood->row = rand()%10;  
  37.     sFood->col = rand()%10;  
  38.   
  39.     //运行定时任务  
  40.     this->schedule(schedule_selector(GameLayer::logic01),0.5);  
  41.     return true;  
  42. }  

2、在touchBegan()中检測触摸的位置,

[cpp] 
  1. bool GameLayer::onTouchBegan(Touch* touch, Event  *event)  
  2. {  
  3.     auto p = touch->getLocation();//获取当前的触点  
  4.   
  5.   
  6.     int nowrow; //当前用户触摸的行  
  7.     nowrow = ((int)p.y)/32;  
  8.     int nowcol; //当前用户触摸的列  
  9.     nowcol = ((int)p.x)/32;  
  10.   
  11.   
  12.     //假设触点的Y坐标相对于蛇头的Y坐标 大于 触点的X坐标相对于蛇头的X坐标,那么是上下移动,否则左右移动  
  13.     if( abs(nowrow - sHead->row) > abs(nowcol - sHead->col)) //上下移动  
  14.     {  
  15.         if(nowrow > sHead->row)  
  16.         {  
  17.             sHead->dir = DIR_DEF::UP;  
  18.         }  
  19.         else  
  20.         {  
  21.             sHead->dir=DIR_DEF::DOWN;  
  22.         }  
  23.   
  24.   
  25.     }  
  26.     else    //左右移动  
  27.     {  
  28.         if(nowcol > sHead->col)  
  29.         {  
  30.             sHead->dir=DIR_DEF::RIGHT;  
  31.         }  
  32.         else  
  33.         {  
  34.             sHead->dir=DIR_DEF::LEFT;  
  35.         }  
  36.     }  
  37.     CCLOG("rand %d",rand());  
  38.     CCLOG("you touchbegan%f,%f",p.x,p.y);  
  39.   
  40.   
  41.     return true;  
  42. }  

3、第三点仅仅是凑字数的。感觉写这么点东西对不起大家。所以祝大伙身体健康,万事如意,马年吉祥,合家欢乐, 幸福安康,大吉大利,早生贵子。早日成双,摆脱右手...啊呸,脱离单身!
尊重原创,转载请注明来源:

重力版链接:

触摸版与重力版的代码大部分都一样,不一样的地方就是要将打开重力感应换成创建一个触摸监听
。步骤例如以下:


1、在GameLayer的init()中创建一个触摸监听事件

[cpp] 
  1. //初始化游戏层  
  2. bool GameLayer::init()  
  3. {  
  4.     if ( !Layer::init() )  
  5.     {  
  6.         return false;  
  7.     }  
  8.   
  9.     auto labhelp = LabelTTF::create("this is game","宋体",15);  
  10.     labhelp->setPosition(Point(0,340));  
  11.     this->addChild(labhelp);  
  12.   
  13.     auto labback = LabelTTF::create("MainMenu","宋体",15);  
  14.     auto miback = MenuItemLabel::create(labback,[](Ref* sender)  
  15.     {  
  16.         Director::getInstance()->replaceScene(HelloWorld::createScene());  
  17.     });  
  18.     miback->setPosition(Point(360,200));  
  19.   
  20.   
  21.     //接受触摸事件  
  22.     auto listener = EventListenerTouchOneByOne::create();  
  23.     listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);//指定触摸的回调函数      
  24.     listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);    
  25.     listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);  
  26.     _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);//将listener放入事件托付中    
  27.   
  28.     //初始化蛇头坐标和食物的坐标  
  29.     sHead = new SnakeNode();  
  30.     sHead->row = rand()%10;  
  31.     sHead->col = rand()%10;  
  32.   
  33.   
  34.     //初始化食物的坐标  
  35.     sFood = new SnakeNode();  
  36.     sFood->row = rand()%10;  
  37.     sFood->col = rand()%10;  
  38.   
  39.     //运行定时任务  
  40.     this->schedule(schedule_selector(GameLayer::logic01),0.5);  
  41.     return true;  
  42. }  

2、在touchBegan()中检測触摸的位置,

[cpp] 
  1. bool GameLayer::onTouchBegan(Touch* touch, Event  *event)  
  2. {  
  3.     auto p = touch->getLocation();//获取当前的触点  
  4.   
  5.   
  6.     int nowrow; //当前用户触摸的行  
  7.     nowrow = ((int)p.y)/32;  
  8.     int nowcol; //当前用户触摸的列  
  9.     nowcol = ((int)p.x)/32;  
  10.   
  11.   
  12.     //假设触点的Y坐标相对于蛇头的Y坐标 大于 触点的X坐标相对于蛇头的X坐标,那么是上下移动,否则左右移动  
  13.     if( abs(nowrow - sHead->row) > abs(nowcol - sHead->col)) //上下移动  
  14.     {  
  15.         if(nowrow > sHead->row)  
  16.         {  
  17.             sHead->dir = DIR_DEF::UP;  
  18.         }  
  19.         else  
  20.         {  
  21.             sHead->dir=DIR_DEF::DOWN;  
  22.         }  
  23.   
  24.   
  25.     }  
  26.     else    //左右移动  
  27.     {  
  28.         if(nowcol > sHead->col)  
  29.         {  
  30.             sHead->dir=DIR_DEF::RIGHT;  
  31.         }  
  32.         else  
  33.         {  
  34.             sHead->dir=DIR_DEF::LEFT;  
  35.         }  
  36.     }  
  37.     CCLOG("rand %d",rand());  
  38.     CCLOG("you touchbegan%f,%f",p.x,p.y);  
  39.   
  40.   
  41.     return true;  
  42. }  

3、第三点仅仅是凑字数的。感觉写这么点东西对不起大家。所以祝大伙身体健康,万事如意,马年吉祥,合家欢乐, 幸福安康,大吉大利,早生贵子。早日成双,摆脱右手...啊呸,脱离单身!
尊重原创,转载请注明来源:

转载于:https://www.cnblogs.com/mengfanrong/p/4069402.html

你可能感兴趣的文章
css3 标签 background-size
查看>>
python itertools
查看>>
Linux内核调试技术——jprobe使用与实现
查看>>
样式、格式布局
查看>>
ubuntu设计文件权限
查看>>
Vue双向绑定原理详解
查看>>
Android基础总结(5)——数据存储,持久化技术
查看>>
关于DataSet事务处理以及SqlDataAdapter四种用法
查看>>
bootstrap
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
工程经验总结之吹水"管理大境界"
查看>>
为什么JS动态生成的input标签在后台有时候没法获取到
查看>>
20189210 移动开发平台第六周作业
查看>>
java之hibernate之基于外键的双向一对一关联映射
查看>>
rxjs一句话描述一个操作符(1)
查看>>
第一次独立上手多线程高并发的项目的心路历程
查看>>
ServiceStack 介绍
查看>>
Centos7下载和安装教程
查看>>
无谓的通宵加班之后的思索
查看>>
S1的小成果:MyKTV系统
查看>>