( 一 ) MY_SpriteKit_創(chuàng)建你的第一個場景

創(chuàng)建你的第一個場景

Sprite Kit 內(nèi)容被放置在一個窗口中,就像其他可視化內(nèi)容那樣。Sprite Kit 內(nèi)容由 SKView 類 渲染呈現(xiàn)。SKView 對象渲染的內(nèi)容稱為一個場景,它是一個 SKScene 對象。場景參與響應(yīng)鏈, 還有其他使它們適合于游戲的功能。
因為 Sprite Kit 內(nèi)容由視圖對象渲染,你可以在視圖層次組合這個視圖與其他視圖。例如,你可 以使用標(biāo)準(zhǔn)的按鈕控件,并把它們放在你的 Sprite Kit 視圖上面。或者,你可以添加交互到精靈 來實現(xiàn)自己的按鈕,選擇權(quán)在你。在這個例子中,稍候你會看到如何實現(xiàn)場景交互。

配置視圖控制器來使用Sprite Kit

  1. 打開項目的storyboard。它有一個單一的視圖控制器(SpriteViewController)。選 擇視圖控制器的 view 對象并把它的類改成 SKView。
  2. 在視圖控制器的實現(xiàn)文件添加一個導(dǎo)入行。
 #import <SpriteKit/SpriteKit.h>
  1. 實現(xiàn)視圖控制器的viewDidLoad方法來配置視圖。
- (void)viewDidLoad
{
[super viewDidLoad];
SKView * spriteView =(SKView *)self.view;
spriteView.showsDrawCount = YES;
spriteView.showsNodeCount = YES;
spriteView.showsFPS = YES;
 
}
  1. 代碼開啟了 述場景如何渲染視圖的診斷信息。最重要的一塊信息是幀率 (spriteView.showsFPS),你希望你的游戲盡可能在一個恒定的幀率下運行。其他行 展示了在視圖中顯示了多少個節(jié)點,以及使用多少繪畫傳遞來渲染內(nèi)容(越少越好)的詳 情。
    接下來,添加第一個場景。

創(chuàng)建Hello場景

  1. 創(chuàng)建一個名為HelloScene新類并讓它作為SKScene類的子類。
  2. 在你的視圖控制器導(dǎo)入場景的頭文件。
 #import “HelloScene.h”
  1. 修改視圖控制器來創(chuàng)建場景,并在視圖中呈現(xiàn)場景。
- (void)viewWillAppear:(BOOL)animated
{
HelloScene *hello = [[HelloScene alloc] initWithSize:CGSizeMake(768,1024)];
SKView *spriteView =(SKView *)self.view;
[spriteView presentScene:hello];
}

現(xiàn)在,構(gòu)建并運行項目。該應(yīng)用程序應(yīng)該啟動并顯示一個只有診斷信息的空白屏幕。

將內(nèi)容添加到場景

當(dāng)設(shè)計一個基于 Sprite Kit 的游戲,你要為你的游戲界面各主要大塊(chuck)設(shè)計不同的場景類。 例如,你可以為主菜單創(chuàng)建一個場景而為游戲創(chuàng)建另一個單獨的場景。在這里,你會遵循類似的 設(shè)計。這第一個場景顯示了傳統(tǒng)的“Hello World”文本。

大多數(shù)情況下,你可以配置一個場景在它被視圖首次呈現(xiàn)時的內(nèi)容。這跟視圖控制器只在視圖屬 性被引用時加載他們的視圖的方式是類似的。在這個例子中,代碼在 didMoveToView:方法內(nèi) 部,每當(dāng)場景在視圖中顯示時該方法會被調(diào)用。

在場景中顯示Hello文本

  1. 添加一個新的屬性到場景的實現(xiàn)文件中來跟蹤場景是否已創(chuàng)建其內(nèi)容。
@interface HelloScene()
@property BOOL contentCreated;
@end

該屬性跟蹤并不需要向客戶端公開的狀態(tài),所以,在實現(xiàn)文件中它一個私有接口聲明里實 現(xiàn)。

  1. 實現(xiàn)場景的didMoveToView:方法。
- (void)didMoveToView:(SKView *)view {
    if (!self.contentCreated) {
        
        [self createContent];
        
        self.contentCreated = YES;
        
    }
}

每當(dāng)視圖呈現(xiàn)場景時,didMoveToView:方法都會被調(diào)用。但是,在這種情況下,場景的 內(nèi)容應(yīng)只在場景第一次呈現(xiàn)時進(jìn)行配置。因此,這段代碼使用先前定義的屬性 (contentCreated)來跟蹤場景的內(nèi)容是否已經(jīng)被初始化。

  1. 實現(xiàn)場景的createSceneContents方法。
- (void)createContent {
    
    self.backgroundColor = [SKColor blueColor];
    
    self.scaleMode = SKSceneScaleModeAspectFit;
    
    [self addChild:[self newHelloNode]];
    
}

場景在繪制它的子元素之前用背景色繪制視圖的區(qū)域。注意使用 SKColor 類創(chuàng)建 color 對 象。事實上,SKColor 不是一個類,它是一個宏,在 iOS 上映射為 UIColor 而在 OS X 上它映射為 NSColor。它的存在是為了使創(chuàng)建跨平臺的代碼更容易。
場景的縮放(scale)模式?jīng)Q定如何進(jìn)行縮放以適應(yīng)視圖。在這個例子中,代碼縮放視圖, 以便你可以看到場景的所有內(nèi)容,如果需要使用寬屏(letterboxing)。

  1. 實現(xiàn)場景的newHelloNode方法。
