我正在寻找在COCOS2D(iOS)中创建类似的隧道效果。有人可以提出任何建议吗?
到现在为止,我已经尝试使用比例减小的多个环形精灵,并将中心定位到同一点,并且对于每个较小的精灵,Z也会保持递减。
这样,使用CCScaleTo对其进行动画处理,并随着动画持续时间将其大小更改为2.0,但是无论如何它都不会接近参考文献中所示的隧道效果。
谢谢,山姆
我正在寻找在COCOS2D(iOS)中创建类似的隧道效果。有人可以提出任何建议吗?
到现在为止,我已经尝试使用比例减小的多个环形精灵,并将中心定位到同一点,并且对于每个较小的精灵,Z也会保持递减。
这样,使用CCScaleTo对其进行动画处理,并随着动画持续时间将其大小更改为2.0,但是无论如何它都不会接近参考文献中所示的隧道效果。
谢谢,山姆
Answers:
我从作者那里发现了这种效果的实现描述:
在2D平面上创建深度错觉当然需要做很多工作。
不过,原理很简单:圆圈从屏幕的中间开始,缩放比例为0。然后,隧道的第一个圆圈开始按比例缩放,这与所经过的时间成比例(线性缩放不起作用),一段时间后,第二个圆圈开始缩放,然后是3号和4号,依此类推。
然后,按比例降低圆的Alpha值(最后面的圆的Alpha值比前面的圆的Alpha值低,以产生模糊效果),定义每个圆必须遵循的路径,移动X和Y坐标,然后将一艘太空船放在屏幕中间。倾斜设备可使隧道在左右移动,上下移动(但这给人的印象是飞船正在移动!)。
圆圈离开屏幕后,它们会迅速消失并放回初始位置(以节省内存,因此我不需要创建新的圆圈,但我可以重复使用相同的圆圈)。
对不起我的英语,但我希望能解释一下总体思路:)
您几乎拥有多个Z值和比例递减的环形精灵。只是不要将它们全部居中。
您需要跟踪希望隧道到达较远事件范围的点。您可以随时间推移随意移动该点。
然后,在放置每个新的精灵时,将其放置在该点上,将其缩小,按照自己的喜好设置其不透明度,然后CCSpawn
以CCScaleTo
和开头CCFadeTo
,例如:
sprite->runAction(CCSpawn::create(
CCScaleTo::create(2.0f, 1.5f),
CCFadeTo::create(5.0f, 255),
nullptr));
预先创建所有精灵,然后旋转后面的精灵以保持其效率。
我可能会尝试将其与背景层和粒子效果进行排序。您可以在粒子设计器中测试效果,然后在背景图像层中播放它们。
老实说,我不认为该图像是使用2D相机渲染的。看起来游戏是使用3D渲染系统渲染的。但是,由于要使用cocos2d,因此需要自己模拟3D转换矩阵。首先是一个想法:您知道在3D场景中,每个对象都由3个标量值x,y和z定义。您可以使用的最简单方法是按照您的建议进行缩放,但不能按照您的实现进行缩放!ccScaleTo
将导致线性缩放,这不会产生3D感觉。您可以从按缩放对象开始1/z
。这在某种程度上与您可以想到的最简单的投影矩阵相同!如果您甚至觉得不满意,请查看更现代,更复杂的投影矩阵。
旁注:在cocos2D中实现自定义投影矩阵会有点脏。如果您真的不喜欢这种效果,我强烈建议您将引擎更改为支持3D的引擎。
这是我的做法,用伪代码
激活隧道效应:
createCircle()
控制(带视差)
该位置是消失点,因此,如果不移动消失点就无法移动图层。但是,如果移动锚点,则该层似乎会移动,但是消失点保持不变-这会产生视差效果,因为在封闭层(大范围)上移动ccp(0.2,0.2)的效果比在远处移动相同的对象。
您将所有内容包装在相同大小的图层中,以确保重新定位锚的位置在所有图层中均产生相同的运动。