原代码来自于网络,因为cocos2d-x 3.0的资料,的确不多,与曾经版本号的接口非常难对上,

所以网上非常多样例都无法调试,对于新学习cocos2d-x 的同学,难度添加了,所以出一个超具体的样例给大家。

源代码地址:http://download.csdn.net/detail/adady/7293629

  1. #include "HelloWorldScene.h"
  2. #include "SimpleAudioEngine.h"
  3. USING_NS_CC;
  4.  
  5. Scene* HelloWorld::createScene()
  6. {
  7. // 1.创建场景
  8. auto scene = Scene::create();
  9.  
  10. // 2.创建图层,把当本类创建出来,至layer
  11. auto layer = HelloWorld::create();
  12.  
  13. // 3.把layer放到 场景其中
  14. scene->addChild(layer);
  15.  
  16. // 4.返回此场景
  17. return scene;
  18. }
  19.  
  20. void HelloWorld::onEnter() //init() 之后就到这个函数
  21. {
  22. LayerColor::onEnter(); //执行 LayerColor 的 onEnter();
  23.  
  24. auto listener = EventListenerTouchOneByOne::create(); //创建监听事件
  25. listener->setSwallowTouches(true); //时间是否向下传递,true 就不会向下传递
  26.  
  27. listener->onTouchBegan = [=](cocos2d::Touch* touch,cocos2d::Event* event) //****这还没懂,是什么意思,弄清楚了,告诉大家,或则大家能够与我分享
  28. {
  29. return true;
  30. };
  31. listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this); //弹起后,调用onTouchEnded函数
  32.  
  33. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); //导演加入 listener 事件
  34. }
  35.  
  36. void HelloWorld::update(float t)
  37. {
  38. Vector<Sprite*> targetsToDelete; //列表targetsToDelete
  39. Vector<Sprite*> projectilesToDelete; //列表projectilesToDelete
  40.  
  41. for (int i = 0; i < _projectiles.size(); i++) //从0至全部进入列表的子弹(所以还没有消失的子弹,包含屏幕外面的还没有结束的)
  42. {
  43. auto projectile = _projectiles.at(i); //当前第i 个子弹 保存至 projectile
  44.  
  45. //获取当前子弹的坐标及大小 得到一个矩形 这里减一个projectile->getContentSize().width / 2,是由于他的锚点在中心,所以要减掉
  46. auto projectileRect = Rect(
  47. projectile->getPositionX() - projectile->getContentSize().width / 2,
  48. projectile->getPositionY() - projectile->getContentSize().height / 2,
  49. projectile->getContentSize().width,
  50. projectile->getContentSize().height );
  51.  
  52. for (int j = 0; j < _targets.size(); j++)
  53. {
  54. auto target = _targets.at(j); //当前第j 个目标 保存至 target
  55. //获取当前目标的坐标及大小 得到一个矩形
  56. auto targetRect = Rect(
  57. target->getPositionX() - target->getContentSize().width / 2,
  58. target->getPositionY() - target->getContentSize().height / 2,
  59. target->getContentSize().width,
  60. target->getContentSize().height);
  61.  
  62. if (projectileRect.intersectsRect(targetRect)) //一一比对,有没有子弹与目标碰撞了
  63. {
  64. targetsToDelete.pushBack(target); //碰撞后,把要删除的目标,加入队列
  65. }
  66. }
  67.  
  68. //C++11 的 range-based for循环
  69. for (Sprite* target : targetsToDelete) //遍历 targetsToDelete 里全部元素 一一保存至 target
  70. {
  71. _targets.eraseObject(target); //移除 _target表里的 target,并非 targetsToDelete
  72. this->removeChild(target); //当前 layer 移掉 target
  73.  
  74. _projectilesDestroyed++; //每打中一个 加一分
  75. if (_projectilesDestroyed >3) { //大于3分 转换至 成功场景
  76. auto gameOverScene = GameOverScene::create();
  77. gameOverScene->getLayer()->getLabel()->setString("You Win!");
  78. Director::getInstance()->replaceScene(gameOverScene);
  79. }
  80. }
  81.  
  82. if (targetsToDelete.size() >0) //当第i个子弹 有碰撞,就意味着 size 大于0
  83. {
  84. projectilesToDelete.pushBack(projectile); //把当前子弹加入入 子弹删除列表
  85. }
  86. targetsToDelete.clear(); // 清空 目标删除 列表
  87. }
  88.  
  89. for (const auto& p : projectilesToDelete) //遍历 targetsToDelete 里全部元素 一一保存至 p
  90. {
  91. _projectiles.eraseObject(p); //移除 _projectiles表里的 target,并非 projectilesToDelete
  92. this->removeChild(p); //当前 layer 移掉 projectiles
  93. //p->removeFromParentAndCleanup(true);
  94. }
  95. projectilesToDelete.clear(); // 清空 目标删除 列表
  96.  
  97. }
  98.  
  99. // on "init" you need to initialize your instance
  100. bool HelloWorld::init()
  101. {
  102. if ( !LayerColor::initWithColor(Color4B(255,255,255,255)) ) //5. 把本图层的背景设置成白色
  103. {
  104. return false; //假设图层没有被创建就false
  105. }
  106.  
  107. Size visibleSize = Director::getInstance()->getVisibleSize(); //getInstance()应该是得到导演的句柄,取得屏幕的尺寸
  108.  
  109. auto player = Sprite::create("Player.png", Rect(0, 0, 27, 40)); //创建一个玩家的精灵,他的大小改动为width:27 hight:40
  110. player->setPosition(Point(player->getContentSize().width/2, visibleSize.height / 2)); //设置精灵出现的位子,程序选择放在(27/2,屏幕中间)的位子,就是在左中,全然的能够显示图片
  111. this->addChild(player, 0); //加入玩家精灵,进入图层
  112.  
  113. //更新函数
  114. this->schedule(schedule_selector(HelloWorld::gameLogic), 1.0f); //schedule是按时调用一个函数的方法,定义这个以后就会隔一段时间调用一次该方法,每一秒调用一次gameLogic函数 //schedule_selector 应该是注冊HelloWorld::gameLogic 这个函数
  115.  
  116. this->scheduleUpdate(); //这表示大概每0.01秒 调用一次 Update()函数
  117.  
  118. CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("background-music-aac.caf"); //载入声音文件
  119.  
  120. return true;
  121. }
  122.  
  123. void HelloWorld::gameLogic(float dt) //每1秒调用一次
  124. {
  125. addTarget();//每1秒调用一次
  126. }
  127.  
  128. void HelloWorld::addTarget()
  129. {
  130. Size visibleSize = Director::getInstance()->getVisibleSize(); //得到屏幕尺寸
  131.  
  132. auto target = Sprite::create("Target.png", Rect(0, 0, 27, 40)); //创建一个 目标精灵
  133.  
  134. // Determine where to spawn the target along the Y axis
  135. int minY = target->getContentSize().height / 2; // 得到Target 能够显示的最小位置 (相当于图片的height 的中点)
  136. int maxY = visibleSize.height - target->getContentSize().height / 2; // 得到Target 能够显示的最大位置
  137. int rangeY = maxY - minY; // 得到可显示区域的大小
  138. int actualY = (CCRANDOM_0_1() * rangeY) + minY; //(随机产生一个数(0,1) * rangeY) + minY 得到(0-1)的小数
  139. target->setPosition(Point(visibleSize.width + target->getContentSize().width / 2, actualY)); //设置Target 出现的位子
  140. this->addChild(target,0); //加入到本图层内
  141.  
  142. target->setTag(1); //设置这个Targer 的标签为1
  143. _targets.pushBack(target); //把Target 存于 _targets的列表
  144.  
  145. //以下4句,随即产生一个速度
  146. int minDuration = 2.0;
  147. int maxDuration = 4.0;
  148. int rangeDuration = maxDuration - minDuration;
  149. int actualDuration = (CCRANDOM_0_1() * rangeDuration) + minDuration;
  150.  
  151. auto actionMove = MoveTo::create(actualDuration, Point(-target->getContentSize().width, actualY)); //创建一个速度移动, actualDuration速度, Point(-target->getContentSize().width, actualY)是起始点
  152. auto actionMoveDone = CallFuncN::create(CC_CALLBACK_1(HelloWorld::spriteMoveFinished, this)); //这里是创建一个回调函数,就是调用spriteMoveFinished函数 并把自己传出去this。
  153.  
  154. target->runAction(Sequence::create(actionMove, actionMoveDone, NULL)); //执行一个动画 actionMove 移动方法 actionMoveDone回调的函数
  155.  
  156. //从上面看来,这个函数,每1秒创建一个Target 精灵,从屏幕的最右边,随机高度,至左移动
  157.  
  158. }
  159.  
  160. void HelloWorld::onTouchEnded(Touch* touch, Event* event) //按下事件
  161. {
  162. Size visibleSize = Director::getInstance()->getVisibleSize(); //获得屏幕尺寸
  163.  
  164. auto touchPoint = touch->getLocation(); //获得点击坐标
  165.  
  166. auto projectile = Sprite::create("Projectile.png", Rect(0, 0, 20, 20)); //创建一个子弹
  167. projectile->setPosition(Point(20, visibleSize.height / 2)); //设置子弹位子
  168.  
  169. // Determine offset of location to projectile
  170. int offX = touchPoint.x - projectile->getPosition().x; //点击位置与子弹X位置的差值
  171. int offY = touchPoint.y - projectile->getPosition().y; //点击位置与子弹Y位置的差值
  172.  
  173. if (offX <= 0) return; //假设 子弹 超出范围 return
  174.  
  175. this->addChild(projectile); //把 子弹 加入进图层
  176.  
  177. projectile->setTag(2); // 把子弹的标签设置为2
  178. _projectiles.pushBack(projectile); // 把子弹加入进子弹列表
  179.  
  180. // Determine where we wish to shoot the projectile to
  181. int realX = visibleSize.width + (projectile->getContentSize().width / 2); //求出屏幕最大 + 子弹的一半, (求出子弹消失的最大x)
  182. float ratio = (float)offY / (float)offX; //斜率
  183. int realY = (realX * ratio) + projectile->getPosition().y; //求出真实的y值,同样的斜率
  184. auto realDest = Point(realX, realY); //子弹要去位置
  185.  
  186. // 理解上面的话,以下5句就非常好理解了
  187. int offRealX = realX - projectile->getPosition().x; //真实X值
  188. int offRealY = realY - projectile->getPosition().y; //真实Y值
  189. float length = sqrtf((offRealX*offRealX) + (offRealY*offRealY)); //求出 直线距离
  190. float velocity = 960 / 1; // 960pixels/1sec //960 像素/ 1秒
  191. float realMoveDuration = length / velocity; //速度
  192.  
  193. // 创建一个动作,移动动作,realMoveDuration速度,至realDest,并进入回调函数
  194. projectile->runAction(Sequence::create(MoveTo::create(realMoveDuration, realDest),CallFuncN::create(CC_CALLBACK_1(HelloWorld::spriteMoveFinished, this)), NULL));
  195.  
  196. CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("pew-pew-lei.caf"); //载入声音文件
  197. }
  198.  
  199. void HelloWorld::spriteMoveFinished(Ref* pSender)
  200. {
  201. Sprite *sprite = (Sprite *)pSender; //获得的Target 转成 sprite 类型
  202.  
  203. if (sprite->getTag() == 1) { //假设 标签 等于 1
  204. _targets.eraseObject(sprite); //从_target列表里删掉Target 仅仅是从列表里删掉
  205.  
  206. auto gameOverScene = GameOverScene::create(); //创建一个GameOver的场景
  207. gameOverScene->getLayer()->getLabel()->setString("You Lose :["); //显示youLose
  208. Director::getInstance()->replaceScene(gameOverScene); //替换成刚生成的GameOver场景
  209. } else if(sprite->getTag() == 2) { //假设 标签 等于 2
  210. _projectiles.eraseObject(sprite); //从_projectiles列表里删掉 Projectiles 仅仅是从列表里删掉
  211. }
  212.  
  213. this->removeChild(sprite); //删掉sprite 这个图层
  214.  
  215. }
  216.  
  217. void HelloWorld::menuCloseCallback(Ref* pSender)
  218. {
  219. Director::getInstance()->end();
  220.  
  221. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  222. exit(0);
  223. #endif
  224. }
  1.  

