• Cocos2dx 3.0 过渡篇(二十五)死不了的贪食蛇(触摸版)


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


    重力版链接:http://blog.csdn.net/start530/article/details/23707985

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

    1、在GameLayer的init()中创建一个触摸监听事件
    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()中检測触摸的位置,
    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、第三点仅仅是凑字数的。感觉写这么点东西对不起大家。所以祝大伙身体健康,万事如意,马年吉祥,合家欢乐, 幸福安康,大吉大利,早生贵子。早日成双,摆脱右手...啊呸,脱离单身!

    尊重原创,转载请注明来源:http://blog.csdn.net/start530/article/details/23784985上一篇写的贪食蛇的重力感应控制版,这一篇就讲下触摸控制版吧。额,也不知道写了那个贪食蛇教程究竟有没有获得沈老师的书,假设没有的话,看我不拿西瓜刀砍掉 偶尔E往事 的那啥!


    重力版链接:http://blog.csdn.net/start530/article/details/23707985

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

    1、在GameLayer的init()中创建一个触摸监听事件
    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()中检測触摸的位置,
    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、第三点仅仅是凑字数的。感觉写这么点东西对不起大家。所以祝大伙身体健康,万事如意,马年吉祥,合家欢乐, 幸福安康,大吉大利,早生贵子。早日成双,摆脱右手...啊呸,脱离单身!

    尊重原创,转载请注明来源:http://blog.csdn.net/start530/article/details/23784985
  • 相关阅读:
    asp 后台批量管理程序
    面经
    单例模式(singleton)解析例子
    互联网产品经理必读书籍
    Struts2中的OGNL表达式
    阿里巴巴面经
    Servlet/JSP如何控制页面缓存于squid中
    Java陷阱一箩筐面试题集及解答
    阿里巴巴笔经http://bbs.yingjiesheng.com/forum.php?mod=viewthread&tid=696098&extra=page%3D1%26filter%3Dtypeid%26typeid%3D6356%26typeid%3D6356
    阿里巴巴java笔试
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4069402.html
Copyright © 2020-2023  润新知