1
votes

I am makeing a game in which I want that the enemies move following a random pattern within a circle. I already made that the enemies spawn randomly in all the sides of the screen, but the problem is that I dont know how to make the enemies move following a random pattern within a circle just like the image.

class GameScene: SKScene, SKPhysicsContactDelegate {

var circuloPrincipal = SKSpriteNode(imageNamed: "circulo")
var enemigoTimer = NSTimer()
}

override func didMoveToView(view: SKView) {

     circuloPrincipal.size = CGSize(width: 225, height: 225)
    circuloPrincipal.position = CGPoint(x: frame.width / 2, y: frame.height / 2)
    circuloPrincipal.color = colorAzul
   circuloPrincipal.colorBlendFactor = 1.0
 circuloPrincipal.name = "circuloPrincipal"
    circuloPrincipal.zPosition = 1.0
  self.addChild(circuloPrincipal)

override func touchesBegan(touches: Set, withEvent event: UIEvent?) {

        enemigoTimer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("enemigos"), userInfo: nil, repeats: true)

              }

func enemigos() {

    let enemigo = SKSpriteNode(imageNamed: "enemigo")
    enemigo.size = CGSize(width: 25, height: 25)
 enemigo.zPosition = 2.0


    enemigo.name = "enemigo"


         let posisionRandom = arc4random() % 4

    switch posisionRandom {
    case 0:

        enemigo.position.x = 0
        let posisionY = arc4random_uniform(UInt32(frame.size.height))
        enemigo.position.y = CGFloat(posisionY)
        self.addChild(enemigo)




        break

    case 1:

        enemigo.position.y = 0
        let posisionX = arc4random_uniform(UInt32(frame.size.width))
        enemigo.position.x = CGFloat(posisionX)
        self.addChild(enemigo)


        break

    case 2:

        enemigo.position.y = frame.size.height
        let posisionX = arc4random_uniform(UInt32(frame.size.width))
        enemigo.position.x = CGFloat(posisionX)
        self.addChild(enemigo)




        break

    case 3:

        enemigo.position.x = frame.size.width
        let posisionY = arc4random_uniform(UInt32(frame.size.height))
        enemigo.position.y = CGFloat(posisionY)
        self.addChild(enemigo)


        break

    default:


        break


        }


enemigo.runAction(SKAction.moveTo(circuloPrincipal.position, duration: 1.4))



}

enter image description here

1
So you want the enemies to move along a line which intersects a random point in a given circle?Rose Kunkel
yes, a random point within the circle, but I want that the enemy continues its path from one side to another.Diego Benítez
Just do it properly. Get a normal game engine like Unity and use the PointWithinCircle function :)Fattie

1 Answers

1
votes

Try to add this code:

    let randomY = CGFloat(Int.random(-Int(circuloPrincipal.frame.height/2)...Int(circuloPrincipal.frame.height/2)))
    let randomX = CGFloat(Int.random(-Int(circuloPrincipal.frame.width/2)...Int(circuloPrincipal.frame.width/2)))

    let slopeToCirculoPrincipal = (enemigo.position.y - circuloPrincipal.position.y + randomY ) / (enemigo.position.x - circuloPrincipal.position.x + randomX)
    let constant = enemigo.position.y - slopeToCirculoPrincipal * enemigo.position.x

    let finalX : CGFloat = enemigo.position.x < circuloPrincipal.position.x ? 1500.0 : -1500.0 // Set it to somewhere outside screen size

    let finalY = constant +  slopeToCirculoPrincipal * finalX

    let distance = (enemigo.position.y - finalY) * (enemigo.position.y - finalY) + (enemigo.position.x - finalX) * (enemigo.position.x - finalX)
    let enemigoSpeed : CGFloat = 100.0
    let timeToCoverDistance = sqrt(distance) / enemigoSpeed

    let moveAction = SKAction.moveTo(CGPointMake(finalX, finalY), duration: NSTimeInterval(timeToCoverDistance))
    let removeAction = SKAction.runBlock { () -> Void in
        enemigo.removeFromParent()

    }
    enemigo.runAction(SKAction.sequence([moveAction,removeAction]))

Instead of:

     enemigo.runAction(SKAction.moveTo(circuloPrincipal.position, duration: 1.4))

Also you need to put this extension somewhere in your project:

extension Int
   {
static func random(range: Range<Int> ) -> Int
{
    var offset = 0

    if range.startIndex < 0   // allow negative ranges
    {
        offset = abs(range.startIndex)
    }

    let mini = UInt32(range.startIndex + offset)
    let maxi = UInt32(range.endIndex   + offset)

    return Int(mini + arc4random_uniform(maxi - mini)) - offset
}
  }