我想要实现的是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)
}
}
}
}
答案 0 :(得分:0)
物理实体及其形状用于物理 - 也就是说,用于模拟场景中精灵之间的碰撞等事物。
触摸处理(即nodeAtPoint
)没有通过物理学。这应该是应该的样子 - 如果你有一个具有非常小的碰撞表面的精灵,你可能不一定希望它难以触摸,你也可能希望能够触摸那些不在的节点&# 39;有物理学。所以你的物理身体不会影响nodeAtPoint
的行为。
一个允许您为节点定义命中测试区域的API - 它独立于节点的内容或物理 - 可能不是一个坏主意,但是这样的事情并不是一个很好的事情。 t目前存在于SpriteKit中。 They do take feature requests, though.
与此同时,细粒度的热门测试是您自己必须做的事情。至少有几种方法可以做到:
CGPath
或UIBezierPath
/ NSBezierPath
),就像使用{创建SKShapeNode
或物理主体一样{3}},你可以对路径进行测试。请参阅bodyWithPolygonFromPath:
/ CGPathContainsPoint
/ containsPoint:
了解您正在处理的路径类型(并确保首先转换为正确的本地节点坐标空间)。SKMutableTexture
类可以帮助您。不得说你必须使用containsPoint:
回调来实际更改纹理数据...你可以在设置中使用它一次来获得你自己的纹理数据副本,然后编写自己的命中测试代码,以确定哪些RGBA值被视为"命中"。