官方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, (未完!!)








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