如何使精灵遵循圆圈内的随机模式?

时间:2016-06-28 19:41:08

标签: swift sprite-kit sprite

我正在制作一个游戏,我希望敌人按照圆圈内的随机模式移动。我已经让敌人在屏幕的所有侧面随机产生,但问题是我不知道如何使敌人按照圈内的随机图案移动,就像图像一样。

类GameScene:SKScene,SKPhysicsContactDelegate {

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

覆盖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)

覆盖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 个答案:

答案 0 :(得分:1)

尝试添加此代码:

    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]))

而不是:

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

此外,您需要将此扩展程序放在项目的某个位置:

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
}
  }