手把手教你用Xcode制作CrossRoad类游戏01

目录 (不定期更新中 :] )

1 准备工作、创建项目、Splash Scene
2 过场动画 Transition
3 搭建游戏场景 Game Scene
4 用场景编辑器添加动作
5 用代码添加动作

说明

从小就喜欢玩游戏, 所以写一个自己的游戏也算是自己的一个梦想. 后来发现了raywenderlich.com上的这篇教程3D Apple Games by Tutorials, 感觉写的很好也很详细. 之所以写这篇文章, 一方面算是给自己做一个学习笔记. 另外一方面好像没发现这篇教程的中文版, 希望能帮到看英文原版有压力的朋友.
这篇文章是从原教程第19章Transition开始写的. 因为原教程真的十分的长(pdf466页). 不过仍然讲的十分的详细. 就算完全是新手应该也是可以跟着做下去的.
教程里用到的素材都是来自raywenderlich.com, 如果你想看完整的英文原版教程, 去支持正版.

创建项目

打开Xcode, Shift+Command+N创建新项目, 选中 iOS > Application > Single View Application, 点击next, 名字Mr.Pig, 语言Swift, 创建完成后选中项目文件, 将General > Deployment Info > Device Orientation改为只有Portrait.

添加素材到项目

下载素材并拖动到项目里.
确保你的target跟Copy if needs被选中.

创建SceneKit View

在左侧导航栏选中ViewController.swift(如果没有导航栏按command + 0). 将里面的内容替换为下面

//  因为SceneKit需要依赖SpriteKit来实现专场特效, 所以这里需要把SpriteKit也引进来
import UIKit
import SceneKit
import SpriteKit

class ViewController: UIViewController {
    // 这里获取GameHelper的单例game, 包含了各种有用的功能
    let game = GameHelper.sharedInstance
    override func viewDidLoad() {
        super.viewDidLoad()
        setupScenes()
        setupNodes()
        setupActions()
        setupTraffic()
        setupGestures()
        setupSounds()
        // 将游戏的状态设置为tapToPlay
        game.state = .tapToPlay
    }
    func setupScenes() {
    }
    func setupNodes() {
    }
    func setupActions() {
    }
    func setupTraffic() {
    }
    func setupGestures() {
    }
    func setupSounds() {
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    override var prefersStatusBarHidden : Bool { return true }
    override var shouldAutorotate : Bool { return false }
}

因为创建项目时选的是SingleViewApplication模板而不是Game模板, 所以现在需要填坑了.

在ViewController顶部添加属性

var scnView: SCNView!

这会持有SCNView的实例方便后面用到
添加代码到setupScenes():

scnView = SCNView(frame: self.view.bounds)
self.view.addSubview(scnView)

这会创建一个与当前view一样尺寸的SCNView实例并添加为当前view的子视图.

创建Game Scene

游戏的所有活动都在game scene里, 接下来你会在game scene里搭建一个完成的关卡.

在右下角FileTemplateLibrary找到SceneKit Scene File, 将其命名为GameScene, group选Mr.Pig.scnassets. 点Create.
FileTemplateLibrary

选中刚刚创建的GameScene.scn, 如果没有Scene graph, 点击图上左下角红圈那里, Scene graph可以让你清楚的看到这个scene上都有什么东西. 在右侧点击Node Inspector, 在下面的Object Library里面找到Floor, 将其拖动到scene上, 名字改为Grass, Position和Euler都改为0.

右上角选中Attributes Inspector, 将Floor Reflectivity设置为0 - 你肯定不想让草(grass)反光, 因为草不是玻璃(glass) -_-!

接下来右上角选中第5个Materials Inspector > Properties > Diffuse 点击右侧蓝色箭头, 选中Grass_Diffuse.png, 然后在下面的Scale处将两个值都设置为12.5.
这下你有草地了 :]

创建Splash Scene

splash scene是游戏正式开始前的场景, 我们的主角Mr. Pig会一直用激情的舞蹈放飞自己, 直到玩家点击开始游戏.

跟刚才一样, 在右下角File Template Library拖动SceneKit Scene File到左侧Navigator, 命名为SplashScene, group选Mr.Pig.scnassets, 点击create.

选中刚创建的SplashScene.scn, 右下角第4个Media Library找到MrPig, 拖动到scene.

