手把手教你用Xcode制作CrossRoad類游戲01

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

1 準(zhǔn)備工作栽渴、創(chuàng)建項(xiàng)目卫病、Splash Scene
2 過(guò)場(chǎng)動(dòng)畫 Transition
3 搭建游戲場(chǎng)景 Game Scene
4 用場(chǎng)景編輯器添加動(dòng)作
5 用代碼添加動(dòng)作

說(shuō)明

從小就喜歡玩游戲, 所以寫一個(gè)自己的游戲也算是自己的一個(gè)夢(mèng)想. 后來(lái)發(fā)現(xiàn)了raywenderlich.com上的這篇教程3D Apple Games by Tutorials, 感覺(jué)寫的很好也很詳細(xì). 之所以寫這篇文章, 一方面算是給自己做一個(gè)學(xué)習(xí)筆記. 另外一方面好像沒(méi)發(fā)現(xiàn)這篇教程的中文版, 希望能幫到看英文原版有壓力的朋友.
這篇文章是從原教程第19章Transition開(kāi)始寫的. 因?yàn)樵坛陶娴氖值拈L(zhǎng)(pdf466頁(yè)). 不過(guò)仍然講的十分的詳細(xì). 就算完全是新手應(yīng)該也是可以跟著做下去的.
教程里用到的素材都是來(lái)自raywenderlich.com, 如果你想看完整的英文原版教程, 去支持正版.

創(chuàng)建項(xiàng)目

打開(kāi)Xcode, Shift+Command+N創(chuàng)建新項(xiàng)目, 選中 iOS > Application > Single View Application, 點(diǎn)擊next, 名字Mr.Pig, 語(yǔ)言Swift, 創(chuàng)建完成后選中項(xiàng)目文件, 將General > Deployment Info > Device Orientation改為只有Portrait.

添加素材到項(xiàng)目

下載素材并拖動(dòng)到項(xiàng)目里.
確保你的target跟Copy if needs被選中.

創(chuàng)建SceneKit View

在左側(cè)導(dǎo)航欄選中ViewController.swift(如果沒(méi)有導(dǎo)航欄按command + 0). 將里面的內(nèi)容替換為下面

//  因?yàn)镾ceneKit需要依賴SpriteKit來(lái)實(shí)現(xiàn)專場(chǎng)特效, 所以這里需要把SpriteKit也引進(jìn)來(lái)
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()
        // 將游戲的狀態(tài)設(shè)置為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 }
}

因?yàn)閯?chuàng)建項(xiàng)目時(shí)選的是SingleViewApplication模板而不是Game模板, 所以現(xiàn)在需要填坑了.

在ViewController頂部添加屬性

var scnView: SCNView!

這會(huì)持有SCNView的實(shí)例方便后面用到
添加代碼到setupScenes():

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

這會(huì)創(chuàng)建一個(gè)與當(dāng)前view一樣尺寸的SCNView實(shí)例并添加為當(dāng)前view的子視圖.

創(chuàng)建Game Scene

游戲的所有活動(dòng)都在game scene里, 接下來(lái)你會(huì)在game scene里搭建一個(gè)完成的關(guān)卡.

在右下角FileTemplateLibrary找到SceneKit Scene File, 將其命名為GameScene, group選Mr.Pig.scnassets. 點(diǎn)Create.
FileTemplateLibrary

選中剛剛創(chuàng)建的GameScene.scn, 如果沒(méi)有Scene graph, 點(diǎn)擊圖上左下角紅圈那里, Scene graph可以讓你清楚的看到這個(gè)scene上都有什么東西. 在右側(cè)點(diǎn)擊Node Inspector, 在下面的Object Library里面找到Floor, 將其拖動(dòng)到scene上, 名字改為Grass, Position和Euler都改為0.

右上角選中Attributes Inspector, 將Floor Reflectivity設(shè)置為0 - 你肯定不想讓草(grass)反光, 因?yàn)椴莶皇遣A?glass) -_-!

接下來(lái)右上角選中第5個(gè)Materials Inspector > Properties > Diffuse 點(diǎn)擊右側(cè)藍(lán)色箭頭, 選中Grass_Diffuse.png, 然后在下面的Scale處將兩個(gè)值都設(shè)置為12.5.
這下你有草地了 :]

創(chuàng)建Splash Scene

splash scene是游戲正式開(kāi)始前的場(chǎng)景, 我們的主角Mr. Pig會(huì)一直用激情的舞蹈放飛自己, 直到玩家點(diǎn)擊開(kāi)始游戲.

跟剛才一樣, 在右下角File Template Library拖動(dòng)SceneKit Scene File到左側(cè)Navigator, 命名為SplashScene, group選Mr.Pig.scnassets, 點(diǎn)擊create.

選中剛創(chuàng)建的SplashScene.scn, 右下角第4個(gè)Media Library找到MrPig, 拖動(dòng)到scene.

選中MrPig, 在Node Inspector下將Position跟Euler值都設(shè)置為0. (如果設(shè)置過(guò)位置后找不到你的??了, 可以在scene graph里找到MrPig并雙擊, 或者如果你用的是觸控板, 在scene里雙指捏合來(lái)縮放鏡頭找到你的豬在哪)
create Pig reference

接下來(lái), 你想給splash scene添加一個(gè)漂亮的漸變光.

選中MrPig, 點(diǎn)擊右上最后一個(gè)Scene Inspector, 點(diǎn)擊background右邊藍(lán)色箭頭, 選中Gradient_Diffuse.png. 這下整個(gè)背景變成漸變的黃色了. 是的, Mr Pig喜歡亮色. -_-! (沒(méi)get到這個(gè)梗在哪)

