来自纹理 swift SKphysicsbody 的碰撞问题

Posted

技术标签:

【中文标题】来自纹理 swift SKphysicsbody 的碰撞问题【英文标题】:Collision problem from texture swift SKphysicsbody 【发布时间】:2019-09-29 02:00:22 【问题描述】:

我正在尝试为 2d 游戏屋创建碰撞,例如墙壁、家具等。但是当我尝试从纹理创建物理体时,我只会在一面墙上发生碰撞。

我尝试在编辑器和代码中设置冲突。

let colhouse = self.childNode(withName: "Umatilla")!
let texture = SKTexture(imageNamed: "warehouse-collisions")
colhouse.physicsBody = SKPhysicsBody(texture: texture, size: texture.size())

我希望它在整个纹理上有碰撞,背景是透明的,所以有些物体没有接触或连接:

【问题讨论】:

如果外部边框代表你的身体,那么你就有问题了。身体需要是连续的。 【参考方案1】:

使用SKPhysicsBody(texture: texture, size: texture.size()) 函数无法尝试从具有非连续体的纹理创建单个物理体。

要解决这个问题,请在编辑器中创建节点,将它们放置在您的碰撞区域上(仅供参考)。仅此一项就可以解决问题,但是如果您开始创建大地图。这会导致 xcode 出现滞后问题。为了解决这个问题,我使用了宽度和高度以及位置。然后在代码中创建边界:

//okay so this is the first thing we have to run, setup the collisions
func setupCollisions()
    //first we need the data
    let data = [
        SKPhysicsBody(rectangleOf: CGSize(width: 7.096, height: 180.423), center: CGPoint(x: 215.266, y: -5.504)),
        SKPhysicsBody(rectangleOf: CGSize(width: 429.879, height: 6.631), center: CGPoint(x: -3.222, y: -92.34)),
        SKPhysicsBody(rectangleOf: CGSize(width: 7.096, height: 173.735), center: CGPoint(x: -214.614, y: -2.161)),
        SKPhysicsBody(rectangleOf: CGSize(width: 43.492, height: 144.075), center: CGPoint(x: -189.318, y: -16.986)),
        SKPhysicsBody(rectangleOf: CGSize(width: 133.314, height: 45.883), center: CGPoint(x: -100.913, y: -66.08)),
        SKPhysicsBody(rectangleOf: CGSize(width: 58.041, height: 6.642), center: CGPoint(x: -182.044, y: 81.377)),
        SKPhysicsBody(rectangleOf: CGSize(width: 301.388, height: 6.662), center: CGPoint(x: 61.022, y: 81.386)),
        SKPhysicsBody(rectangleOf: CGSize(width: 89.409, height: 93.006), center: CGPoint(x: 93.072, y: -12.631))
    ]
    //now lets create a single physicsbody from all the data
    let physicsbody1 = SKPhysicsBody(bodies: data)


    physicsbody1.isDynamic = false
    self.physicsBody = physicsbody1

一旦你这样做了,从编辑器中删除碰撞节点(墙壁、沙发、杂项等),因为我们现在在代码中创建它们。只要确保尽快或在需要时运行您的自定义 setupCollisions() 函数即可。

【讨论】:

以上是关于来自纹理 swift SKphysicsbody 的碰撞问题的主要内容,如果未能解决你的问题,请参考以下文章

SKPhysicsBody碰撞不起作用

Swift - 使用纹理数组更改 SKSpriteNode 纹理

Swift – Balloons.playground – 无法将“纹理”添加到时间线

无法在 Swift 操场上加载纹理图集?

停止 SKSpriteNode 离开视图 (Swift)

在 swift Playground 中创建纹理动画 [关闭]