选中MrPig, 在Node Inspector下将Position跟Euler值都设置为0. (如果设置过位置后找不到你的🐷了, 可以在scene graph里找到MrPig并双击, 或者如果你用的是触控板, 在scene里双指捏合来缩放镜头找到你的猪在哪)
create Pig reference

接下来, 你想给splash scene添加一个漂亮的渐变光.

选中MrPig, 点击右上最后一个Scene Inspector, 点击background右边蓝色箭头, 选中Gradient_Diffuse.png. 这下整个背景变成渐变的黄色了. 是的, Mr Pig喜欢亮色. -_-! (没get到这个梗在哪)

接下来在Mr Pig背后添加一些光线.
在右下Object Library处找到Plane, 拖动到scene.
点击Node Inspector, 将这个Node命名为Rays. 设置Position为 (x:0, y:0.25, z:-1), Euler为0, Visibility > Opacity为0.25.
点击Attributes Inspector, 设置Size为 (x:5, y:5), Corner Radius 2.5, 这样就是一个半径为2.5的圆.

点击Materials Inspector, 设置Property > Diffuse 为 Rays_Diffuse.png, Lighting Mode 为 Constant. 继续向下滚动到Settings部分, 设置blend mode 为 subtract, 这样就会用减法来混合漫反射贴图使场景变暗(原文这样的:darken the scene by using the blend diffuse map by means of subtraction, 有问题的话欢迎大佬指正谢谢).
光线

设置镜头和光照

什么让我们的眼睛区分维度?当然是光照啦!(really? :] ) 然后如果你添加光照了你还得添加镜头. Lights, cameras, action!

默认情况下, splash scene已经包含了一个镜头了, 只需要一些小修改.
首先, 在scene graph区, 确保你没选中任何node, 然后点左下角 + 来添加一个empty node. 将其命名为Camera, 并将原本的camera作为子node拖动到新Camera的下面.
选中外部的Camera, 在Node Inspector下设置position 为 (x:0, y:0.3, z:0) , Euler为(x:-10, y:0, z:0). 这会让镜头朝下对准我们的猪, 就像猪拿着自拍杆一样.
选中内部的camera, 你需要把自拍杆稍微拉长一点, 但不要太长, 来刚好拍到Mr.Pig的全身. 设置 Position为(x:0, y:0, z:3) Euler 为 (x:0, y:0, z:0).

设置完成后, 点击左下角Point of View, 下拉菜单中选中camera, 如果你设置正确的话应该看起来是这样的:
镜头

现在添加另外一个empty node到scene graph, 命名为Lights, 然后从Object Library拖动一个Omni light和一个Ambient light到Lighs下. 然后选中omni, 将其position设置为(x:-5, y:5, z:0). 猪哥亮了.

接下来添加像下图这样的Tap to play 和 Logo.
Logo & Tap to play

从Object Library拖动两个Plane到Scene graph, 命名为Logo跟TapToPlay, 注意层级是跟Lights同等级的, 不要拖动到Lights里面了.

选中Logo, Node Inspector -> Position(x:0, y:1, z:0.5); Attributes Inspector -> Size(x:1, y:0.5); Material Inspector -> Lighting Mode: Constant, Diffuse: MrPigLogo_Diffuse.png.

选中TapToPlay, Node Inspector -> Position(x:0, y:-0.3, z:0.5); Attributes Inspector -> Size(x:1, y:0.25); Material Inspector -> Lighting Mode: Constant, Diffuse: TapToPlay_Diffuse.png.

加载并呈现Splash Scene

我们终于设置完了Splash Scene, 接下来就得加载并将其呈现给玩家.

首先你需要对象来持有你的scene, 所以添加下面属性到View Controller:

var gameScene: SCNScene!
var splashScene: SCNScene!

然后添加下面代码到setupScenes():

// 1 加载对应的scn文件
gameScene = SCNScene(named: "/MrPig.scnassets/GameScene.scn")
splashScene = SCNScene(named: "/MrPig.scnassets/SplashScene.scn")
// 2 将splash scene设置为初始scene, 这样游戏开始时你首先看到的是splash scene
scnView.scene = splashScene

command + R来验证一下你之前的成果. 如果一切顺利, 你的成果应该是下面这样的!
Splash Scene

So far so good :] 那么如何开始游戏呢? 我们下节见.

如果有没写清楚或者有疑问的地方, 欢迎留言.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容