Swift 尝试获得与图形表示匹配的物理形状

Swift 尝试获得与图形表示匹配的物理形状,swift,skspritenode,skphysicsbody,Swift,Skspritenode,Skphysicsbody,我试图实现的是,节点将具有与PhysicsBody/纹理相同的形状(fire具有复杂的形状),然后我尝试仅使fireImage可触摸。到目前为止,当我触摸屏幕上fireImage的外部时,它仍然会发出声音。似乎我正在触摸方形节点,但我只想触摸精灵/纹理。 谢谢你的帮助。 代码如下: import SpriteKit import AVFoundation private var backgroundMusicPlayer: AVAudioPlayer! class GameScene2: S

我试图实现的是,节点将具有与PhysicsBody/纹理相同的形状(fire具有复杂的形状),然后我尝试仅使fireImage可触摸。到目前为止,当我触摸屏幕上fireImage的外部时,它仍然会发出声音。似乎我正在触摸方形节点,但我只想触摸精灵/纹理。 谢谢你的帮助。 代码如下:

import SpriteKit
import AVFoundation

private var backgroundMusicPlayer: AVAudioPlayer!

class GameScene2: SKScene {

    var wait1 = SKAction.waitForDuration(1)

    override func didMoveToView(view: SKView) {      
        setUpScenery()
    }



    private func setUpScenery() { 
        //I'm creating a Fire Object here and trying to set its Node a physicsBody/texture shape: 
        let fireLayerTexture = SKTexture(imageNamed: fireImage)
        let fireLayer = SKSpriteNode(texture: fireLayerTexture)

        fireLayer.anchorPoint = CGPointMake(1, 0)
        fireLayer.position = CGPointMake(size.width, 0)
        fireLayer.zPosition = Layer.Z4st

        var firedown = SKAction.moveToY(-200, duration: 0)
        var fireup1 = SKAction.moveToY(10, duration: 0.8)
        var fireup2 = SKAction.moveToY(0, duration: 0.2)

        fireLayer.physicsBody = SKPhysicsBody(texture: fireLayerTexture, size: fireLayer.texture!.size())
        fireLayer.physicsBody!.affectedByGravity = false

        fireLayer.name = "fireNode"

        fireLayer.runAction(SKAction.sequence([firedown, wait1, fireup1, fireup2]))

        addChild(fireLayer)

    }

    //Here, I'm calling a Node I want to touch. I assume that it has a shape of a PhysicsBody/texture:
    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        for touch: AnyObject in touches {
        let touch = touches.anyObject() as UITouch

        let touchLocation = touch.locationInNode(self)
        let node: SKNode = nodeAtPoint(touchLocation)

            if node.name == "fireNode" {

                var playguitar = SKAction.playSoundFileNamed("fire.wav", waitForCompletion: true)
                node.runAction(playguitar)    
            }           
        }   
    }
}

物理实体及其形状是用于物理的,也就是说,用于模拟场景中精灵之间的碰撞等情况

触摸处理(即,
节点
)不经过物理过程。这可能是它应该的方式-如果你有一个具有非常小的碰撞表面的精灵,你可能不一定希望它难以触摸,你也可能希望能够触摸到没有物理的节点。因此,您的物理实体不会影响
节点的行为

一个API可以让你为一个节点定义一个命中测试区域——它与节点的内容或物理无关——这可能不是一个坏主意,但SpriteKit中目前还没有这样的东西

与此同时,细粒度命中测试是您必须自己做的事情。至少有两种方法可以做到这一点:

  • 如果您可以将触摸区域定义为路径(
    CGPath
    UIBezierPath
    /
    NSBezierPath
    ),就像创建
    SKShapeNode
    或使用物理体一样,您可以点击路径测试。有关要处理的路径类型,请参见//并确保首先转换为正确的局部节点坐标空间
  • 如果您想对单个像素进行测试。。。这可能会很慢,但理论上,ios8/oxxv10.10中新的
    SKMutableTexture
    类可以帮助您。没有说你必须使用回调来实际更改纹理数据。。。您可以在设置中使用它一次获得自己的纹理数据副本,然后编写自己的命中测试代码,以确定哪些RGBA值算作“命中”

我花了整整一天的时间才把所有CGPath的东西都涂成绿色,但我最终还是用addCurveToPoint愉快地“画”出了火!!!谢谢你的建议。