这一篇我们先看cocos2d-x 3.3 Lua开发 摄像机使用。
1.为什么要使用Camera
游戏有点像电影,镜头的使用非常重要。忽远忽近,跟随主角,场景切换等等。一般来说2d游戏不太需要使用Camera,所以Cocos2d-x就没太重视Camera,直到了3.3这个版本才较容易使用Camera。之前一些效果都可以使用其他方式来模拟Camera,但是这样逻辑就不太直观,直接操作Camera是最完美的。
先来看我们这个Camera Demo的效果图:

按照常理来理解就是,一个人不断往上移动(我在飞,哈哈)。

游戏实现方式有2种:

1)固定人物在那个位置,然后把背景往下移动,这样看起来”人物就在往上移动了”
2)人物往上移动,Camera的位置在人物的位置以下,距离人物一段距离,跟随着人物移动而移动,背景完全不动,但会拼接。
在Cocos2d-x 3.3以前,只能用类似第一种方式来实现,一个视觉欺骗,这次有了Camera我们就可以用第二种方式来实现了,更加符合逻辑。
2.创建Camera
if self._camera == nil then
self._camera = cc.Camera:createOrthographic(GameUtil:VISIBLE_WIDTH(), GameUtil:VISIBLE_HEIGHT(), 0, 1)
self._camera:setCameraFlag(cc.CameraFlag.USER1)
self:addChild(self._camera)
self._camera:setPosition3D(cc.vec3(0, 0, 0))
end
self:setCameraMask(2)

搞过OpenGL一些API的都知道,有两种Camera,一种是跟现实生活中的摄像头一样的,远处的东西会小些,近处的会大点。另外一种是远处和近处都一样大。这里是2d游戏所以这里就只管使用第二种Camera了。
createOrthographic有4个参数,大致规定了Camera看的范围,3D空间那么大,全部观察会有很大消耗,也没必要,所以Camera有一个观察范围的概念。这4个参数分别表示宽度,高度,近处,远处。因为是2d游戏,所以近处和远处只要包含了0就OK了。如果你的游戏场景没有正常显示,注意下有没有包含0。
setCameraFlag 和 setCameraMask是一个对应的关系。决定了那些东西会被Camera看到。
enum class CameraFlag
{
DEFAULT = 1,
USER1 = 1 << 1,
USER2 = 1 << 2,
USER3 = 1 << 3,
USER4 = 1 << 4,
USER5 = 1 << 5,
USER6 = 1 << 6,
USER7 = 1 << 7,
USER8 = 1 << 8,
};
看源码我们知道USER1 = 2, USER2 = 4等等,只要把node的CameraMask设置跟CameraFlag值一样,这个node对Camera来说就是可见的。
你可以对一个layer的cameramask进行设置,这样layer中的所有node就递归都设置了。设置的时机也要非常注意,要在最后设置,这样前面添加的node才会起作用。
这里有一个要注意的:
因为使用了Camera,所以在游戏中新增一些东西的时候,不要忘记了给新增的东西设置cameramask,不然就看不见了!
3.不受Camera的限制的node
注意到右上角的暂停按钮了吗?它的位置是固定的,没有进行任何移动。是怎么做到的呢?非常简单,不设置cameramask就可以了。不是说不设置cameramask就看不到了吗?这里怎么又可以看到,而且位置不变?。这里就复杂了,跟Cocos2d-x整个游戏引擎的camera实现有关,太复杂了,我都还没搞懂。
4.背景的拼接
虽然这篇文章主要讲Camera,这里还是扯一下背景的处理。因为使用了Camera,所以背景可以不需要移动了。但是这样Camera往上移动,背景就被甩在后面了,就没背景了。所以背景要不断改变位置。
什么时候改变位置呢?当第一张背景的顶部位置在Camera位置之下的时候,就可以把这个背景图片移到所有背景图的最上面。