接下來(lái)在Mr Pig背后添加一些光線.
在右下Object Library處找到Plane, 拖動(dòng)到scene.
點(diǎn)擊Node Inspector, 將這個(gè)Node命名為Rays. 設(shè)置Position為 (x:0, y:0.25, z:-1), Euler為0, Visibility > Opacity為0.25.
點(diǎn)擊Attributes Inspector, 設(shè)置Size為 (x:5, y:5), Corner Radius 2.5, 這樣就是一個(gè)半徑為2.5的圓.

點(diǎn)擊Materials Inspector, 設(shè)置Property > Diffuse 為 Rays_Diffuse.png, Lighting Mode 為 Constant. 繼續(xù)向下滾動(dòng)到Settings部分, 設(shè)置blend mode 為 subtract, 這樣就會(huì)用減法來(lái)混合漫反射貼圖使場(chǎng)景變暗(原文這樣的:darken the scene by using the blend diffuse map by means of subtraction, 有問(wèn)題的話歡迎大佬指正謝謝).
光線

設(shè)置鏡頭和光照

什么讓我們的眼睛區(qū)分維度?當(dāng)然是光照啦!(really? :] ) 然后如果你添加光照了你還得添加鏡頭. Lights, cameras, action!

默認(rèn)情況下, splash scene已經(jīng)包含了一個(gè)鏡頭了, 只需要一些小修改.
首先, 在scene graph區(qū), 確保你沒(méi)選中任何node, 然后點(diǎn)左下角 + 來(lái)添加一個(gè)empty node. 將其命名為Camera, 并將原本的camera作為子node拖動(dòng)到新Camera的下面.
選中外部的Camera, 在Node Inspector下設(shè)置position 為 (x:0, y:0.3, z:0) , Euler為(x:-10, y:0, z:0). 這會(huì)讓鏡頭朝下對(duì)準(zhǔn)我們的豬, 就像豬拿著自拍桿一樣.
選中內(nèi)部的camera, 你需要把自拍桿稍微拉長(zhǎng)一點(diǎn), 但不要太長(zhǎng), 來(lái)剛好拍到Mr.Pig的全身. 設(shè)置 Position為(x:0, y:0, z:3) Euler 為 (x:0, y:0, z:0).

設(shè)置完成后, 點(diǎn)擊左下角Point of View, 下拉菜單中選中camera, 如果你設(shè)置正確的話應(yīng)該看起來(lái)是這樣的:
鏡頭

現(xiàn)在添加另外一個(gè)empty node到scene graph, 命名為L(zhǎng)ights, 然后從Object Library拖動(dòng)一個(gè)Omni light和一個(gè)Ambient light到Lighs下. 然后選中omni, 將其position設(shè)置為(x:-5, y:5, z:0). 豬哥亮了.

接下來(lái)添加像下圖這樣的Tap to play 和 Logo.
Logo & Tap to play

從Object Library拖動(dòng)兩個(gè)Plane到Scene graph, 命名為L(zhǎng)ogo跟TapToPlay, 注意層級(jí)是跟Lights同等級(jí)的, 不要拖動(dòng)到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.

加載并呈現(xiàn)Splash Scene

我們終于設(shè)置完了Splash Scene, 接下來(lái)就得加載并將其呈現(xiàn)給玩家.

首先你需要對(duì)象來(lái)持有你的scene, 所以添加下面屬性到View Controller:

var gameScene: SCNScene!
var splashScene: SCNScene!

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

// 1 加載對(duì)應(yīng)的scn文件
gameScene = SCNScene(named: "/MrPig.scnassets/GameScene.scn")
splashScene = SCNScene(named: "/MrPig.scnassets/SplashScene.scn")
// 2 將splash scene設(shè)置為初始scene, 這樣游戲開(kāi)始時(shí)你首先看到的是splash scene
scnView.scene = splashScene

command + R來(lái)驗(yàn)證一下你之前的成果. 如果一切順利, 你的成果應(yīng)該是下面這樣的!
Splash Scene

So far so good :] 那么如何開(kāi)始游戲呢? 我們下節(jié)見(jiàn).

如果有沒(méi)寫清楚或者有疑問(wèn)的地方, 歡迎留言.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胞四,一起剝皮案震驚了整個(gè)濱河市蒿赢,隨后出現(xiàn)的幾起案子圾结,更是在濱河造成了極大的恐慌脉幢,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臣淤,死亡現(xiàn)場(chǎng)離奇詭異达吞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)荒典,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門酪劫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人寺董,你說(shuō)我怎么就攤上這事覆糟。” “怎么了遮咖?”我有些...
    開(kāi)封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵滩字,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)麦箍,這世上最難降的妖魔是什么漓藕? 我笑而不...
    開(kāi)封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮挟裂,結(jié)果婚禮上享钞,老公的妹妹穿的比我還像新娘。我一直安慰自己诀蓉,他們只是感情好栗竖,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著渠啤,像睡著了一般狐肢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沥曹,一...
    開(kāi)封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天份名,我揣著相機(jī)與錄音,去河邊找鬼妓美。 笑死同窘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的部脚。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼裤纹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼委刘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鹰椒,我...
    開(kāi)封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锡移,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后漆际,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體淆珊,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年奸汇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了施符。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡擂找,死狀恐怖戳吝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贯涎,我是刑警寧澤听哭,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響陆盘,放射性物質(zhì)發(fā)生泄漏普筹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一隘马、第九天 我趴在偏房一處隱蔽的房頂上張望太防。 院中可真熱鬧,春花似錦祟霍、人聲如沸杏头。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)醇王。三九已至,卻和暖如春崭添,著一層夾襖步出監(jiān)牢的瞬間寓娩,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工呼渣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棘伴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓屁置,卻偏偏與公主長(zhǎng)得像焊夸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蓝角,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容