我是Sprite Kit的新手。我尝试了2个球员进行简单的弹跳游戏,另一个是缓慢跟踪球。但是我发现了一个问题。当我将线移到带边缘的球上时,球从屏幕上消失了。还有一次没问题,球跳动。问题是什么?
我有一个GameScene,sks和ViewController。我的精灵节点来自sks。如果有人解释这种情况。会更好。我已附上我在下面所做的工作。
我的GameScene:
class GameScene: SKScene {
var ball = SKSpriteNode()
var enemy = SKSpriteNode()
var main = SKSpriteNode()
override func didMove(to view: SKView) {
ball = self.childNode(withName: "ball") as! SKSpriteNode
enemy = self.childNode(withName: "enemy") as! SKSpriteNode
main = self.childNode(withName: "main") as! SKSpriteNode
ball.physicsBody?.applyImpulse(CGVector(dx: -20, dy: -20))
ball.physicsBody?.linearDamping = 0
ball.physicsBody?.angularDamping = 0
let border = SKPhysicsBody(edgeLoopFrom: self.frame)
border.friction = 0
border.restitution = 1
self.physicsBody = border
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
main.run(SKAction.moveTo(x: location.x, duration: 0.2))
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
main.run(SKAction.moveTo(x: location.x, duration: 0.2))
}
}
override func update(_ currentTime: TimeInterval) {
// Called before each frame is rendered
enemy.run(SKAction.moveTo(x: ball.position.x, duration: 0.5))
}
Run Code Online (Sandbox Code Playgroud)
视图控制器:
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView? {
// Load the SKScene from 'GameScene.sks'
if let scene = SKScene(fileNamed: "GameScene") {
// Set the scale mode to scale to fit the window
scene.scaleMode = .aspectFill
// Present the scene
view.presentScene(scene)
}
view.ignoresSiblingOrder = true
}
}
override var prefersStatusBarHidden: Bool {
return true
}
Run Code Online (Sandbox Code Playgroud)
打击垫设置:
球设置:
一些更新
我在更新功能中尝试了一些消息,然后遇到同样的情况,球从设备的左侧移出(使用iPhone 6S)
2016-12-08 14:27:54.436485 Pong [14261:3102941]致命错误:球超出左边界:文件
重现问题有多容易?在 中update(),打印球的位置以查看它“消失”时的位置。(这将产生大量输出,因此请注意)。
从您发布的内容来看,球似乎没有设置为与边界碰撞,这意味着球不会对边界做出反应(即反弹),并且边界本身是不动的(因为它是基于边缘的物理身体)。这与高球速(来自重击)相结合可能会使您用“主”精灵击球太用力以至于它穿过边界 - 使用preciseCollisionDetection=true可能会解决这个问题,但首先给边界一个类别并将其添加到球的collisionBitMask.