2016-06-28 3 views
1

私は、敵が円内のランダムなパターンに従って動くようにしたいというゲームを作っています。私はすでに敵が画面のすべての側面にランダムに出現するようにしましたが、問題は、画像のように円内のランダムなパターンに従って敵を動かす方法を知らないということです。スプライトを円内のランダムなパターンに従う方法を教えてください。

クラスGameScene:SKScene、SKPhysicsContactDelegate didMoveToView(ビュー:SKView)FUNC {

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

オーバーライド{

touchesBegan(:セット、withEventイベントたUIEvent?タッチ)FUNC {

 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) 

オーバーライド

 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

+0

それで、敵を円の任意の点と交差する線に沿って移動させたいのですか? –

+0

はい、円内のランダムな点ですが、私は敵が一方の側から他方の側へとその経路を継続したいと考えています。 –

+0

ちょうどそれを正しくしてください。 Unityのような通常のゲームエンジンを手に入れて、PointWithinCircle関数を使用してください:) – Fattie

答えて

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

あまりにもイワン、ありがとう! –

関連する問題