SpriteKit - 除底部和顶部外的所有侧面的边框

SpriteKit - Border on all sides except bottom and top

我有一个主要的玩家节点和随机掉落的敌人,但他们中的一部分在框架之外,我想让他们(和玩家)无法离开框架,左边和右边边界。我怎样才能做到这一点?

感谢您的时间和努力:)

这是我的敌人线,不知道这有什么帮助,但就在这里,所以我不会因为 'too broad'

而被举报
 func launchEnemy() {

    let randomX = arc4random_uniform( UInt32(screenWidth))

    EnemyMissile.position = CGPoint(  x: CGFloat(randomX)  - (screenWidth / 2), y: screenHeight + 50)


    let action = SKAction.move(by: CGVector(dx: 0, dy: -400 + speedScore), duration: 5.0)


   EnemyMissile.run(SKAction.repeatForever(action))        

     increaseSpeed()


    self.run(action, withKey:"LaunchEnemyAction")
}  

这是我的 EnemyClass

     import Foundation
     import SpriteKit

class EnemyClass: SKNode {

var EnemyNode:SKSpriteNode = SKSpriteNode()

var hitsToKill:Int = 2
var hitCount:Int = 0
var damagePoints: Int = 2

//var missileAnimation:SKAction?

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) had not been implemented")

}

override init () {

    super.init()

}



    func createEnemy ( _ theImage:String) {


EnemyNode = SKSpriteNode(imageNamed: theImage)
self.addChild(EnemyNode)

let body:SKPhysicsBody = SKPhysicsBody(circleOfRadius: EnemyNode.size.width / 2.25, center:CGPoint(x: 0,y: 0))
body.isDynamic = true
body.affectedByGravity = false
body.allowsRotation = false


  body.categoryBitMask = BodyType.enemy.rawValue
  body.contactTestBitMask =  BodyType.bullet.rawValue |              BodyType.player.rawValue


self.physicsBody = body

self.name = "EnemyClass"

}

func destroy() {
   self.removeFromParent()
   self.name = "removeNode"
}
func hit() -> Bool {

    hitCount += 1

    if ( hitCount == hitsToKill) {

        destroy()
        return true

    } else {
        damagePoints = 4

        EnemyNode.removeAction(forKey: "animation")
        return false
    }

}

}

基本上你有两个问题:

  1. 你的重生点一团糟
  2. 你没有边界

您有几个设置边界的选项,一个是 physicsBody,另一个是 keepInBounds() 方法等。下面我要一个简单的keep in bounds方法:

class GameScene: SKScene {

  func spawnEnemy() {
    let offset = CGFloat(5) // pixels, so enemy will have some spacing between borders.

    let enemy = SKSpriteNode(color: .blue, size: CGSize(width: 50, height: 100))
    enemy.name = "enemy"
    addChild(enemy)

    var randomX = CGFloat(arc4random_uniform(UInt32(self.size.width))) // This is not a perfect rando algo.

    // Because our random x was from 0 through screenwidth, but .position works
    // on -halfWidth through +halfWidth
    randomX -= (self.frame.size.width / 2)

    // Because spawning on the border will mean that the enemy is HALF out of view:
    /*

     right border:       |
     enemy @ frame.maxX: x
     - offset:          x|
     - size.w/2        x |
     */
    if randomX > self.frame.maxX - offset - (enemy.size.width / 2) {
       randomX = self.frame.maxX - offset - (enemy.size.width / 2)
    }
    else if randomX < self.frame.minX + offset + (enemy.size.width / 2) {
            randomX = self.frame.minX + offset + (enemy.size.width / 2)
    }

    enemy.position.x = randomX
  }

  func keepEnemyInBounds() {
    // A better way to do this would be to have a dictionary of enemies:
    for node in self.children {
      guard node.name == "enemy" else { continue }
      let enemy = node as! SKSpriteNode

      if enemy.position.x > frame.maxX - (enemy.size.width / 2) {
        enemy.position.x = frame.maxX - (enemy.size.width / 2)
      }
      else if enemy.position.x < frame.minX + (enemy.size.width / 2) {
        enemy.position.x = frame.minX + (enemy.size.width / 2)
      }
    }
  }


  override func update(_ currentTime: TimeInterval) {
    spawnEnemy()
  }
  override func didFinishUpdate() {
    keepEnemyInBounds()
  }
}