无法修改 didBeginContact 中的contact.bodyA
Posted
技术标签:
【中文标题】无法修改 didBeginContact 中的contact.bodyA【英文标题】:Can't modify contact.bodyA in didBeginContact 【发布时间】:2014-10-20 19:15:37 【问题描述】:我是 SpriteKit 和 Swift 的新手。花了太多时间尝试将位置/速度更改应用于 didBeginContact 中的主体,只是在 Apple 文档中读取联系人是只读的。修改碰撞中涉及的物体的好方法是什么?
struct PhysicsCategory
static let None: UInt32 = 0
static let All: UInt32 = UInt32.max
static let LeftWall: UInt32 = 0b1
static let Food: UInt32 = 0b10
override func didMoveToView(view: SKView)
for(var i = 0; i < 10; ++i)
var temp = SKSpriteNode(color: UIColor(red: 0.0, green: 0.7, blue: 0.0, alpha: 1.0), size: CGSizeMake(size, size))
temp.position.x = self.scene!.size.width/2.0
temp.position.y = self.scene!.size.height/2.0
temp.physicsBody = SKPhysicsBody(rectangleOfSize: temp.size)
temp.physicsBody!.categoryBitMask = PhysicsCategory.Food
temp.physicsBody!.contactTestBitMask = PhysicsCategory.LeftWall
temp.physicsBody!.collisionBitMask = PhysicsCategory.None
temp.physicsBody!.velocity.dx = self.randomBetweenNumbers(0.0, secondNum: 0.5) - 0.25
temp.physicsBody!.velocity.dy = self.randomBetweenNumbers(0.0, secondNum: 0.5) - 0.25
self.addChild(temp)
func didBeginContact(contact: SKPhysicsContact)
if (contact.bodyA.categoryBitMask & PhysicsCategory.Food != 0) && (contact.bodyB.categoryBitMask & PhysicsCategory.LeftWall != 0)
contact.bodyA!.velocity.dx = 0.0
println("\(contact.bodyA.velocity.dx)") //isn't 0.0
【问题讨论】:
说明你想做什么? 本质上,我想修改参与碰撞的物理物体的速度。 我要否定速度,所以“食物”会从“墙上”反弹。 也许你可以试试 SKFieldNode : developer.apple.com/library/ios/documentation/SpriteKit/…: 如果你想让Food节点从墙上反弹,设置collisionBitMask而不是contactTestBitMask。墙壁和食物位掩码都需要适当设置。 【参考方案1】:课外
let firstObjectCategory:UInt32 = 0x1 << 0
let secondObjectCategory:UInt32 = 0x1 << 1
var marker:Int= 0
在你的 DidMoveToView 中
node1.physicsBody?.categoryBitMask = firstObjectCategory
node1.physicsBody?.contactTestBitMask = secondObjectCategory
if marker=1
node1.velocity.dx = 0.0
else
node1.velocity.dx = what you want
node2.physicsBody?.categoryBitMask = secondObjectCategory
node2.physicsBody?.contactTestBitMask = firstObjectCategory
测试两个实体之间的接触:
func didBeginContact(contact: SKPhysicsContact!)
var firstBody: SKPhysicsBody
var secondBody: SKPhysicsBody
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
firstBody = contact.bodyA
secondBody = contact.bodyB
else
firstBody = contact.bodyB
secondBody = contact.bodyA
if ((firstBody.categoryBitMask & firstObjectCategory) != 0 && (secondBody.categoryBitMask & secondObjectCategory) != 0)
marker=1
希望对你有帮助
【讨论】:
抱歉,我应该更具体一些。我已经设置了类别,将它们设置到我的节点。我成功地检测到碰撞。问题是我无法修改通过contact参数传递给didBeginContact()的物理体。 你的屏幕上只有一个节点吗? 如果你的屏幕上只有 2 个physicsBody,你只需要设置一个标记。在你的节点属性中写:ìf marker=1node.velocity.dx = 0 else node.velocity.dx = whatYouWant
你的变量var marker:Int = 0
需要是全局的(类外)
没有。现在,我正在测试 10 个“食物”块和一个“墙”块的碰撞。我想没有办法修改 didBeginContact() 中的物理体。看起来会出现很多全局变量黑客攻击,谢谢。
好的,你只需要编辑与墙壁接触的精灵吗?以上是关于无法修改 didBeginContact 中的contact.bodyA的主要内容,如果未能解决你的问题,请参考以下文章
didBeginContact 委托方法未触发 ARKit 碰撞检测
如何在没有 SKTexture 的情况下更改 didBeginContact 中的 SKSpriteNode 大小和颜色?
在使用 Swift 的 SpriteKit 中的 didBeginContact(日志)中未检测到 contactTestBitMask
didBeginContact:(SKPhysicsContact *)联系人未调用