Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 斯威夫特|在检测碰撞时忽略精灵的透明部分?_Swift_Transparency_Transparent_Ignore_Collision - Fatal编程技术网

Swift 斯威夫特|在检测碰撞时忽略精灵的透明部分?

Swift 斯威夫特|在检测碰撞时忽略精灵的透明部分?,swift,transparency,transparent,ignore,collision,Swift,Transparency,Transparent,Ignore,Collision,我想检测精灵每个部分的碰撞,除了透明部分。我找到了C语言的解决方案,但我不知道如何在swift中实现 以下是Obj-C解决方案: 有人知道吗 编辑: 这是我构建形状的函数代码。我不确定如何将spriteName.physicsBody设置为其他用户提供的以下答案 func addTriangles() { center = SKSpriteNode(imageNamed:"images/center.png") center.position = CGPoint(x: CG

我想检测精灵每个部分的碰撞,除了透明部分。我找到了C语言的解决方案,但我不知道如何在swift中实现

以下是Obj-C解决方案:

有人知道吗

编辑:

这是我构建形状的函数代码。我不确定如何将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))


}
你实际上可以使用

init!(texture texture: SKTexture!, size size: CGSize) -> SKPhysicsBody? 
使用精灵纹理的alpha通道设置碰撞体

但是,不建议这样做,因为模拟复杂形状的物理行为需要花费大量成本


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

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

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

让birdMask:UInt32=0x1在中有Swift示例。你是说:init!(纹理:SKTexture!,大小:CGSize)->SKPhysicsBody?我一直在想如何使用它。嗯,你也做同样的事情,但是用swift。。。?没有API的区别,您只需用swift重写代码。它是否应该放在我构建形状的函数中,是否应该设置为spriteName.physics body?我将把函数代码添加到我原来的帖子中。@StudioSevenDesigns将其设置为spriteName.physics body