是否可以将物理体仅定位到 Sprite 的一部分?

Posted

技术标签:

【中文标题】是否可以将物理体仅定位到 Sprite 的一部分?【英文标题】:Is it possible to position physicsbody to only one part of the Sprite? 【发布时间】:2015-10-15 10:50:04 【问题描述】:

是否可以在精灵上放置物理实体?我只希望我的 sprite 节点的某个部分进行碰撞检测,而不是整个图像。

这是我的物理身体

physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: CGFloat(54.0), height: CGFloat(100.0)))

但我想将物理体放置在节点的顶部,它通常被放置在节点的中间。

【问题讨论】:

【参考方案1】:

您可以尝试创建一个与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)


【讨论】:

这实际上对我来说非常有效:) 因为我的图像物理体会根据核心运动加速.x 而变化。所以基于位置,我可以改变相对于我需要物理体的位置较大的精灵位置。我想对这个答案投赞成票,但目前还不足以做到这一点:(但非常感谢你的快速反应 rakeshbs 让我的一天压力减轻了很多。希望你今天过得愉快!雷切尔【参考方案2】:

作为 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,您将得到如下结果:

【讨论】:

感谢旋风的回复! rakeshbs 的答案最适合我,唯一的原因是我需要根据核心运动加速度.x 位置更改物理体的 x 和 y 位置。但我知道我的另一个项目中肯定会需要这个。希望您度过愉快的一天,再次感谢您抽出宝贵时间回答我的问题!雷切尔

以上是关于是否可以将物理体仅定位到 Sprite 的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Sprite Kit 中使用圆形(SKShapeNode)作为蒙版?

Sprite Kit 中的单个粒子和物理

移动端适配之sprite雪碧图背景定位

前端试题-什么是css sprite?优缺点?

移动端适配之雪碧图(sprite)背景图片定位

cocos源码分析--Sprite绘图原理