如何更改此数组以将物理体赋予每个单独的节点(位掩码)?
Posted
技术标签:
【中文标题】如何更改此数组以将物理体赋予每个单独的节点(位掩码)?【英文标题】:How to change this array to give physics bodies to each individual node(bit masks)? 【发布时间】:2016-01-19 01:54:27 【问题描述】:我的屏幕顶部有骰子掉下来。有五种不同的面孔,它们都是随机生成的,如下所示:
var imageNames = ["Dice", "Dice2", "Dice3", "Dice4"]
let imageIndex=Int(arc4random_uniform(UInt32(imageNames.count)))
let die=SKSpriteNode(imageNamed: imageNames[imageIndex])
die.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(45, 45))
die.physicsBody?.dynamic = true
die.physicsBody?.affectedByGravity = false
let positions = [
CGPointMake(150, 600),
CGPointMake(300, 600),
CGPointMake(100, 600),
]
let randomPositionIndexs = Int(arc4random_uniform(UInt32(positions.count)))
die.position = positions[randomPositionIndexs]
die.size = CGSizeMake(45, 45)
die.runAction(
SKAction.moveByX(0, y: -900,
duration: NSTimeInterval(10.8)))
addChild(die)
所以我的问题是,有没有办法让节点仍然随机生成,但是每个节点都被自己调用,所以我可以唯一地识别每个节点?先感谢您。
【问题讨论】:
【参考方案1】:首先,在[0, diceCount-1]中生成一个随机数:
let diceCount = 4
let index=Int(arc4random_uniform(UInt32(diceCount)))
接下来,使用字符串插值来构造骰子的文件名(即 Dice1、Dice2、...)
let die = SKSpriteNode(imageNamed: "Dice\(index+1)")
并创建和配置物理体
die.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(45, 45))
die.physicsBody?.dynamic = true
die.physicsBody?.affectedByGravity = false
最后,根据随机数(0 - diceCount-1)设置类别位掩码。使用index
和按位左移运算符计算对应的位值(即1、2、4、...)
die.physicsBody?.categoryBitMask = UInt32(0x1 << index)
还有一件事......
die.physicsBody?.contactTestBitMask = UInt32(0x1 << index)
【讨论】:
好吧,所以我对类别位掩码有点困惑。这如何区分每个节点?我需要每一个单独与底部的骰子发生碰撞(一个与一个碰撞,两个与两个碰撞,等等) 是的,但我仍然对它们都是独立的位掩码感到困惑 DIce 1 的位掩码为 1,Dice 2 的位掩码为 2,Dice 3 的位掩码为 4,依此类推。您可以使用它来唯一标识每个 dice 类型。添加它们被配置为与相同类型的相同骰子碰撞。 那是自动调用的吗? 自动调用什么?以上是关于如何更改此数组以将物理体赋予每个单独的节点(位掩码)?的主要内容,如果未能解决你的问题,请参考以下文章