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

Trying to get Physics Shape That Matches the Graphical Representation

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

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)    
            }           
        }   
    }
}

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

触摸处理(即 nodeAtPoint)不通过物理。这可能就是它应该的样子——如果你有一个碰撞面非常小的精灵,你可能不一定希望它很难触摸,你也可能希望能够触摸没有物理的节点。所以你的物理体不会影响 nodeAtPoint.

的行为

一个 API 可以让你为一个节点定义一个命中测试区域——它独立于节点的内容或物理——可能不是一个坏主意,但这样的事情目前不存在于雪碧套件。 They do take feature requests, though.

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

  • 如果您可以将触摸区域定义为路径(CGPathUIBezierPath/NSBezierPath),就像创建 SKShapeNode 或物理体一样使用 bodyWithPolygonFromPath:, you can hit-test against the path. See CGPathContainsPoint / containsPoint: / containsPoint: 作为您正在处理的路径类型(并确保首先转换为正确的局部节点坐标 space)。
  • 如果你想针对单个像素进行命中测试......那可能真的很慢,但理论上 iOS 中的新 SKMutableTexture class 8 / OX X v10.10 可以帮助你。没有说你必须使用 modifyPixelDataWithBlock: 回调来实际 更改 纹理数据......你可以在设置中使用它一次来获取你自己的纹理数据副本,然后编写您自己的命中测试代码来确定哪些 RGBA 值算作 "hit".