- (SKLabelNode *)newHelloNode {
    SKLabelNode * helloNode = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
    
    helloNode.text = @"Hello world";
    
    helloNode.fontSize = 42;
    
    helloNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    
    helloNode.name = @"helloNode";
    
    return helloNode;
}

你永遠(yuǎn)不用編寫顯式執(zhí)行繪圖命令的代碼,而如果你使用 OpenGL ES 或 Quartz 2D 你就 需要。在 Sprite Kit 中,你通過創(chuàng)建節(jié)點對象并把它們添加到場景中來添加內(nèi)容。所有繪 制必須由 Sprite Kit 中 供的類來執(zhí)行。你可以自定義這些類的行為來產(chǎn)生許多不同的圖 形效果。然而,通過控制所有的繪圖,Sprite Kit 可以對如何進(jìn)行繪圖應(yīng)用許多優(yōu)化。
現(xiàn)在構(gòu)建并運行該項目。你現(xiàn)在應(yīng)該看到一個藍(lán)色屏幕上面有“Hello, World!”?,F(xiàn)在,你已經(jīng) 學(xué)會了繪制 Sprite Kit 內(nèi)容的所有基礎(chǔ)知識。

使用動作讓場景動起來

靜 態(tài) 文 本 很 友 好 ,但 如 果 文 字 可 以 動 起 來 ,它 會 更 有 趣 。大 多 數(shù) 的 時 候 ,你 通 過 執(zhí) 行 動 作( a c t i o n ) 移動場景周圍的東西。Sprite Kit 中的大多數(shù)動作對一個節(jié)點應(yīng)用變化。創(chuàng)建 action 對象來 述你想要的改變,然后告訴一個節(jié)點來運行它。然后,當(dāng)渲染場景時,動作被執(zhí)行,在幾個幀上 發(fā)生變化直到它完成。
當(dāng)用戶觸摸場景內(nèi)容,文字動起來然后淡出。

讓文本動起來

  1. 添加以下代碼到newHelloNode方法:
 helloName.name = @“helloNode”;

所有節(jié)點都有一個名稱屬性,你可以設(shè)置它來 述節(jié)點。當(dāng)你想能夠在稍后找到它,或當(dāng) 你想構(gòu)建基于節(jié)點名稱的行為時,你應(yīng)該命名一個節(jié)點。稍后,你可以搜索樹中與名稱相 匹配的節(jié)點。
在這個例子中,你給標(biāo)簽的一個名稱以便稍后可以找到它。在實際的游戲中,你可能會得 給呈現(xiàn)相同類型的內(nèi)容的任何節(jié)點以相同的名稱。例如,如果你的游戲把每個怪物呈現(xiàn)為 一個節(jié)點,你可能會命名節(jié)點為 monster。

  1. 重載場景類的touchesBegan:withEvent方法。當(dāng)場景接收到觸摸事件,它查找名為 helloNode 的節(jié)點,并告訴它要運行一個簡短的動畫。
    所有節(jié)點對象都是 iOS 上 UIResponder 或 OS X 上 NSResponder 的 的子類。這意味著 你可以創(chuàng)建 Sprite Kit 節(jié)點類的子類來添加交互到場景中的任何一個節(jié)點。
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    SKNode * helloNode = [self childNodeWithName:@"helloNode"];
    
    if (nil != helloNode) {
        
        helloNode.name = nil;
        
        // 向上移動
        SKAction * moveUp = [SKAction moveByX:0 y:100.0f duration:0.5];
        
        // 縮放比例
        SKAction * zoom = [SKAction scaleTo:2.0f duration:0.25];
        
        // 暫停
        SKAction * pause = [SKAction waitForDuration:0.5];
        
        // 漸變
        SKAction * fade = [SKAction fadeOutWithDuration:0.25];
        
        // 移除
        SKAction * remove = [SKAction removeFromParent];
        
        // 按順序執(zhí)行
        SKAction * moveSequnce = [SKAction sequence:@[moveUp, zoom, pause, fade, remove]];
        
        // 執(zhí)行動畫
        [helloNode runAction:moveSequnce];
        
    }
}

為了防止節(jié)點響應(yīng)重復(fù)按壓,代碼會清除節(jié)點的名稱。然后,它構(gòu)建動作對象來執(zhí)行各種 操 作 。最 后 ,它 組 合 這 些 動 作 創(chuàng) 建 一 個 動 作 序 列 ; 序 列 運 行 時 ,按 順 序 執(zhí) 行 每 個 動 作 。最 后 , 它告訴標(biāo)簽節(jié)點執(zhí)行序列動作。
運行的應(yīng)用程序。你應(yīng)該看到像之前那樣的文字。在屏幕的底部,節(jié)點計數(shù)應(yīng)該是 1?,F(xiàn)在,點 擊視圖內(nèi)部。你應(yīng)該看到文字動畫并淡出。在它淡出后,節(jié)點計數(shù)應(yīng)該變?yōu)?0,因為節(jié)點已從父 節(jié)點中移除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容