function GameBackgroundLayer:getFirstBgTop()
return (self.allBackGrounds[1]:getPositionY() + self.height * 0.5)
end
function GameBackgroundLayer:moveFirstBgToLast()
local firstBg = self.allBackGrounds[1]
table.remove(self.allBackGrounds, 1)
table.insert(self.allBackGrounds, firstBg)
firstBg:setPositionY(self.allBackGrounds[#(self.allBackGrounds) - 1]:getPositionY() + self.height)
end
function GameObjectsLayer:update(dt)
if(self._camera:getPositionY() >= g_GameMainLayer.backgroundLayer:getFirstBgTop())then
g_GameMainLayer.backgroundLayer:moveFirstBgToLast()
end
end

我这里虽然只有2张背景图片,但是还是使用了table来存储。这样方便扩展。3,4张背景图片也能很方便的使用。具体实现看这个Demo的源码。
5.看一下camera的具体使用
这个是新做的游戏,使用了Cocos2d-x 3.3中的camera,玩下就会更加清楚些。
6. Demo源码下载:CameraTest

cocos2d-x 3.3 Lua开发 摄像机使用相关推荐

  1. android ios能否用cocos2d js开发,cocos2d-x支持c++、js、lua开发

    作者:左文 链接:https://www.zhihu.com/question/21130385/answer/21789568 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  2. Cocos2dx Lua开发环境搭建

    本文记录在 Windows 下搭建 cocos2dx lua 开发环境,还有调试设置. 系统:Windows 7 64 IDE:Mircrosoft Visual Studio 2013 Cocos2 ...

  3. 一、ESP8266入门(基于LUA开发)

    序 一入坑便停不下来...  还挺有意思的哈,233,,,,  资料杂,自己一个一个去找确实浪费了不少时间,而且大多还都是英文的,需要硬着头皮看.  这次实践入门,更是对英语的重要确信无疑.Githu ...

  4. 2021-01-13 Linux下安装lua开发环境 Ubuntu

    Linux下安装lua开发环境 Ubuntu 1.下载lua包并解压 wget -c http://www.lua.org/ftp/lua-5.3.5.tar.gz tar zxvf lua-5.3. ...

  5. C#开发VS LUA开发

    C#开发VS LUA开发 一个游戏公司,决定开始用U3D做一款新游戏,这个游戏类型从来没做过. 如果没有一个成熟的游戏框架,那么从头撸起. 是一开始就将LUA热更新考虑进来呢 还是先做成纯C#的框架呢 ...

  6. 安装OpenResty(Nginx+Lua)开发环境

    首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用.借助于Nginx的事件驱动模型 ...

  7. linux下lua开发环境安装

    我前面我们介绍了nginx+lua环境的搭建,在此我们再来了解下lua开发环境的安装. 目前lua版本已经更新到lua5.3,但是我们在此安装lua5.1,因为5.1运行了好多年,有好多模块都是基于此 ...

  8. 如何配置一套优雅的Lua开发环境

    讨论话题 何为优雅的开发环境 如何部署(本文讨论在MacOSX平台,其他平台也一样适用) 优雅的Lua开发环境 优雅的Lua开发环境至少包含以下几点: 安装适合需求的最新稳定版Lua 安装合适的Lua ...

  9. 第二章 OpenResty(Nginx+Lua)开发入门

    Nginx入门 本文目的是学习Nginx+Lua开发,对于Nginx基本知识可以参考如下文章: nginx启动.关闭.重启 http://www.cnblogs.com/derekchen/archi ...

最新文章

  1. Moss/Sharepoint 一些很重要的API备忘
  2. 使用PHP Excel类读取和生成excel文件
  3. 欧盟正研究用三种标准技术应对DNS漏洞
  4. Caffe官方教程翻译(4):CIFAR-10 turorial
  5. PMCAFF | 十大最坑爹的产品设计缺陷你遇到过几个?
  6. Servlet课程0425(五) sendRedirect实现不同页面共享数据
  7. 网易云信+妙克:从零到标杆的在线音视频音乐教学之路
  8. ubuntu 如何登录远程服务器_VSCode远程登录云服务器、树莓派实现在线调试代码...
  9. JS数组的需要注意的问题
  10. applyTo、renderTo 区别
  11. con和com开头单词规律_英语单词速记小技巧
  12. Hero鹏——只为挖坑而生
  13. 计算机办公软件office的考试试题,中职计算机办公软件Word2010年最新考试试题.doc...
  14. error: (-215:Assertion failed) npoints = 0 (depth == CV_32F || depth == CV_32F || depth ==CV_32S
  15. 处理导入的原理图库中Designator字体不对的问题
  16. Elixir元编程基础知识
  17. labelme标注结果可视化(持续补充)
  18. 虚拟化平台PVE(ProxmoxVirtual Environment)安装部署
  19. pg主从复制(二)——备库激活过程分析
  20. 从motion到定格,BX-Planet团队不断尝试商业动画广告新形式

热门文章

  1. 什么是索引?什么条件适合建立索引?什么条件不适合建立索引?
  2. 圆弧插补程序c语言,用C语言写的简易的逐点比较法插补算法,包括直线逐点插补和圆弧插补...
  3. vue 使用vuex实现消息通知提示
  4. Kernel pwn 入门 (6)
  5. Linux ls -l诠释
  6. 计算机图形学 实验3 《图形变换》
  7. python监听键盘keyboard_python利用 keyboard 库记录键盘事件
  8. 一个技术总监的内心独白(3)
  9. Alicia Keys and NGB
  10. Ethercat学习-从站FOE固件更新(TwinCAT主站)