官方SPRITE KIT遊戲ADVENTURE流程

此文爲學習筆記,單純記錄下有助以後速查~

SPRITE KIT新人,有錯誤的地方希望留言指教~


1, 在創建場景之前,在viewController裏先加載所有資源文件,包括frames, emitters等等,並且開啓進度條以提示等待。 由於目前Sprite Kit 存在問題,這些處理要放在viewWillAppear裏來處理,否則場景大小會出問題。同時要在此處判斷用戶設備是IPHONE或者是IPAD,並對尺寸做出相應處理。

2,給場景一個尺寸,並且創建場景。

3,判斷是否有外接操控設備(IOS新加入外接控制器),連接或者斷開控制器時做相應的notification提示,

4, 當加載資源完成後,通過handler來通知主線程,停止掉進度條的顯示,並且屏幕顯示出兩個按鈕,戰士,弓箭手。這兩個按鈕是本來就在那裏,不過是HIDDEN屬性,handler觸發後,通過動畫的來讓alpha值2秒內漸變到1.0f,來實現動態顯示的過程。

5, 在加載資源過程中,需要加載emiiter特效與frame到atlas集合裏,方便以後的調用。

6, 加載世界地圖。遊戲中將整個世界劃分爲32*32個小地圖,並存儲到Tiles.atlas中,這樣做的好處是不需要全部將地圖加載到內存中,只需要按場景需要加載要顯示的部分就可以。所以共有1024個小地圖場景碎片。

7,官方文檔說,在編譯的過程中,XCODE會自動將這些地圖碎片整合成5張小圖,這樣最小化的加載資源。

8,在加載地圖的method裏邊,給每個小圖一個SKSpriteNode實例,並且設定好位置,確保加載後能正確顯示位置。在加載這些的之後,開始場景內其他環境資源,人物資源加載的同時。給地圖碎片一個NSMutableArray,大小是1024。加載過程如下:

    sBackgroundTiles = [[NSMutableArray alloc] initWithCapacity:1024];
    for (int y = 0; y < kWorldTileDivisor; y++) {
        for (int x = 0; x < kWorldTileDivisor; x++) {
            int tileNumber = (y * kWorldTileDivisor) + x;
            SKSpriteNode *tileNode = [SKSpriteNode spriteNodeWithTexture:[tileAtlas textureNamed:[NSString stringWithFormat:@"tile%d.png", tileNumber]]];
            CGPoint position = CGPointMake((x * kWorldTileSize) - kWorldCenter,
                                           (kWorldSize - (y * kWorldTileSize)) - kWorldCenter);
            tileNode.position = position;
            tileNode.zPosition = -1.0f;
            tileNode.blendMode = SKBlendModeReplace;
            [(NSMutableArray *)sBackgroundTiles addObject:tileNode];
        }
    }

9,資源加載部分: 爲了節省資源,場景內共享的資源都一次加載到內存中,保存儘量長的時間,通過用dispatch_once block來確保只加載一次,每個人物class都繼承了loadSharedAssets這個method,拿BOSS類來說,會加載BOSS相關的動畫,包括閒置時的動畫,移動動畫,攻擊動畫,被攻擊動畫,死亡時的動畫等等,同時也會加載粒子效果,比如當英雄的武器攻擊到BOSS時產生的傷害效果。

10,遊戲裏有一個叫做APAGraphicsUtilities的類,專門來做圖方面的處理。其中APALoadFramesFromAtlas()方法就是從本地加載紋理貼圖,提取圖片名字並且序列化,返回一個SKTexture的array,簡化了加載資源的過程。代碼如下:

#pragma mark - Loading from a Texture Atlas
NSArray *APALoadFramesFromAtlas(NSString *atlasName, NSString *baseFileName, int numberOfFrames) {
    NSMutableArray *frames = [NSMutableArray arrayWithCapacity:numberOfFrames];
    
    SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:atlasName];
    for (int i = 1; i <= numberOfFrames; i++) {
        NSString *fileName = [NSString stringWithFormat:@"%@%04d.png", baseFileName, i];
        SKTexture *texture = [atlas textureNamed:fileName];
        [frames addObject:texture];
    }
    
    return frames;
}


11,大部分全局資源都保存在static變量中,方便訪問,代碼如下:

static SKEmitterNode *sSharedDamageEmitter = nil;
- (SKEmitterNode *)damageEmitter {
    return sSharedDamageEmitter;
}

12,在加載完所有資源後,搭建場景及場景環境NSMutableArray來存儲玩家以備日後多人遊戲,並且設置一個defaultPlayer。在array裏先添加上NSNull,以備隨時有玩家加入遊戲。本遊戲中最大支持4人同時遊戲,所以是一個default player和3個NSNull的實例。

13,對世界場景分層次。同樣是保存在typedef enum: uint8_t 的enumeration中,

/* The layers in a scene. */
typedef enum : uint8_t {
	APAWorldLayerGround = 0,
	APAWorldLayerBelowCharacter,
	APAWorldLayerCharacter,
	APAWorldLayerAboveCharacter,
	APAWorldLayerTop,
	kWorldLayerCount
} APAWorldLayer;
之後無論何時,在添加進新的元素的時候,都採用方法 addNode:atWorldLayer: 方法,來給元素一個層級。


14,因爲所有圖層都是在world層之下,所以創建world節點後,分別創建不同的節點圖層,並添加到world中,分別給zPosition值來確定層級關係。

15,創建HUD,屏幕上方顯示的人物頭像,血條等等圖層。這個要跟world圖層分開,這些是會始終顯示在屏幕上方,不隨world變化而產生位置變化。

16,創建遊戲場景圖層,創建各種array來分別保存場景中的元素,英雄,敵人,洞穴,樹等等,並且創建樹分佈圖與levelmap(後邊會用到)。並且把camera設置到以英雄爲中心的位置。

#pragma mark - Mapping
- (void)centerWorldOnPosition:(CGPoint)position {
    [self.world setPosition:CGPointMake(-(position.x) + CGRectGetMidX(self.frame),
                                        -(position.y) + CGRectGetMidY(self.frame))];
    
    self.worldMovedForUpdate = YES;
}

17, 在buildWorld方法中,設置模擬物理效果,添加physicsbody, 然後添加sprite,並且設置初始化位置。本遊戲爲俯視2D遊戲,不需要重力設置,取消重力。設置self.physicsWorld.contactDelegate = self;,當碰撞產生時來接受callback。(後邊會詳細提到)。之後將預先加載的地圖添加到場景中。

18,爲了更容易確定不同角色的初始位置,我們創建了一個level map(16中提到的),level map通過像素點來指出各個角色所在的位置。有點透明的像素點是表示BOSS所在位置,紅色表示的是牆,綠色是哥布林的洞穴,藍色表示英雄初始的位置。


                 


19, 這張圖早先也在預加載資源的過程中被加載到內存中,這樣可以通過調用APACreateDataMap()來讀取到這張圖,APACreateARGBBitmapContext(),通過這個方法來創建8bit的bit map.

19, (未完!!)








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章