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

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

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

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

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

[cpp] view plaincopy

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

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

[cpp] view plaincopy

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

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

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


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

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

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

[cpp] view plaincopy

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

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

[cpp] view plaincopy

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

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

尊重原创,转载请注明来源:http://blog.csdn.net/start530/article/details/23784985

时间: 2024-08-10 19:17:41

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

Cocos2dx 3.0 过渡篇(二十九)globalZOrder()与localZOrder()

前天很难得的加班到八点...为什么说难得呢?因为平时我几乎就没加班过.六点下班后想走就走,想留就留.率直洒脱,不拘一格,尽显男儿本色.程序员,就是这么自信! -----------这篇博客的标题本想叫"...3.0新的渲染...介绍",最后还是拉不下这个脸.为啥?觉得自己对渲染的认识还是过于表面,谈不上理解.当然了,这并不影响这篇博客继续写下去.下面看一段3.0Release Notes 对于新渲染器的一段介绍: Node 增加了新的函数 setGlobalZOrder() / get

Cocos2dx 3.0 过渡篇(二十八)C++11强类型枚举

一朋友在微信朋友圈晒了张照片,随手点开大图,带着欣赏的眼光扫了下,恩,几个月不见,又漂亮了...咦?等等,她戴的这是什么?酷炫的造型!金属边框!微型摄像头!这不是传说中的谷歌眼镜么?土豪啊,还好我们已经是朋友了...我先给了她一个赞,然后直奔主题,霸气回复道:我过几天去找你,你戴的是谷歌眼镜吧,哼哼小样,不想死的话...就让我...摸一下下可以么,我不奢求戴,摸一下就满足了...(哎,丢人啊). ------------------- 在cocos2dx 3.0的文档里有这么一句话:以 k 开头

Cocos2dx 3.0 过渡篇(三十一)ValueVector和Vector不得不说的故事

本文投票地址:http://vote.blog.csdn.net/Article/Details?articleid=37834689 前天看到一个颇为纠结的选择题:有一天你遇到一个外星人,这时外星人很热情的邀请你到他们星球去玩,你如何选 1:去,但是你有可能永远不能在回来.2:不去,但是外星人会消去你的记忆 这问题很刺激有木有?!看似简单的一个问题,不同的答案却隐藏着不同的含义.------------------鱼与熊掌不可兼得,类似这种例子生活中会经常碰到.同样的,如果你有去了解过Coco

Cocos2dx 3.0 过渡篇(三十二)话说ValueMap的一般使用

周末到厦门找死党聚聚,晚上一伙人杀到一还算凑合的大排档准备来个不醉不归.菜都点完了朋友突然说这里没有洗手间...尼玛,当时我们就不乐意了:喝五六个小时的啤酒,没有洗手间你是打算憋死谁?二话不说直接换一家,不过这次一定要谨慎选择,最终看到一家看起来还算正宗的大排档,我下意识拨了下头发,走到前台MM面前,轻声问道:你们这...有洗手间吗? 声音低沉且性感,语调中还夹带着些许的忧伤. 前台MM瞪大眼睛,好一会才反应过来说道:洗手间?肯定有啊! ----------------------------

Cocos2dx 3.0 过渡篇(二十七)C++11多线程std::thread的简单使用(下)

本篇接上篇继续讲:上篇传送门:http://blog.csdn.net/star530/article/details/24186783 简单的东西我都说的几乎相同了,想挖点深的差点把自己给填进去. 以下实际演练一下.请同意我參考偶尔E往事的一篇线程的博客, 他用的是pThread.这里我就用std::thread. 1.售票孙鑫老师的C++和Java多线程售票也一直让我念念不忘(好吧,我承认我没看过).这里用cocos2d-x3.0和C++11的std::thread实现一个吧.总共同拥有10

JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

JAVA之旅(二十五)--文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上个篇幅讲 一.文本复制 读写都说了,我们来看下其他的操作,我们首先来看复制 复制原理:其实就是将C盘下的文件数据存储到D盘的一个文件中 实现的步骤: 1.在D盘创建一个文件,用于存储文件中的数据 2.定义读取流和文件关联 3.通过不断的读写完成数据的存储 关闭资源 package com.lgl.hel

angular学习笔记(二十五)-$http(3)-转换请求和响应格式

本篇主要讲解$http(config)的config中的tranformRequest项和transformResponse项 1. transformRequest: $http({ transformRequest: function(data){ //对前台发送的data进行处理 return data } }) 这个在测试的时候遇到了很大的问题.只要经过transformRequest函数处理,哪怕是不做任何处理,node后台都会报错,需要尝试使用php 2. transformResp

攻城狮在路上(叁)Linux(二十五)--- linux内存交换空间(swap)的构建

swap的功能是应付物理内存不足的状况,用硬盘来暂时放置内存中的信息. 对于一般主机,物理内存都差不多够用,所以也就不会用到swap,但是对于服务器而言,当遇到大量网络请求时或许就会用到. 当swap被使用的时候,主机的硬盘灯就会闪烁不停. 本篇介绍两种方式:1.设置一个swap分区   2.创建一个虚拟内存的文件. 一.使用物理分区构建swap: 1.首先是分区: A.fdisk /dev/sda; <== 根据后续提示创建一个分区. B.修改分区的ID,因为fdisk默认将分区的ID作为文件

每日算法之二十五:Divide Two Integers

Divide two integers without using multiplication, division and mod operator. 不使用乘法.除法和求模运算求两个数相除. class Solution { public: long long internalDivide(unsigned long long dividend,unsigned long long divisor) { if(dividend<divisor) return 0; int result =