【发布时间】:2017-05-26 10:23:06
【问题描述】:
我在didBegin(contact:) 中有一个 SpriteKit 物理接触。我为想要移出屏幕的 Dot 对象的实例抓取物理体,但是当我尝试像这样改变它的位置时,什么也没有发生:
第一种方法
/* In GameScene.swift */
func didBegin(_ contact: SKPhysicsContact) {
let dotBody: SKPhysicsBody
if contact.bodyA.categoryBitMask == 0b1 {
dotBody = contact.bodyB
} else {
dotBody = contact.bodyA
}
if let dot = dotBody.node as? Dot {
dot.position.x = 10000
}
}
但是,如果我改为调用 Dot 类中的方法,并传入该主体,则位置会正确设置:
第二种方法
/* In GameScene.swift */
func didBegin(_ contact: SKPhysicsContact) {
let dotBody: SKPhysicsBody
if contact.bodyA.categoryBitMask == 0b1 {
dotBody = contact.bodyB
} else {
dotBody = contact.bodyA
}
if let dot = dotBody.node as? Dot {
dot.move()
}
}
这是 Dot 类:
import SpriteKit
class Dot : SKSpriteNode {
let dotTex = SKTexture(imageNamed: "dot")
init() {
super.init(texture: dotTex, color: .clear, size: dotTex.size())
self.physicsBody = SKPhysicsBody(circleOfRadius: size.width / 2)
self.physicsBody?.categoryBitMask = 0b1 << 1
self.physicsBody?.contactTestBitMask = 0b1
}
func move() {
let reset = SKAction.run {
self.position.x = 10000
}
self.run(reset)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
谁能解释为什么第二种方法中的位置变化有效,但在我的第一种方法中却不起作用?
【问题讨论】:
-
@Steve Ives - 所有动作都显示在代码中。在第一种方法中,我尝试使用
dot.position.x = 1000直接从我的游戏场景中移动节点。我没有以这种方法运行任何 SKActions。第二种方法与第一种基本相同,只是我使用 SKAction 运行dot.position.x = 1000行并在单独的 Dot 类中执行此操作,而不是在游戏场景类中。 -
我有一个固定节点,我用
touchesBegan设置了它的位置。所以玩家触摸屏幕上的一个点节点,然后他们的玩家精灵节点直接出现在点节点的顶部。那是两个身体接触的那一刻。 -
是的,一切都正确连接以防碰撞。正如您所说,点应该移出屏幕,但它保持在原位并且不会移动。但是,第二种方法按预期工作。我怀疑这与
didBegin(contact:)中的事实有关,我正在使用 SKPhysicsBody 并将其转换为 Dot 对象,然后尝试直接设置其位置。由于我在场景中实例化了许多点对象,我怀疑尝试投射物理体并没有让我获得对我需要的点对象的引用。但似乎它应该可以工作,并且编译器没有给出任何错误。 -
@Steve Ives - 我再次测试了玩家和点节点的碰撞位掩码设置为 0,但得到了相同的行为。你是对的铸造......我认为问题一定出在那儿。可能是由于我的点对象是如何被实例化的,而我只是没有在我的游戏场景中得到正确的参考。如果不共享整个项目,可能很难分析。我试图保持这个简洁,哈哈
-
有几个场景文件所以我把代码剪掉了,把项目放到了github上:github.com/prinomen/dotTest1
标签: swift sprite-kit skphysicsbody skphysicscontact