尝试获得与图形表示相匹配的物理形状
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.
与此同时,细粒度的命中测试是您必须自己做的事情。至少有几种方法可以做到:
- 如果您可以将触摸区域定义为路径(
CGPath
或 UIBezierPath
/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".
我试图实现的是节点的形状与 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.
与此同时,细粒度的命中测试是您必须自己做的事情。至少有几种方法可以做到:
- 如果您可以将触摸区域定义为路径(
CGPath
或UIBezierPath
/NSBezierPath
),就像创建SKShapeNode
或物理体一样使用bodyWithPolygonFromPath:
, you can hit-test against the path. SeeCGPathContainsPoint
/containsPoint:
/containsPoint:
作为您正在处理的路径类型(并确保首先转换为正确的局部节点坐标 space)。 - 如果你想针对单个像素进行命中测试......那可能真的很慢,但理论上 iOS 中的新
SKMutableTexture
class 8 / OX X v10.10 可以帮助你。没有说你必须使用modifyPixelDataWithBlock:
回调来实际 更改 纹理数据......你可以在设置中使用它一次来获取你自己的纹理数据副本,然后编写您自己的命中测试代码来确定哪些 RGBA 值算作 "hit".