Sprite Kit - 使用Switch Case将随机Sprite Nodes添加到场景中 [英] Sprite Kit - Add random Sprite Nodes to the scene with Switch Case

查看:109
本文介绍了Sprite Kit - 使用Switch Case将随机Sprite Nodes添加到场景中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have the following code to create random objects and add them to the scene. At the end the method is repeated after a random delay.

-(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节点都有相同的设置。有没有办法创建一个精灵节点一次,并在每种情况下为节点设置不同的图像,并将其添加到场景?

In reality I have many more cases and a lot of the same code is repeated, since every Sprite Node has the same settings. Is there a way to create a sprite node once, and in every case set a different image for the node, and add it to the scene?

推荐答案

您可以在开关案例中创建SKTexture,然后只需创建具有该纹理的节点。

You can create SKTexture in switch case and then simply create node with that texture.

像这样:

-(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];
}

另一种方法是在切换案例之前创建对象,然后简单地创建纹理和使用setTexture在开关盒中设置它:

Another way would be to create object before switch case and then simply create texture and set it in switch case using setTexture:

这篇关于Sprite Kit - 使用Switch Case将随机Sprite Nodes添加到场景中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