Sprite Kit – добавьте случайные узлы Sprite в сцену с корпусом переключателя

У меня есть следующий код для создания случайных объектов и добавления их в сцену. В конце метод повторяется после случайной задержки.

-(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 имеет одинаковые настройки. Есть ли способ создать узел спрайта один раз и в каждом случае установить другое изображение для узла и добавить его в сцену?

Вы можете создать 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]; } 

Другой способ – создать объект перед корпусом коммутатора, а затем просто создать текстуру и установить ее в случае коммутатора с помощью setTexture:

  • Sprite Kit: SKNode zRotation + Anti-Aliasing
  • Предотвратите провал игрока от земли - Sprite Kit
  • Как настроить текстуру для плитки в наборе спрайтов
  • Spritekit PhysicsBody applyTorque
  • Как перечислить ВСЕ узлы в сцене Sprite Kit?
  • iOS реальное устройство получает EXC_BAD_ACCESS, когда runAction на узле
  • Как сделать конкретный объект бросить вызов гравитации? (SpriteKit / Objective-C)
  • Регулировка громкости SKAction playSoundFileNamed:
  • Объектив C - исключение Catch, возникающее изнутри блока
  • Перетащите SKSpriteNode на основе касания
  • Sprite Kit обнаруживает положение касания
  • Давайте будем гением компьютера.