问题描述
我有以下代码来创建随机对象并将它们添加到场景中。最后,该方法在随机延迟后重复。
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添加到场景中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!