cocos2d-x 3.0来做一个简单的游戏教程 win32平台 vs2012 详解献给刚開始学习的人们!的更多相关文章

  1. Lua刚開始学习的人(一)--Lua 简单教学

    近期因为工作原因.临时木有<Oracle起步学习>续集.领导知道学习下Lua脚本语言.看了一周了.趁热打铁,留下点实用的东西吧. 本系列会主要针对宿主语言为 Delphi,原理都是一样的, ...

  2. 简单的刚開始学习的人配置Android SDK+ADT+Eclipse

    1.下载JDK.Android SDK和Eclipse(Eclipse 版本号最好新一些) 注意:下载的SDK最好和后面的ADT配套,否则Eclipse可能会报错. 如:SDK 21.0.1 相应 A ...

  3. .Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器

    目标:使用.net core最新的3.0版本,借助httpclient和本机的host域名代理,实现网络请求转发和内容获取,最终显示到目标客户端! 背景:本人在core领域是个新手,对core的使用不 ...

  4. 【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不 ...

  5. 使用React并做一个简单的to-do-list

    1. 前言 说到React,我从一年之前就开始试着了解并且看了相关的入门教程,而且还买过一本<React:引领未来的用户界面开发框架 >拜读.React的轻量组件化的思想及其virtual ...

  6. 【 D3.js 入门系列 --- 3 】 做一个简单的图表!

    前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...

  7. 一起用HTML5 canvas做一个简单又骚气的粒子引擎

    前言 好吧,说是"粒子引擎"还是大言不惭而标题党了,离真正的粒子引擎还有点远.废话少说,先看demo 本文将教会你做一个简单的canvas粒子制造器(下称引擎). 世界观 这个简单 ...

  8. 【 D3.js 入门系列 — 3 】 做一个简单的图表!

    图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 ...

  9. Windows Phone开发(21):做一个简单的绘图板

    原文:Windows Phone开发(21):做一个简单的绘图板 其实我们今天要说的就是一个控件--InkPresenter,这个控件并不是十分强大,没办法和WPF中的InkCanvas相比,估计在实 ...

