SceneKit一个3D场景角色的代码重构
SuperSpaceMan3D是一个以SceneKit为基础的小游戏项目,作者展示了用SceneKit开发3D游戏的强大威力.不过在实际运行时会发现有一些小bug,这里我们依次尝试将其修复
首先,当spaceman接触到敌人的时候,游戏结束,弹出GameOver视图,然后当玩家再触摸屏幕时,开始新的游戏.在实际游戏中发现,spaceman接触敌人后GameOver视图很快闪过,游戏随即重新开始,不能达到等待用户触摸再开始的目的.
分析发现didBeginContact代码逻辑缺少区分条件,在GameViewController类中添加类级属性:
static var isGameOverViewShowing = false之所以添加static属性是因为需要在GameView中修改该属性,当然这是一种比较差的重构,应该make一个实例变量.
在spaceman接触敌人的代码逻辑中添加如下代码:
GameViewController.isGameOverViewShowing = true
gameStarted = false在didSimulatePhysicsAtTime方法的第一个判断条件中加上isGameOverShowing这个条件:
if sceneView.touchCount > 0 && !gameStarted && !GameViewController.isGameOverViewShowing{
}进入GameView.swift中,在touchesBegan方法中添加以下一行:
if GameViewController.isGameOverViewShowing{
            GameViewController.isGameOverViewShowing = false
        }这里是关键的一句,重新触发了游戏!
运行游戏,此时发现虽然大多数情况下逻辑正常,但是当多次连续点击屏幕时会发生spaceman重置位置不正确的情况.
进入setupSpaceMan方法,发现spaceManNode的物理对象类型是动态类型,但此游戏中spaceman位置全部都是通过代码手工调整,这里应该将其设置为Static类型,于是修改代码如下:
spaceManNode!.physicsBody = SCNPhysicsBody(type: .Static, shape: nil)同时修改resetSpaceman方法为如下内容:
func resetSpaceman(){
        spaceMan.removeAllActions()
        spaceMan.position = SCNVector3(x: 0, y: 0, z: 200)
        spaceMan.rotation = SCNVector4(x: 0, y: 1, z: 0, w: Float(M_PI))
    }再次运行游戏,这次基本达到了预期的效果(图片过大需要加载时间):
SceneKit一个3D场景角色的代码重构的更多相关文章
- 第一章 用three.js创建你的第一个3D场景
		第一章 用three.js创建你的第一个3D场景 到官网下载three.js的源码和示例. 创建HTML框架界面 第一个示例的代码如下: 01-basic-skeleton.html 位于 Learn ... 
- Three-js 创建第一个3D场景
		1.一个场景至少需要的三种类型组件 相机/决定哪些东西将在屏幕上渲染 光源/他们会对材质如何显示,以及生成阴影时材质如何使用产生影响 物体/他们是在相机透视图里主要的渲染队形:方块.球体等 ... 
- iOS 10 SceneKit 新特性 – SceneKit 制作 3D 场景框架
		来源:scauos(@大朕东) 链接:http://www.jianshu.com/p/b30785bb6c97 开头语: 今天的主题是探索iOS10 SceneKit的新功能,你可以观看今年WWDC ... 
- 基于 HTML5 WebGL 构建智能城市 3D 场景
		前言 随着城市规模的扩大,传统的方式很难彻底地展示城市的全貌,但随着 3D 技术的应用,出现了 3D 城市群的方式以动态,交互式地把城市全貌呈现出来.配合智能城市系统,通过 Web 可视化的方式,使得 ... 
- WPF疑难杂症之一(3D场景)
		原文:WPF疑难杂症之一(3D场景) 最近2个月一直在学习WPF,在实际的开发中遇到下面一个3D场景有关的问题,我先给出问题代码:首先是在资源中定义了一个3D变换组:<Window x:Clas ... 
- css3创建3D场景
		浏览器本身是一个2维平面,对于3D的情况,实际上是增加了一个维度(深度),所以我们需要创建一个3D场景.这时浏览器不仅仅是一个平面了,更像是一个窗口,我们透过这个窗口去观察里面的三维世界.所谓的创建3 ... 
- RecastNavigation(3D场景建模、网格导航)
		一.RecastNavigation详解 RecastNavigation定义: RecastNavigation是一个导航寻路工具集,使用邻接的凸多边形集合描述一个3D场景,A*寻路算法使3D场景的 ... 
- Python>>>创建一个简单的3D场景
		首先安装PyOpengl pip install PyOpenGL PyOpenGL_accelerate 
- three.js-走进3d的奇妙世界一创建一个三维场景
		一.git代码仓库地址 git clone https://github.com/josdirksen/learning-threejs-third 下载并解压 二.创建一个三维场景 如下图所示 ... 
随机推荐
- 0312-css样式(选择器、文本text、字体fonts、背景background)
			问题: 1.css中table{border:1px:}是定义table的样式,只有表格的外边框,不能实现<table border="1"></table> ... 
- java利用poi来读取execl表格返回对象
			利用poi来读取execl表格,返回一个对象(可能有点不完善,但是应该能满足平常的所用),用到了反射等等; 使用的jar包有: commons-collections4-4.1.jar poi-3.1 ... 
- [HNOI 2016]最小公倍数
			Description 题库链接 给定一张 \(N\) 个顶点 \(M\) 条边的无向图(顶点编号为 \(1,2,\cdots,n\) ),每条边上带有权值.所有权值都可以分解成 \(2^a\time ... 
- ●BZOJ 1076 [SCOI2008]奖励关
			题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1076题解: 期望dp. (模糊的题意,2333) 题中的:"现在决定不吃的宝物以后 ... 
- hihocoder——1041国庆出游(搜索)
			描述 小Hi和小Ho准备国庆期间去A国旅游.A国的城际交通比较有特色:它共有n座城市(编号1-n):城市之间恰好有n-1条公路相连,形成一个树形公路网.小Hi计划从A国首都(1号城市)出发,自驾遍历所 ... 
- hdu 5583 Kingdom of Black and White
			Kingdom of Black and White Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ... 
- Django+nginx+uwsgi部署教程(centos7+ubuntu16.4)
			在线教育平台项目演示地址 项目部署教程 1.1.工作原理介绍 django 一个基于python的开源web框架 uwsgi 一是一个web服务器,也可以当做中间件 nginx 常用高性能代理服务器 ... 
- vim配置文件和插件管理
			本文通过总结零碎的资料总结而成,更多是去引导学习vim配置文件及插件使用. .vimrc配置文件,内容如下(备注清晰) "引入插件pathogen使用 execute pathogen#in ... 
- ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档]
			ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档] 简介 简单地说就是该有的都有了,但是总体跑起来效果还不好. 还在开发中,它工作的效果还不好.但是你可以直 ... 
- JFinal 极速开发框架的优点和不足的地方
			http://www.360doc.com/content/16/1226/10/31460730_617731802.shtml http://www.sohu.com/a/122571150_46 ... 
