Sprite Kit - 使用Switch Case将随机Sprite Nodes添加到场景中

时间:2014-02-14 13:02:27

标签: ios objective-c sprite-kit

我有以下代码来创建随机对象并将它们添加到场景中。最后,该方法在随机延迟后重复。

-(void)createObjects {

// Create random start point
float randomStartPoint = arc4random_uniform(4) * 64 + 32;
CGPoint startPoint = CGPointMake(self.size.width + 50, randomStartPoint);

// Create random object and add to scene
switch (arc4random_uniform(2)) {
    case 0:
    {
        SKSpriteNode *crate = [SKSpriteNode spriteNodeWithImageNamed: @"crate"];

        crate.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:crate.frame.size];
        crate.physicsBody.dynamic = YES;
        crate.physicsBody.affectedByGravity = NO;
        crate.physicsBody.categoryBitMask = objectCategory;
        crate.physicsBody.collisionBitMask = 0;
        crate.physicsBody.contactTestBitMask = playerCategory;

        crate.position = startPoint;
        crate.name = @"object";
        crate.zPosition = 20;

        [self addChild:crate];
        break;
    }

    case 1:
    {
        SKSpriteNode *cactus = [SKSpriteNode spriteNodeWithImageNamed: @"cactus"];

        cactus.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:cactus.frame.size];
        cactus.physicsBody.dynamic = YES;
        cactus.physicsBody.affectedByGravity = NO;
        cactus.physicsBody.categoryBitMask = objectCategory;
        cactus.physicsBody.collisionBitMask = 0;
        cactus.physicsBody.contactTestBitMask = playerCategory;

        cactus.position = startPoint;
        cactus.name = @"object";
        cactus.zPosition = 20;

        [self addChild:cactus];
        break;
    }

    default:
        break;
}

// After adding child, call same method at random delay
float randomNum = arc4random_uniform(4) * 0.4 + 0.25;
[self performSelector:@selector(createObjects) withObject:nil afterDelay:randomNum];
}

实际上我有更多的情况,并且重复了很多相同的代码,因为每个Sprite Node都有相同的设置。有没有办法创建一个精灵节点一次,并在每种情况下为节点设置不同的图像,并将其添加到场景?

1 个答案:

答案 0 :(得分:3)

您可以在switch case中创建SKTexture,然后只需使用该纹理创建节点。

像这样:

-(void)createObjects {

    // Create random start point
    float randomStartPoint = arc4random_uniform(4) * 64 + 32;
    CGPoint startPoint = CGPointMake(self.size.width + 50, randomStartPoint);

    // Create random object and add to scene
    SKTexture* objectTexture;
    switch (arc4random_uniform(2)) {
        case 0:
            objectTexture = [SKTexture textureWithImageNamed:@"crate"];
            break;
        case 1:
            objectTexture = [SKTexture textureWithImageNamed:@"cactus"];
            break;
        default:
            break;
    }
    SKSpriteNode *object = [SKSpriteNode spriteNodeWithTexture:objectTexture];

    object.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:crate.frame.size];
    object.physicsBody.dynamic = YES;
    object.physicsBody.affectedByGravity = NO;
    object.physicsBody.categoryBitMask = objectCategory;
    object.physicsBody.collisionBitMask = 0;
    object.physicsBody.contactTestBitMask = playerCategory;

    object.position = startPoint;
    object.name = @"object";
    object.zPosition = 20;

    [self addChild: object];
}

另一种方法是在switch case之前创建对象,然后简单地创建纹理并使用setTexture在switch case中设置它: