SceneKit_中级06_场景的切换

SceneKit_入门01_旋转人物
SceneKit_入门02_如何创建工程
SceneKit_入门03_节点
SceneKit_入门04_灯光
SceneKit_入门05_照相机
SceneKit_入门06_行为动画
SceneKit_入门07_几何体
SceneKit_入门08_材质
SceneKit_入门09_物理身体
SceneKit_入门10_物理世界
SceneKit_入门11_粒子系统
SceneKit_入门12_物理行为
SceneKit_入门13_骨骼动画
SceneKit_中级01_模型之间的过渡动画
SceneKit_中级02_SCNView 详细讲解
SceneKit_中级03_切换照相机视角
SceneKit_中级04_约束的使用
SceneKit_中级05_力的使用
SceneKit_中级06_场景的切换
SceneKit_中级07_动态修改属性
SceneKit_中级08_阴影详解
SceneKit_中级09_碰撞检测
SceneKit_中级10_滤镜效果制作
SceneKit_中级11_动画事件
SceneKit_高级01_GLSL
SceneKit_高级02_粒子系统深入研究
SceneKit_高级03_自定义力
SceneKit_高级04_自定义场景过渡效果
SceneKit_高级05 检测手势点击到节点
SceneKit_高级06_加载顶点、纹理、法线坐标
SceneKit_高级07_SCNProgram用法探究
SceneKit_高级08_天空盒子制作
SceneKit_高级09_雾效果
SceneKit_大神01_掉落的文字
SceneKit_大神02_弹幕来袭
SceneKit_大神03_navigationbar上的3D文字

让学习成为一种习惯

学习目标

掌握SceneKit 游戏框架中的几种场景以及如何使用它们。

开始吧

场景切换,你应该想到的更换Scene,最简单的方式就是下面这种写法

 self.scnView.scene = scene;

运行一下结果,和我们的预期一模一样。你学会了吧,很简单吧!不过就是有点挫而已,那我们怎么让它变的不这么low,就是给它添加过渡动画,目标明确那就去找方法。SCNScene 是SCNView的属性,那就去它里面找方法

- (void)presentScene:(SCNScene *)scene withTransition:(SKTransition *)transition incomingPointOfView:(nullable SCNNode *)pointOfView completionHandler:(nullable void (^)())completionHandler NS_AVAILABLE(10_11, 9_0);

参数说明:

scene 你要切换到的场景
transition 过渡动画类型
pointOfView 切换到的场景中的照相机节点
completionHandle 完成后的block块

有一个参数我要说一下,transition 过渡动画类型 你会发现他是SKTransition 这个是什么类型呢? 悄悄的告诉你,苹果还有一个2D 游戏框架(SpriteKit) 这个类就是它里面的,上有人在写SpriteKit框架的教程,有兴趣的可以去搜。

我们去看看它都过渡动画

+ (SKTransition *)crossFadeWithDuration:(NSTimeInterval)sec;
+ (SKTransition *)fadeWithDuration:(NSTimeInterval)sec;
+ (SKTransition *)fadeWithColor:(SKColor *)color duration:(NSTimeInterval)sec;
+ (SKTransition *)flipHorizontalWithDuration:(NSTimeInterval)sec;
+ (SKTransition *)flipVerticalWithDuration:(NSTimeInterval)sec;
+ (SKTransition *)revealWithDirection:(SKTransitionDirection)direction duration:(NSTimeInterval)sec;
+ (SKTransition *)moveInWithDirection:(SKTransitionDirection)direction duration:(NSTimeInterval)sec;
+ (SKTransition *)pushWithDirection:(SKTransitionDirection)direction duration:(NSTimeInterval)sec;
+ (SKTransition *)doorsOpenHorizontalWithDuration:(NSTimeInterval)sec;
+ (SKTransition *)doorsOpenVerticalWithDuration:(NSTimeInterval)sec;
+ (SKTransition *)doorsCloseHorizontalWithDuration:(NSTimeInterval)sec;
+ (SKTransition *)doorsCloseVerticalWithDuration:(NSTimeInterval)sec;
+ (SKTransition *)doorwayWithDuration:(NSTimeInterval)sec;

动画效果还挺多的,就不一一演示了,我在使用这个方法的时候,遇到了一个大坑。看到这个文章的你们可以放心了,我已经把坑填了。

话不多说看代码!

1.创建工程(略)
2.添加框架(略)
3.添加模型文件(略)
4.添加照相机(略)
...

这些代码完全可以省略了,因为你已经记到心里了,接下来,我们只写转换场景的代码

 - (void)presentScene1{
// 创建目标转换场景
SCNScene *scene = [SCNScene scene];
[scene.rootNode addChildNode:[[SCNScene sceneNamed:@"palm_tree.dae"].rootNode childNodeWithName:@"PalmTree" recursively:true]];

// 添加一个照相机
SCNNode *cameraNode1 = [SCNNode node];
cameraNode1.camera = [SCNCamera camera];
cameraNode1.position = SCNVector3Make(0, -100, -1000);
cameraNode1.rotation = SCNVector4Make(1, 0, 0, M_PI);
cameraNode1.camera.automaticallyAdjustsZRange = true;
[scene.rootNode addChildNode:cameraNode1];

// 创建转换场景
SKTransition *transition = [SKTransition doorwayWithDuration:1];
[self.scnView presentScene:scene withTransition: transition incomingPointOfView:cameraNode1 completionHandler:^{
   
}];

运行:

SceneKit_中级06_场景的切换_第1张图片
呵呵,报错了

从报错找不到有用的信息怎么办了,上官网找资料

When the transition occurs, the scene property is immediately updated to point to the new scene. Then, the animation occurs. Finally, the strong reference to the old scene is removed. If you need to keep the scene around after the transition occurs, your app needs to keep its own strong reference to the old scene

就是说,你要使用这个动画,需要把当前场景进行强引用,不然就不行。

那我们引用一下就是了

 self.lastScene = self.scnView.scene;

然后运行

SceneKit_中级06_场景的切换_第2张图片
很好玩,有没有!

提示:

还有一种自定义场景切换效果,我们高级篇讲。

总结

场景过渡方法很简单,相信你已经掌握了,如果任何疑问请留言!


代码库,听说经常给人点赞都当老板了!

你可能感兴趣的:(SceneKit_中级06_场景的切换)