(11) Cocos2d-x3.3RC0之LightTest分析

1、头文件

  1. //LightTest.h
  2. classLightTest:publicLayer
  3. {
  4. public:
  5. CREATE_FUNC(LightTest);
  6. Lighttest();
  7. virtual~Lighttest();
  8. virtualvoidupdate(floatdelta);
  9. voidSwitchLight(Ref*sender,LightTypelightType);//转换光源
  10. private:
  11. voidaddSprite();//添加精灵
  12. voidaddLights();//添加光源
  13. private:
  14. AmbientLight*_ambientLight;//环境光,想四周发射光线,模拟一个屋子的环境,光线来源方向不定。
  15. DirectionLight*_directionalLight;//方向光,表示一个非常远的光源,投射光线是平行的,用来模拟太阳光
  16. PointLight*_pointLight;//点光,从空间某点向四周均匀发射有限长的光线,用来模拟向四周发射状的光
  17. SpotLight*_spotLight;//聚光,从某点发射一个圆锥形状,用来模拟台灯
  18. Label*_ambientLightLabel;
  19. Label*_directionalLightLabel;
  20. Label*_pointLightLabel;
  21. Label*_spotLightLabel;
  22. };

2、Cpp文件

  1. #include"LightTest.h"
  2. //构造函数,初始化除环境光AmbientLight之外的三种光为nullptr
  3. LightTest::Lighttest()
  4. :_directionalLight(nullptr)
  5. ,_pointLight(nullptr)
  6. ,_spotLight(nullptr)
  7. {
  8. addSprite();//添加精灵
  9. addLights();//添加光源
  10. scheduleUpdate();//帧更新
  11. //设置摄像机位置
  12. autos=Director::getInstance()->getWinSize();
  13. //参数1:透视相机的视野,通常在40-60度范围
  14. //参数2:相机的长宽比,通常视窗的宽度除以视窗的高度
  15. //参数3:近点平面距离
  16. //参数4:原点平面距离
  17. autocamera=Camera::createPerspective(60,(GLfloat)s.width/s.height,1.0f,1000.0f);
  18. camera->setCameraFlag(CameraFlag::USER1);//设置相机Flag
  19. camera->setPosition3D(Vec3(0.0,100,100));//设置相机3D坐标
  20. //参数1:目标的中心位置,参数2:向上的向量
  21. camera->lookAt(Vec3(0.0,0.0,0.0),Vec3(0.0,1.0,0.0));
  22. addChild(camera);
  23. //添加相机转换的开光,Label控件
  24. TTFConfigttfConfig("fonts/arial.ttf",30);
  25. _ambientLightLabel=Label::createWithTTF(ttfConfig,"AmbientLightON");
  26. _ambientLightLabel->retain();
  27. automenuItem0=MenuItemLabel::create(_ambientLightLabel,CC_CALLBACK_1(LightTest::SwitchLight,this,LightType::AMBIENT));
  28. _directionalLightLabel=Label::createWithTTF(ttfConfig,"DirectionalLightOFF");
  29. _directionalLightLabel->retain();
  30. automenuItem1=MenuItemLabel::create(_directionalLightLabel,LightType::DIRECTIONAL));
  31. _pointLightLabel=Label::createWithTTF(ttfConfig,"PointLightOFF");
  32. _pointLightLabel->retain();
  33. automenuItem2=MenuItemLabel::create(_pointLightLabel,LightType::POINT));
  34. _spotLightLabel=Label::createWithTTF(ttfConfig,"SpotLightOFF");
  35. _spotLightLabel->retain();
  36. automenuItem3=MenuItemLabel::create(_spotLightLabel,LightType::SPOT));
  37. automenu=Menu::create(menuItem0,menuItem1,menuItem2,menuItem3,nullptr);
  38. menu->setPosition(Vec2::ZERO);
  39. menuItem0->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
  40. menuItem0->setPosition(Vec2(VisibleRect::left().x,VisibleRect::top().y-50));
  41. menuItem1->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
  42. menuItem1->setPosition(Vec2(VisibleRect::left().x,VisibleRect::top().y-100));
  43. menuItem2->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
  44. menuItem2->setPosition(Vec2(VisibleRect::left().x,VisibleRect::top().y-150));
  45. menuItem3->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
  46. menuItem3->setPosition(Vec2(VisibleRect::left().x,VisibleRect::top().y-200));
  47. addChild(menu);
  48. }
  49. //析构资源
  50. LightTest::~Lighttest()
  51. {
  52. if(_spotLightLabel)
  53. _spotLightLabel->release();
  54. if(_pointLightLabel)
  55. _pointLightLabel->release();
  56. if(_directionalLightLabel)
  57. _directionalLightLabel->release();
  58. if(_spotLight)
  59. _spotLight->release();
  60. if(_pointLight)
  61. _pointLight->release();
  62. if(_directionalLight)
  63. _directionalLight->release();
  64. if(_ambientLight)
  65. _ambientLight->release();
  66. }
  67. voidLightTest::addSprite()
  68. //创建3D对象,c3b是二进制文件,通过FBX模型文件进行二次转换得到。
  69. //obj:FBX是一种通用导出格式,可通过maya和max导出,maya和max认导出obj格式文件
  70. //c3t:通过FBX模型文件转换生成的Json文件,体积大载入慢,不提倡使用
  71. //c3b:二进制文件,数据内容与c3t一样,体积小,速度快,提倡使用
  72. //注意:.c3b文件的使用需和它对应的贴图拷贝到Resource目录下,否则,运行时找不到资源。
  73. std::stringfileName="orc.c3b";
  74. //创建3D精灵对象
  75. autosprite=Sprite3D::create(fileName);
  76. sprite->setRotation3D(Vec3(0.0,180.0,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> sprite->setPosition(Vec2(0.0,0.0));
  77. sprite->setScale(2.0);
  78. //创建3D精灵对象
  79. autosp=Sprite3D::create("axe.c3b");
  80. //通过骨骼名称获得连接点
  81. sprite->getAttachNode("Bip001RHand")->addChild(sp);
  82. //创建3D动画
  83. autoanimation=Animation3D::create(fileName);
  84. if(animation)
  85. autoanimate=Animate3D::create(animation);
  86. sprite->runAction(RepeatForever::create(animate));//3D精灵执行3D动画
  87. addChild(sprite);
  88. //设置精灵的Mask,该值与相机的flag进行&运算为真,则对相机可见
  89. sprite->setCameraMask(2);
  90. //同上
  91. std::stringfileName="sphere.c3b";
  92. sprite->setPosition(Vec2(30.0,248); margin:0px!important; padding:0px 3px 0px 10px!important"> sprite->setCameraMask(2);
  93. //同上
  94. std::stringfileName="sphere.c3b";
  95. autosprite=Sprite3D::create(fileName);
  96. sprite->setScale(0.5f);
  97. sprite->setPosition(Vec2(-50.0,248); margin:0px!important; padding:0px 3px 0px 10px!important"> sprite->setPosition(Vec2(-30.0,10.0));
  98. voidLightTest::addLights()
  99. autos=Director::getInstance()->getWinSize();
  100. //环境光
  101. _ambientLight=AmbientLight::create(Color3B(200,200,200));
  102. _ambientLight->retain();
  103. _ambientLight->setEnabled(true);//开启光源
  104. addChild(_ambientLight);
  105. _ambientLight->setCameraMask(2);//确保相机可见
  106. //方向光,参数1:光源方向.参数2:光源颜色
  107. _directionalLight=DirectionLight::create(Vec3(-1.0f,-1.0f,0.0f),Color3B(200,200));
  108. _directionalLight->retain();
  109. _directionalLight->setEnabled(false);//光源关闭
  110. addChild(_directionalLight);
  111. _directionalLight->setCameraMask(2);//确保相机可见
  112. //点光,参数1:光源的位置,参数2:光源的颜色。参数3:光源范围
  113. _pointLight=PointLight::create(Vec3(0.0f,0.0f,200),10000.0f);
  114. _pointLight->retain();
  115. _pointLight->setEnabled(//光源关闭
  116. addChild(_pointLight);
  117. _pointLight->setCameraMask(2);//聚光,参数1:方向。参数2:位置。参数3:颜色,参数4:内圆弧度。参数5:外圆弧度。参数6:光源范围
  118. _spotLight=SpotLight::create(Vec3(-1.0f,Vec3(0.0f,0.5,10000.0f);
  119. _spotLight->retain();
  120. _spotLight->setEnabled( addChild(_spotLight);
  121. _spotLight->setCameraMask(2); autotintto1=TintTo::create(4,255);
  122. autotintto2=TintTo::create(4,0);
  123. autotintto3=TintTo::create(4,0);
  124. autotintto4=TintTo::create(4,255);
  125. autoseq=Sequence::create(tintto1,tintto2,tintto3,tintto4,248); margin:0px!important; padding:0px 3px 0px 10px!important"> _ambientLight->runAction(RepeatForever::create(seq));//光源执行渐隐动作
  126. autotintto1=TintTo::create(4,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> autotintto2=TintTo::create(4,248); margin:0px!important; padding:0px 3px 0px 10px!important"> autotintto3=TintTo::create(4,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> autotintto4=TintTo::create(4,248); margin:0px!important; padding:0px 3px 0px 10px!important"> autoseq=Sequence::create(tintto1,nullptr);
  127. _directionalLight->runAction(RepeatForever::create(seq));//光源执行渐隐动作
  128. autoseq=Sequence::create(tintto2,tintto1,248); margin:0px!important; padding:0px 3px 0px 10px!important"> _pointLight->runAction(RepeatForever::create(seq)); autoseq=Sequence::create(tintto3,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> _spotLight->runAction(RepeatForever::create(seq));voidLightTest::update(floatdelta)
  129. staticfloatangleDelta=0.0;
  130. if(_directionalLight)
  131. _directionalLight->setRotation3D(Vec3(-45.0,-CC_radians_TO_degrees(angleDelta),0.0f));//设置旋转角度,宏是弧度转化为角度
  132. //cosf与sinf:float版的cos和sin
  133. if(_pointLight)
  134. _pointLight->setPositionX(100.0f*cosf(angleDelta+2.0*delta));
  135. _pointLight->setPositionY(100.0f);
  136. _pointLight->setPositionZ(100.0f*sinf(angleDelta+2.0*delta));
  137. if(_spotLight)
  138. _spotLight->setPositionX(100.0f*cosf(angleDelta+4.0*delta));
  139. _spotLight->setPositionY(100.0f);
  140. _spotLight->setPositionZ(100.0f*sinf(angleDelta+4.0*delta));
  141. _spotLight->setDirection(-Vec3(cosf(angleDelta+4.0*delta),sinf(angleDelta+4.0*delta)));
  142. angleDelta+=delta;
  143. //update(delta);
  144. //光源开关
  145. voidLightTest::SwitchLight(Ref*sender,LightTypelightType)
  146. switch(lightType)
  147. caseLightType::AMBIENT:
  148. charstr[32];
  149. boolisON=!_ambientLight->isEnabled();
  150. sprintf(str,"AmbientLight%s",isON==true?"ON":"OFF");
  151. _ambientLight->setEnabled(isON);
  152. _ambientLightLabel->setString(str);
  153. break;
  154. caseLightType::DIRECTIONAL:
  155. boolisON=!_directionalLight->isEnabled();
  156. "DirectionalLight%s",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> _directionalLight->setEnabled(isON);
  157. _directionalLightLabel->setString(str);
  158. caseLightType::POINT:
  159. boolisON=!_pointLight->isEnabled();
  160. "PointLight%s",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> _pointLight->setEnabled(isON);
  161. _pointLightLabel->setString(str);
  162. caseLightType::SPOT:
  163. boolisON=!_spotLight->isEnabled();
  164. "SpotLight%s",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> _spotLight->setEnabled(isON);
  165. _spotLightLabel->setString(str);
  166. default:
  167. break;
  168. }

3、使用

在HelloWorldScene.cpp中的createScene()中,创建LightTest的对象,加入Scene

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是