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))
    }

再次运行游戏,这次基本达到了预期的效果(图片过大需要加载时间):

时间: 2024-08-27 19:52:41

SceneKit一个3D场景角色的代码重构的相关文章

Three-js 创建第一个3D场景

1.一个场景至少需要的三种类型组件 相机/决定哪些东西将在屏幕上渲染    光源/他们会对材质如何显示,以及生成阴影时材质如何使用产生影响    物体/他们是在相机透视图里主要的渲染队形:方块.球体等 2.浏览器兼容 Moziller Firefox:4.0版本以后开始支持:    Google Chrome:第9版以后开始支持    Safari:5.1版本开始支持:    Opera:12.00版本以后开始支持.要让Opera支持WebGL,你还需要打开opera:config文件,设置We

WPF疑难杂症之一(3D场景)

原文:WPF疑难杂症之一(3D场景) 最近2个月一直在学习WPF,在实际的开发中遇到下面一个3D场景有关的问题,我先给出问题代码:首先是在资源中定义了一个3D变换组:<Window x:Class="Viewer3D.MainWindow"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.

three.js入门——画一个3D正方体

three.js 是一款WebGL框架,WebGL可以让我们在canvas上实现3D效果.实现3D效果在国内来说还算是比较新的东西,可供查阅的资料也不多.这篇文章仅是一个入门篇,介绍如何绘制一个3D正方体. 介绍完毕,首先奉上实现的效果图: 这就是实现的效果图,还是挺有立体感的吧? 绘制前的准备 写代码前,要先下载最新的three.js框架包,引入自己的页面. 具体实现过程 准备一个canvas画布 这个画布是我们展现整个3D正方形的画布,也就是上图那个黑色的方框. <!DOCTYPE html

css3创建3D场景

浏览器本身是一个2维平面,对于3D的情况,实际上是增加了一个维度(深度),所以我们需要创建一个3D场景.这时浏览器不仅仅是一个平面了,更像是一个窗口,我们透过这个窗口去观察里面的三维世界.所谓的创建3D场景,就是告诉浏览器,我们是在这个窗口的哪个角度对这个3维世界进行观察,窗口里的3维物体距离这个窗口到底有多远. 设置好3D场景后,浏览器中的物体虽然已经变成是3维的了,但是如果我们不进行任何设置,他们看起来还是和二维的效果是一样的.所以我们需要使用一个新的属性 transform 来对这些元素进

CSS代码重构

CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS代码重构主要有两个目的:1.提高代码性能2.提高代码的可维护性 提高代码性能 提高CSS代码性能主要有两个点:1.提高页面的加载性能提高页面的加载性能,简单说就是减小CSS文件的大小,提高页面的加载速度,尽可以的利用http缓存2.提高CSS代码性能不同的CSS代码,浏览器对其解析的速度也是不一样的,如何提高浏览器解析CSS代码的速度也是我们要考虑的 提高代码的可维护性 提高CS

CSS代码重构与优化之路

写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多,如果没有及时对CSS代码进行维护,CSS代码不断会越来越多.CSS代码交错复杂,像一张庞大的蜘蛛网分布在网站的各个位置,你不知道修改这行代码会有什么影响,所以如果有修改或增加新功能时,开发人员往往不敢去删除旧的冗余的代码,而保险地增加新代码,最终的坏处就是项目中的CSS会越来越多,最终陷入无底洞. CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS

代码重构(二):类重构规则(Swift版)

在上篇博客<代码重构(一):函数重构规则(Swift版)>中,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp, Replace Temp with Query, Introduce Explaining Variable, Split Temporary Variable, Remove Assignments to Parameters, Replace Method with Method Object等.关于

Item 44:将参数无关代码重构到模板外去

Item 44: Factor parameter-independent code out of templates. 模板是个好东西,你可以在实现类型安全的同时少写很多代码.但模板提供的是编译期的多态, 即使你的代码看起来非常简洁短小,生成的二进制文件也可能包含大量的冗余代码. 因为模板每次实例化都会生成一个完整的副本,所以其中与模板参数无关的部分会造成代码膨胀(code bloat). 把模板中参数无关的代码重构到模板外便可以有效地控制模板产生的代码膨胀. 另外代码膨胀也可以由类型模板参数

【淡墨Unity3D Shader计划】一间 创建一个游戏场景 &amp;amp; 第一Shader写作

本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇.本文的第一部分为系列文章的前言,然后第二部分介绍了这个系列文章中我们会使用的游戏场景创建方式.最后一部分解说了怎样在U