我在父节点B中有一个节点A。
我使用节点B上的setScale来给出放大的错觉,但是当我这样做的时候,节点A和它的兄弟姐妹没有期望的物理体。
尽管A看起来越来越小,但它的物理体却保持同样的大小。这导致了古怪的行为。
我怎么能“放大”而仍然有理性的物理?
发布于 2015-07-07 07:33:39
SKCameraNode
(在iOS9中添加)听起来非常适合您的场景。与更改场景中每个节点的规模相反,您将只更改摄像机节点的规模。
首先,您需要向场景的层次结构中添加一个SKCameraNode
(这都可以在Sprite编辑器中完成)。
override func didMoveToView(view: SKView) {
super.didMoveToView(view)
let camera = SKCameraNode()
camera.position = CGPoint(x: size.width / 2, y: size.height / 2)
self.addChild(camera)
self.camera = camera
}
其次,由于SKCameraNode
是一个节点,所以可以将SKActions
应用于它。对于放大效果,您可以:
guard let camera = camera else { return }
let scale = SKAction.scaleBy(2, duration: 5)
camera.runAction(scale)
要获得更多信息,请查看WWDC 2015谈话:雪碧套件中的新内容。
发布于 2015-07-07 04:52:04
SKPhysicsBody无法缩放。作为一种黑客,你可以摧毁当前的物理体,并增加一个小的,因为你的规模上升或下降,但不幸的是,这不是一个非常有效的解决方案。
发布于 2015-07-07 12:57:21
一个简单的例子,它显示了当一个物理体的父节点被缩放时,它的尺度/行为是适当的。点击以添加精灵到现场。
class GameScene: SKScene {
var toggle = false
var node = SKNode()
override func didMoveToView(view: SKView) {
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: view.frame)
scaleMode = .ResizeFill
view.showsPhysics = true
addChild(node)
let shrink = SKAction.scaleBy(0.25, duration: 5)
let grow = SKAction.scaleBy(4.0, duration: 5)
let action = SKAction.sequence([shrink,grow])
node.runAction(SKAction.repeatActionForever(action))
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
/* Called when a touch begins */
for touch in (touches as! Set<UITouch>) {
let location = touch.locationInNode(node)
let sprite = SKSpriteNode(imageNamed:"Spaceship")
if (toggle) {
sprite.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size.width/2.0)
}
else {
sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
}
sprite.xScale = 0.125
sprite.yScale = 0.125
sprite.position = location
node.addChild(sprite)
toggle = !toggle
}
}
}
https://stackoverflow.com/questions/31258363
复制