随机推荐

  1. zIndex属性在IE中无效

    在ie中他的子类的zindex就以父类为准: <!doctype html> <html> <head> <meta charset="utf-8& ...

  2. ZOJ 2972 Hurdles of 110m 【DP 背包】

    一共有N段过程,每段过程里可以选择 快速跑. 匀速跑 和 慢速跑 对于快速跑会消耗F1 的能量, 慢速跑会集聚F2的能量 选手一开始有M的能量,即能量上限 求通过全程的最短时间 定义DP[i][j] ...

  3. USACO Subset 整数划分01背包

    又是去理解了一次01背包. 这道题目的意思就是给你一个N (N < 40)表示有一个集合{1,2,3,... n} 你要将它划分成相等的两个子集合,求有几种划分方式 如果N是奇数,那么显然不能由 ...

  4. ZOJ2849 优先队列BFS

    Attack of Panda Virus Time Limit: 3 Seconds      Memory Limit: 32768 KB In recent months, a computer ...

  5. 基于FPGA的DW8051移植(三)

    总结一下问题: 1) http://www.cnblogs.com/sepeng/p/4137405.html  基于FPGA的DW8051移植(一)里面用modelsim观测波形发现程序进入了ida ...

  6. 转:CI引入外部js与css

    其实不管是在用CI还是ZF都有同样一个问题,就是路径的问题.前期,我在用ZF做CMS时,我在.htaccess文件中设置了如遇到js,css,img等资源文件都不重定向.但今天在用CI时,却忘记了,搞 ...

  7. 基于visual Studio2013解决算法导论之015第二小元素

     题目 查找第二小元素 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...

  8. GlusterFS常用命令

    1.启动/关闭/查看glusterd服务 # /etc/init.d/glusterd start # /etc/init.d/glusterd stop # /etc/init.d/glusterd ...

  9. BZOJ 1131: [POI2008]Sta( dfs )

    对于一棵树, 考虑root的答案向它的孩子转移, 应该是 ans[son] = (ans[root] - size[son]) + (n - size[son]). so , 先 dfs 预处理一下, ...

  10. Nginx的500,502,504错误解决方法

    Nginx的500,502,504错误解决方法 一.解决500错误: 1.500错误指的是服务器内部错误,也就是服务器遇到意外情况,而无法履行请求. 2.500错误一般有几种情况: (1)web脚本错 ...