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

时间:2015-03-09 19:55:38

标签: swift skspritenode skphysicsbody

我想要实现的是Node将具有与PhysicsBody / texture相同的形状(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)    
            }           
        }   
    }
}

1 个答案:

答案 0 :(得分:0)

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

触摸处理(即nodeAtPoint)没有通过物理学。这应该是应该的样子 - 如果你有一个具有非常小的碰撞表面的精灵,你可能不一定希望它难以触摸,你也可能希望能够触摸那些不在的节点&# 39;有物理学。所以你的物理身体不会影响nodeAtPoint的行为。

一个允许您为节点定义命中测试区域的API - 它独立于节点的内容或物理 - 可能不是一个坏主意,但是这样的事情并不是一个很好的事情。 t目前存在于SpriteKit中。 They do take feature requests, though.

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

  • 如果您可以将触摸区域定义为路径(CGPathUIBezierPath / NSBezierPath),就像使用{创建SKShapeNode或物理主体一样{3}},你可以对路径进行测试。请参阅bodyWithPolygonFromPath: / CGPathContainsPoint / containsPoint:了解您正在处理的路径类型(并确保首先转换为正确的本地节点坐标空间)。
  • 如果您想针对单个像素进行测试......可能会非常慢,但理论上,iOS 8 / OX X v10.10中的新SKMutableTexture类可以帮助您。不得说你必须使用containsPoint:回调来实际更改纹理数据...你可以在设置中使用它一次来获得你自己的纹理数据副本,然后编写自己的命中测试代码,以确定哪些RGBA值被视为"命中"。