是否可以将 physicsbody 仅定位到 Sprite 的一部分?
Is it possible to position physicsbody to only one part of the Sprite?
是否可以在 sprite 上放置物理 body?我只希望我的精灵节点的某个部分有碰撞检测,而不是整个图像。
这是我的物理学body
physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: CGFloat(54.0), height: CGFloat(100.0)))
但我想将物理 body 放置在节点的顶部,它通常被放置在节点的中间。
您可以尝试创建一个与 SKPhysicsBody
大小相同的较小的 SKSpriteNode
,并将较大的 SKSpriteNode
作为子项添加到较小的 SKSpriteNode
。根据需要更改较大的位置。例如
override func didMoveToView(view: SKView) {
let smallerSprite = SKSpriteNode(color: UIColor.redColor(), size: CGSizeMake(30, 30))
smallerSprite.physicsBody = SKPhysicsBody(rectangleOfSize: smallerSprite.size)
smallerSprite.position = CGPointMake(100, 400)
self.addChild(smallerSprite)
let largerSprite = SKSpriteNode(color: UIColor(white: 0.5, alpha: 0.5), size: CGSizeMake(100, 100))
largerSprite.position = CGPointMake(-10, -10)
smallerSprite.addChild(largerSprite)
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
}
作为对 rakesh 答案的补充...获得相同结果的另一种方法是使用
+ bodyWithRectangleOfSize:center: method。像这样:
override func didMoveToView(view: SKView) {
let sprite = SKSpriteNode(color: SKColor.whiteColor(), size: CGSize(width: 100.0, height: 100.0))
//I assume that you have initialized view and scene properly. If so, this will position a sprite in the middle of the screen.
sprite.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
var physicsBodySize:CGSize = CGSize(width: sprite.size.width, height: 30.0) //Create a size here. You can play with height parameter.
sprite.physicsBody =
SKPhysicsBody(rectangleOfSize: physicsBodySize, center: CGPoint(x: 0.0, y: sprite.size.height / 2.0 - physicsBodySize.height / 2.0))
//Not needed, just set to restrict that sprite can't off screen
sprite.physicsBody?.affectedByGravity = false
self .addChild(sprite)
}
结果:
如果你尝试将物理体的高度更改为 10.0,你将得到如下结果:
是否可以在 sprite 上放置物理 body?我只希望我的精灵节点的某个部分有碰撞检测,而不是整个图像。
这是我的物理学body
physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: CGFloat(54.0), height: CGFloat(100.0)))
但我想将物理 body 放置在节点的顶部,它通常被放置在节点的中间。
您可以尝试创建一个与 SKPhysicsBody
大小相同的较小的 SKSpriteNode
,并将较大的 SKSpriteNode
作为子项添加到较小的 SKSpriteNode
。根据需要更改较大的位置。例如
override func didMoveToView(view: SKView) {
let smallerSprite = SKSpriteNode(color: UIColor.redColor(), size: CGSizeMake(30, 30))
smallerSprite.physicsBody = SKPhysicsBody(rectangleOfSize: smallerSprite.size)
smallerSprite.position = CGPointMake(100, 400)
self.addChild(smallerSprite)
let largerSprite = SKSpriteNode(color: UIColor(white: 0.5, alpha: 0.5), size: CGSizeMake(100, 100))
largerSprite.position = CGPointMake(-10, -10)
smallerSprite.addChild(largerSprite)
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
}
作为对 rakesh 答案的补充...获得相同结果的另一种方法是使用 + bodyWithRectangleOfSize:center: method。像这样:
override func didMoveToView(view: SKView) {
let sprite = SKSpriteNode(color: SKColor.whiteColor(), size: CGSize(width: 100.0, height: 100.0))
//I assume that you have initialized view and scene properly. If so, this will position a sprite in the middle of the screen.
sprite.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
var physicsBodySize:CGSize = CGSize(width: sprite.size.width, height: 30.0) //Create a size here. You can play with height parameter.
sprite.physicsBody =
SKPhysicsBody(rectangleOfSize: physicsBodySize, center: CGPoint(x: 0.0, y: sprite.size.height / 2.0 - physicsBodySize.height / 2.0))
//Not needed, just set to restrict that sprite can't off screen
sprite.physicsBody?.affectedByGravity = false
self .addChild(sprite)
}
结果:
如果你尝试将物理体的高度更改为 10.0,你将得到如下结果: