2017-07-31 46 views
1

我想在屏幕外產生一個節點,並在隨機點(框架的所有四邊,隨機選擇哪一邊)前往另一邊。Swift Spawing圍繞框架的隨機節點

我是新來Swift,我不明白,我怎麼就能夠實現這一目標或獲取碰撞的時節點擊中frame另一側的點添加到我的分數工作。

+0

你是什麼具體困難的移動動作?你嘗試過什麼嗎?如果是這樣,發佈它會很有幫助。 – yakobom

+0

歡迎回來!這實際上是兩個問題。你可能想把它分成1),如何隨機產生東西,然後2),打中檢測 – Fluidity

回答

1

與流動性的方法的缺點是,你會發現更多的敵人產卵在角落然後在中央。要獲得更加統一的生成物,您希望使用半徑爲場景寬度或高度/ 2 +精靈寬度或高度/ 2(取決於場景的哪一側最長)的圓。

現在是先決條件這就是一切都需要被錨點(0.5,0.5),甚至現場。這種方法將與anchorPoint(0,0)一起工作,但這需要額外的數學來移動你的圈子(這不是必要的,如果你將錨點全都保持在0.5,0.5,你會發現你的生活更容易)

func randomPosition(spriteSize:CGSize) -> CGPoint 
{ 

    let angle = (CGFloat(arc4random_uniform(360)) * CGFloat.pi)/180.0 
    let radius = (size.width >= size.height ? (size.width + spritSize.width) : (size.height + spriteSize.height))/2 
    return CGPoint(cos(angle) * radius,sin(angle) * radius) 
} 

要使用它:

let pos = randomPosition(mySprite.size) 
mySprite.position = pos` 

現在相反的方向走,你只需要翻轉你的座標

let oppositePosition = CGPoint(x:-1 * pos.x,y: -1 * pos.y) 

現在得分點的跡象,當它擊中對方的碎石n很容易。不需要任何碰撞。

你想要做什麼動作

序列
let move = SKAction.move(to:oppositePosition,duration:10) 
let score = SKAction.run({score += 1}) 
let seq = SKAction.sequence([move,score]) 
sprite.run(seq, withKey:"moving") 

什麼會發生在這裏是AFTE精靈完成其移動動作,這無疑增加分數。

現在我要承擔的東西是否與物體發生碰撞,那麼你不進球,所以在你的didBeginContact,刪除與sprite.removeAction(forKey:"moving")

2

基本上這是關於分而治之!就像在你的店鋪問題中一樣,你有很多步驟要做,所以把事情排除在外/保持有組織的方式是必須的!

我爲SKScene做了一個簡單的擴展,根據大小和寬度得到一個隨機的X和Y ......如果你願意,你可以把它放在你的gamescene中,但是我把很多這些可重用的「幫手」作爲SKScene擴展功能到自己的文件中。

第二,我們有一個叫做Side枚舉,用於:

  • 提供這方面,我們要在
  • 邏輯執行操作來確定哪些隨機值,我們需要實際數據產卵敵人,並確定其目的地

  • 生成隨機側

  • 生成一個OPPO現場側

最後我們gamescene,其中只有一個功能spawnEnemy ...這很酷,因爲它讓你的GS整潔和有組織!當您嘗試實現新功能/調試舊功能時,這總是很棒的。

extension SKScene { 

    /// Something that could be useful in many scenes/games: 
    func getRandomWidthHeight() -> (width: CGFloat, height: CGFloat) { 
    // A little confusing but we have to do two casts because 
    // I misplaced my random function that uses Floats :) 
    var randX = CGFloat(arc4random_uniform(UInt32(size.width))) 
    var randY = CGFloat(arc4random_uniform(UInt32(size.height))) 

    // We need to subtract where the anchorPoint lies to fit into 
    // SK's coordinate system when anchorPoint == (0.5, 0.5). 
    // In other words, if scene height is 1000 pixels, then 
    // the highest Y value is 500, and the lowest Y value is -500. 
    // Because, 1000 * 0.5 (anchorpoint) is 500. 
    randX -= size.width * anchorPoint.x 
    randY -= size.height * anchorPoint.y 

    return (randX, randY) 
    } 
} 

enum Side { 

    case left, right, top, bottom 

    /// Used for finding enemy destination: 
    var opposite: Side { 
    switch self { 
    case .top: return .bottom 
    case .right: return .left 
    case .bottom: return .top 
    case .left: return .right 
    } 
    } 

    /// Used for spawning enemy, and for finding its destination: 
    func getRandomPoint(inScene scene: GameScene) -> CGPoint { 


    let (randX, randY) = scene.getRandomWidthHeight() 
    /* 
         top: randX, maxY 
         ______ 
    left: minX, randY | | 
         | | right: maxX, randY 
         |____| 
        bottom: randX, minY 
    */ 

    switch self { 
    case .top: return CGPoint(x: randX,    y: scene.frame.maxY) 
    case .right: return CGPoint(x: scene.frame.maxX, y: randY   ) 
    case .bottom: return CGPoint(x: randX,    y: scene.frame.minY) 
    case .left: return CGPoint(x: scene.frame.minX, y: randY) 
    } 
    } 

    /// Simply create a random side to be used for spawning: 
    static var random: Side { 
    // 0 is top, 1 is right, 2 is bottom, 3 is left 
    let rand = Int(arc4random_uniform(4)) 

    switch rand { 
    case 0: return .top 
    case 1: return .right 
    case 2: return .bottom 
    case 3: return .left 
    default: fatalError() 
    } 
    } 
} 


class GameScene: SKScene { 

    func spawnEnemy(speed: TimeInterval) { 

    let sideToSpawnOn = Side.random 
    let spawnPosition = sideToSpawnOn.getRandomPoint(inScene: self) 
    let destination = sideToSpawnOn.opposite.getRandomPoint(inScene: self) 

    let enemy = SKSpriteNode(color: .blue, size: CGSize(width: 50, height: 50)) 
    enemy.position = spawnPosition 

    // Shift outside frame: 
    enemy.position.x += (spawnPosition.x > 0 ? enemy.size.width : -enemy.size.width) 
    enemy.position.y += (spawnPosition.y > 0 ? enemy.size.height : -enemy.size.height) 

    enemy.run(.move(to: destination, duration: speed)) 
    addChild(enemy) 
    } 

    override func didMove(to view: SKView) { 
    anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    let sequence = SKAction.sequence([.wait(forDuration: 2), .run({ self.spawnEnemy(speed: 2) })]) 
    run(.repeatForever(sequence)) 
    } 
} 

我沒去上打的檢測,因爲這是一個單獨的問題:)

+0

你在隨機使用maxX和maxY,如果這個場景的anchorPoint是0.5,0.5,那不會讓maxY在500?假設我們隨機得到500.然後你拿1000/2的高度給500,並從500減去。這意味着你的範圍是-500,0 – Knight0fDragon

+0

他也想在框外產卵。你在框架上產卵,你可能想要推回一些 – Knight0fDragon

+0

你的範圍仍然是關閉的,你需要找到整個寬度/高度的隨機數,然後將它移動1/2 – Knight0fDragon