我有一个岩石精灵,它正在下降,每次它离开屏幕我想重置它回到顶部并让它再次下降。它应该是一个连续的循环。这是我的代码:
import SpriteKit
import GameplayKit
class GameScene: SKScene {
func addRock(){
var rock = self.childNode(withName: "rock")
rock?.physicsBody?.affectedByGravity = true
//self.addChild(rock!)
}
override func sceneDidLoad() {
//bRock = self.childNode(withName: "rock")
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//addRock()
var rock = self.childNode(withName: "rock")
rock?.physicsBody?.affectedByGravity = true
/*if (Int((rock?.position.y)!) < Int((self.view?.scene?.view?.bounds.minY)!)){
print("out of screen")
rock?.removeFromParent()
addRock()
}*/
}
override func update(_ currentTime: TimeInterval) {
// Called before each frame is rendered
var rock = self.childNode(withName: "rock")
//rock?.physicsBody?.affectedByGravity = true
if (!intersects(rock!)){
print("out of screen")
rock?.removeFromParent()
addRock()
}
}
}
我让摇滚在屏幕上然后掉下来。一旦它离开屏幕,它不会重置,我收到一个错误。我尝试将重置代码放在touchesBegan和更新函数中,但都不起作用。如果有人能指导我走正确的道路,那将非常感激。
答案 0 :(得分:0)
您遇到的问题是您要从场景中移除摇滚节点,但addRock
方法实际上并未添加新摇滚,它只是找到现有节点如果有,并在其physicsBody
上设置属性。您应该只更改其位置,而不是删除节点。
假设您的场景的默认锚点为(0,0),您可以像这样重置位置:
override func update(_ currentTime: TimeInterval) {
// Called before each frame is rendered
if let rock = self.childNode(withName: "rock") {
if !intersects(rock!) {
print("out of screen")
rock.position.y = size.height/2 // divided by 2 as discussed in comments
}
}
这会将摇滚的位置重置到场景的顶部,并且应该从那里恢复掉落。
答案 1 :(得分:0)
三种方式:
addRock
(resetRock
应该更好):{{ 1}}。但要注意你还需要重置它的速度等,因为它之前被物理定律所感动...... rock.position = CGPoint(...)
addRock
离开屏幕时创建一个新的摇滚(以及它的所有初始化代码。更简单,因为默认情况下所有物理参数都将使用正确的值进行初始化。 let rock = SKSpriteNode(...)...
中克隆它,并给它正确的名称addRock
。不要忘记在开始时从场景中删除模型。这是通常的做法。答案 2 :(得分:0)
您还可以考虑按顺序使用一系列移动动作来控制岩石的行为。鉴于已经定义了移动动作,请按照您定义的顺序,依次进行[(掉落,隐藏,回到顶部,取消隐藏)]-永远重复。
只要岩石实际上不与任何东西相互作用,而仅用于背景/背景,则隐藏和隐藏它们是使它们坠落的效果的好方法。