Cocos2d 3.3 lua Camera使用

1.为什么要使用Camera

游戏有点像电影,镜头的使用非常重要。忽远忽近,跟随主角,场景切换等等。一般来说2d游戏不太需要使用Camera,所以cocos2d 就没太重视Camera,直到了3.3这个版本才较容易使用Camera。之前一些效果都可以使用其他方式来模拟Camera,但是这样逻辑就不太直观,直接操作Camera是最完美的。

先来看我们这个Camera Demo的效果图:

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

游戏实现方式有2种:

1. 固定人物在那个位置,然后把背景往下移动,这样看起来"人物就在往上移动了"

2.人物往上移动,Camera的位置在人物的位置以下,距离人物一段距离,跟随着人物移动而移动,背景完全不动,但会拼接。

在Cocos2d 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整个游戏引擎的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 3.3中的camera,玩下就会更加清楚些。

IPhone下载:https://itunes.apple.com/cn/app/30-wait/id954181532?l=zh&mt=8 安卓下载:

http://toycloud.qiniudn.com/StickHero.apk

扫描二维码下载更加容易。

                  

6.上面讲到的Camera Demo源码下载

http://www.waitingfy.com/?attachment_id=1487

http://www.waitingfy.com/archives/1488

时间: 2024-10-02 22:12:24

Cocos2d 3.3 lua Camera使用的相关文章

使用cocos2d脚本生成lua绑定

这几天要老大要求把DragonBones移到cocos2dx 3.0 里边,并且绑定lua使用接口.因为刚学lua,使用的引擎也刚从2.2改为3.0,各种不熟悉,折腾了好几天才弄完,有空了总结一下 这篇先说一下cocos2d生成lua绑定的修改,有空的话再写一篇lua中注册回调到c++中方法 我的目录结构 假设我的目录名称是DragonBones -Cocosdx目录 -DragonBones  -c代码 -c代码头 -tools  db_DragonBones.ini genbindings.

【Cocos2D学习】Lua——数学知识的基本应用

学习Cocox,真的是相当麻烦,IDE的支持太差了,Cocox的各种版本也是多种多样,我先研究的是用Lua语言开发,但是学习起来还是蛮有趣的,我喜欢这种学习.下面基本的数学知识在Cocox的几种应用: 1.跳动的小球(向量的应用) local direction=cc.p(math.random(-1,1),math.random(-1,1)) cc.pNormalize(direction) local dot=display.newDrawNode():addTo(self):center(

采用cocos2d-x lua 的listview 实现pageview的翻页效果之上下翻页效果

--翻页滚动效果local function fnScrollViewScrolling( sender,eventType)    -- body    if eventType == 10 then        local bposX = sender:getPercentage()*100        _bPosX = bposX    end    if not _bPosX then        return    end    print("-------bposX="

我的游戏作品

1.<找到了> 第一个是IPhone 下载地址,第二个是android的. 点击跳转链接,或者扫描二维码.                          游戏部分逻辑实现见<cocos2d 游戏选关界面 附源代码> 2. <海战> 第一个是IPhone 下载地址.第二个是android的.点击跳转链接.或者扫描二维码.                  3.<30 等一等> 第一个是IPhone 下载地址,第二个是android的.点击跳转链接,或者扫描

cocos2d 高仿doodle jump 无源码

1. 游戏视频 主角眼熟吗?没错,上次跑酷游戏中的"30"来Jump了,有三种道具,主角光环,竹蜻蜓,翅膀: 有两种怪物,螃蟹和鸟: 有5种板子.点击屏幕,30会把它的嘴巴3给发射出去,可以攻击怪物.上次的跑酷参考<cocos2d 简单高仿天天跑酷游戏> ,苹果已经审核通过...但做的很差,后续有时间再更新.后面考虑会出更多的该主角游戏. 其实蛮讨厌"高仿"这两个字的,争取下一款游戏有更多原创部分. 2.向上跳的位移实现 正常情况下,不使用任何的东西,主

【转】cocos2d-x Lua

Call custom c++ from Lua cocos2d-x lua binds c++ class, class functions ,enum and some global functions to lua through auto-binding by bindings-generator(tools/bindings-generator) and some manual binding,so we can call custom c++ from lua convenientl

Cocos2d-x Lua 播放视频(iOS&amp;android)

最近刚转了游戏,来公司不久就接到一个任务就是做一个视频播放的功能,自己花了3天时间,暂时实现了一个简易的功能,特写篇博客,以作记录. 参考地址如下: http://blog.csdn.net/xiaominghimi/article/details/6870259 http://blog.csdn.net/kaitiren/article/details/11832851 http://blog.csdn.net/candyforever/article/details/8905852 实现功能

cocos2dx-3.x 导出自定义类到 lua 过程

一.简介 最近正在学习cocos2d中的lua游戏开发,因为lua开发的热更新特性,大家开发游戏好像都会优先选择lua作为开发语言. 但是遇到一个问题,用lua写一些简单的程序没什么问题,但是一旦需要一个复杂的类,在lua中直接写就感觉有些吃力.所以想到,可以把游戏开发中比较复杂的模块使用c++完成,然后导出到lua,让lua可以轻松调用. 我从头到尾完整地完成了cocos2dx-3.x中自定义类的导出过程,在网上查了好多资料,也碰到了很多错误,然而网上关于这块的文章比较零散,如果有初学者使用的

在cocos code ide的基础上构建自己的lua开发调试环境

现在无论是端游还是手游(基于cocos2d)的开发, 基本模式都是c++内核 + lua逻辑的路线.对于c++的开发和调试, vs已经能很好的满足开发者的需求, 微软这方面真是值得称颂.不幸的是, lua的开发和调试,还没有一个统一的,方便的开发调试环境,这也给广大的luaer和项目造成了极大的困扰.目前通常的做法大致有如下几种: 1.纯粹意义上的lua编辑器, 如Sublime Text 2 + 插件的模式,解决了代码提示和补齐问题. 2.编辑器的基础上加入调试功能, 通常是直接在vs上开发一