为了使您的代码按您的意愿工作,您需要:
将 stoneTrigger 添加到属于场景树的 SKNode,就像您对 heroB 所做的那样
-
移动以下代码
if CGRectIntersectsRect(heroRect, stoneRect){
hittingTrigger()
}
在更新方法中,实际上你想检查每一帧的碰撞。 (为了更优雅的碰撞检测,您应该使用 SpriteKit 物理引擎)。
-
使用适当的 SKSpriteNode 初始化器,如果你不想使用纹理,你应该使用它
SKSpriteNode(color: UIColor.grayColor(), size: CGSizeMake(32, 40))
我准备了一个简单的 GameScene 来做(我猜)你想要的:
import SpriteKit
class GameScene: SKScene {
private let heroB = SKSpriteNode(color: UIColor.grayColor(), size: CGSizeMake(32, 40))
private let stoneTrigger = SKSpriteNode(color: UIColor.grayColor(), size: CGSizeMake(32, 40))
override func didMoveToView(view: SKView) {
/* Setup your scene here */
let moveRight = SKAction.moveByX(200, y: 0, duration: 10)
let moveLeft = SKAction.moveByX(-200, y: 0, duration: 10)
heroB.position = CGPointMake(self.size.width / 2, self.size.height / 2)
heroB.runAction(SKAction.repeatActionForever(moveRight))
heroB.zPosition = 20
self.addChild(heroB)
stoneTrigger.runAction(SKAction.repeatActionForever(moveLeft))
stoneTrigger.zPosition = 20
stoneTrigger.position = CGPointMake(self.size.width / 2 + 200, self.size.height / 2)
self.addChild(stoneTrigger)
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
if CGRectIntersectsRect(heroB.frame, stoneTrigger.frame){
hittingTrigger()
}
}
private func hittingTrigger() {
heroB.removeFromParent()
println("Collision!!")
// stoneGround.removeFromParent()
// yellowStripes.removeFromParent()
}
}
更新
查看我的代码有一些我不喜欢的地方。 2 个实例属性 heroB 和 stoneTrigger 会保留相关的 SKSpriteNode,即使在不需要时也是如此。
事实上,即使 heroB 从 GameScene 中移除,它仍然在内存中分配。鉴于此示例的简单性,这没什么大不了的,但可以肯定这不是最佳实践。我修改了我的代码以解决这个问题。这里是:
import SpriteKit
class GameScene: SKScene {
private weak var heroB : SKSpriteNode?
private weak var stoneTrigger : SKSpriteNode?
override func didMoveToView(view: SKView) {
/* Setup your scene here */
let moveRight = SKAction.moveByX(200, y: 0, duration: 10)
let moveLeft = SKAction.moveByX(-200, y: 0, duration: 10)
let heroB = SKSpriteNode(color: UIColor.grayColor(), size: CGSizeMake(32, 40))
heroB.position = CGPointMake(self.size.width / 2, self.size.height / 2)
heroB.runAction(SKAction.repeatActionForever(moveRight))
heroB.zPosition = 20
self.addChild(heroB)
self.heroB = heroB
let stoneTrigger = SKSpriteNode(color: UIColor.grayColor(), size: CGSizeMake(32, 40))
stoneTrigger.runAction(SKAction.repeatActionForever(moveLeft))
stoneTrigger.zPosition = 20
stoneTrigger.position = CGPointMake(self.size.width / 2 + 200, self.size.height / 2)
self.addChild(stoneTrigger)
self.stoneTrigger = stoneTrigger
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
if let heroB = heroB {
if let stoneTrigger = stoneTrigger {
if CGRectIntersectsRect(heroB.frame, stoneTrigger.frame){
hittingTrigger()
}
}
}
}
private func hittingTrigger() {
if let heroB = heroB {
heroB.removeFromParent()
println("Collision!!")
// stoneGround.removeFromParent()
// yellowStripes.removeFromParent()
}
}
}