jcaldana
jcaldana

Reputation: 33

How can I spawn a random (CLASS SPRITENODE) enemy into my gamescene

I am new is swift programming. I want to spawn an enemies into a random positions using a Class node. I tried to search a code for a random spawning of an enemies but it seems it is irrelevant for my code.

Here is the code I searched for the random spawning.

import SpriteKit

class GameScene: SKScene {

  let player = SKSpriteNode(imageNamed:"spacemonkey_fly02")

  override func didMoveToView(view: SKView) {

    player.position = CGPoint(x:frame.size.width * 0.1, y: frame.size.height * 0.5)
    addChild(player)
    backgroundColor = SKColor.blackColor()

    runAction(SKAction.repeatActionForever(
      SKAction.sequence([
        SKAction.runBlock(spawnEnemy),
        SKAction.waitForDuration(1.0)])))
  }

  func random() -> CGFloat {
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
  }

  func random(#min: CGFloat, max: CGFloat) -> CGFloat {
    return random() * (max - min) + min
  }

  func spawnEnemy() {
    let enemy = SKSpriteNode(imageNamed: "boss_ship")
    enemy.name = "enemy"
    enemy.position = CGPoint(x: frame.size.width, y: frame.size.height * random(min: 0, max: 1))
    addChild(enemy)
  }

}

Here is the Class I made that I want to spawn randomly in my gamescene

import SpriteKit


class Meteor: SKSpriteNode, GameSprite {
    var textureAtlas:SKTextureAtlas = SKTextureAtlas(named:"meteor.atlas")
    var meteorAnimation = SKAction()

    func spawn(parentNode: SKNode, position: CGPoint, size: CGSize = CGSize(width: 30, height: 30)) {
        parentNode.addChild(self)
        meteorRotation()

        self.size = size
        self.position = position

        self.texture = textureAtlas.textureNamed("meteor-1.png")
        self.physicsBody = SKPhysicsBody(texture: textureAtlas.textureNamed("meteor-1.png"), size: size)

        self.physicsBody = SKPhysicsBody(circleOfRadius: size.width / 2)

        self.physicsBody?.affectedByGravity = true
        self.runAction(meteorAnimation)
    }

    func meteorRotation() {

        let meteorCycle = SKAction.rotateByAngle(4, duration: 2);
        meteorAnimation = SKAction.repeatActionForever(meteorCycle)
    }

    func onTap() {
        //self.physicsBody?.affectedByGravity = false
        self.physicsBody?.dynamic = false
        self.physicsBody?.categoryBitMask = 0

        let crashAnimation = SKAction.group([
            SKAction.fadeAlphaTo(0, duration: 0.2),
            SKAction.scaleTo(1.5, duration: 0.2),
            SKAction.moveBy(CGVector(dx: 0, dy: 25), duration: 0.2)
            ])
        let resetAfterCrashed = SKAction.runBlock {
            self.position.y = 5000
            self.alpha = 1
            self.xScale = 1
            self.yScale = 1
        }
        let crashSequence = SKAction.sequence([
            crashAnimation,
            resetAfterCrashed
            ])

        self.runAction(crashSequence)

    }
}

Is it possible to use the code I searched for a class node?

Upvotes: 2

Views: 211

Answers (1)

Stephen
Stephen

Reputation: 642

I tried to modify the random spawning code you found to use your meteor class. I took out any lines that didn't involve the meteors, so you'll need to add your world, earth, and field code as you sent me. Give this a shot and let me know if it works out:

class GameScene: SKScene {

  override func didMoveToView(view: SKView) {
    backgroundColor = SKColor.blackColor()

    runAction(SKAction.repeatActionForever(
      SKAction.sequence([
        SKAction.runBlock(spawnEnemy),
        SKAction.waitForDuration(1.0)])))
  }

  func random() -> CGFloat {
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
  }

  func random(#min: CGFloat, max: CGFloat) -> CGFloat {
    return random() * (max - min) + min
  }

  func spawnEnemy() {
    let newMeteor = Meteor()
    let meteorPosition = CGPoint(x: frame.size.width, y: frame.size.height * random(min: 0, max: 1))
    newMeteor.spawn(world, meteorPosition)
  }
}

Upvotes: 1

Related Questions