【问题标题】:Swift | Ignore transparent parts of sprite when detecting collisions?斯威夫特 |检测碰撞时忽略精灵的透明部分?
【发布时间】:2015-04-29 08:19:54
【问题描述】:

我想检测除了透明部分之外的精灵每个部分的碰撞。我找到了 C 的解决方案,但我不知道如何快速完成。

这是 Obj-C 解决方案: sprite kit collisions: ignore transparency?

有人知道吗?

编辑:

这是我构建形状的函数代码。我不确定如何将 spriteName.physicsBody 设置为另一个用户在下面提供的答案。

func addTriangles() {


    center = SKSpriteNode(imageNamed:"images/center.png")
    center.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
    center.zPosition = -1
    center.physicsBody = init!(texture centerTexture: SKTexture!, size 1.0: CGSize) -> SKPhysicsBody?
    center.physicsBody?.dynamic = false
    center.physicsBody?.affectedByGravity = false
    center.physicsBody?.categoryBitMask = PhysicsCategory.Triangle
    self.addChild(center)
    spin = clockwise
    center.runAction(SKAction.repeatActionForever(spin))


}

【问题讨论】:

  • Apple documentation 中有 Swift 示例。
  • 你在说:init!(纹理纹理:SKTexture!,尺寸大小:CGSize)-> SKPhysicsBody?我一直在试图弄清楚如何使用它。
  • 嗯,你做同样的事情,但在迅速......?没有 API 区别,你只需用 swift 重写代码。

标签: swift transparency collision transparent


【解决方案1】:

其实你可以用

init!(texture texture: SKTexture!, size size: CGSize) -> SKPhysicsBody? 

使用精灵纹理的 Alpha 通道设置碰撞体

但是,不建议这样做,因为模拟复杂形状的物理行为会花费很多。

如果您有一个形状复杂的精灵,请尝试绘制另一个更简单的形状并将其纹理用作您的物理体。

【讨论】:

  • 是否应该放在我的函数中来构建形状,是否应该设置为 spriteName.physics 主体?我将在我的原始帖子中添加功能代码。
  • @StudioSevenDesigns 将其设置为 spriteName.physics body
【解决方案2】:

为物理体绘制一个单独的更简化的图像绝对是一个好主意(从颜色和几何的角度来看),至于代码,它与您需要的非常接近:

let birdMask: UInt32 = 0x1 << 0
let pipeMask: UInt32 = 0x1 << 1
//...

pipeImage = SKSpriteNode(imageNamed: "realImage")
//... size and position

let maskTexture = SKSpriteNode(imageNamed: mask)
maskTexture.size = pipeImage!.size // size of texture w/ real imageNamed

pipeImage!.physicsBody?.usesPreciseCollisionDetection = true
pipeImage!.physicsBody = SKPhysicsBody(texture: maskTexture.texture!, size: size)        
pipeImage!.physicsBody?.affectedByGravity = false // disable falling down...
pipeImage!.physicsBody?.allowsRotation = false
pipeImage!.physicsBody?.isDynamic = true
pipeImage!.physicsBody?.friction = 0
pipeImage!.physicsBody?.categoryBitMask = pipeMask
pipeImage!.physicsBody?.collisionBitMask = birdMask | pipeMask
pipeImage!.physicsBody?.contactTestBitMask = birdMask | pipeMask

这里是 full guide how 来实现它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2013-05-04
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多