在更新函数中使用 spriteKit 增加 spriteNode 的大小 (Swift)
Increasing the size of a spriteNode using spriteKit in update function (Swift)
我在动画、物理和诸如此类的东西方面遇到了麻烦。
无论如何,我想要做的是为一个球体创建一个脉冲效果,脉冲本身能够与屏幕上的元素发生碰撞,所以我创建了另一个我想要的 spriteNode(球体的子节点)连续缩放,而不依赖于触摸。
我读到在这些情况下最好不要使用 SKActions。
我的问题是:如何通过更新函数缩放或增加 spriteNode 的大小?
例如,该代码代表了我到目前为止如何进行运动。
import SpriteKit
import GameplayKit
class GameScene: SKScene {
var entities = [GKEntity]()
var graphs = [String: GKGraph]()
var movingSquareLv1 = SKSpriteNode()
var pulsingSphereLv2 = SKSpriteNode()
var lv2SpherePulse = SKSpriteNode()
var xVeloicty: CGFloat = 100
override func sceneDidLoad() {
movingSquareLv1 = self.childNode(withName: "movingSquare") as!SKSpriteNode
movingSquareLv1.physicsBody = SKPhysicsBody(rectangleOf: movingSquareLv1.size)
movingSquareLv1.physicsBody ? .affectedByGravity = false
pulsingSphereLv2 = self.childNode(withName: "pulsingSphere") as!SKSpriteNode
pulsingSphereLv2.physicsBody ? .affectedByGravity = false
lv2SpherePulse = pulsingSphereLv2.childNode(withName: "lv2SpherePulse") as!SKSpriteNode
lv2SpherePulse.physicsBody ? .affectedByGravity = false
}
func touchDown(atPoint pos: CGPoint) {
}
func touchMoved(toPoint pos: CGPoint) {
}
func touchUp(atPoint pos: CGPoint) {
}
override func touchesBegan(_ touches: Set < UITouch > , with event: UIEvent ? ) {
for t in touches {
self.touchDown(atPoint: t.location( in: self))
}
}
override func touchesMoved(_ touches: Set < UITouch > , with event: UIEvent ? ) {
for t in touches {
self.touchMoved(toPoint: t.location( in: self))
}
}
override func touchesEnded(_ touches: Set < UITouch > , with event: UIEvent ? ) {
for t in touches {
self.touchUp(atPoint: t.location( in: self))
}
}
override func touchesCancelled(_ touches: Set < UITouch > , with event: UIEvent ? ) {
for t in touches {
self.touchUp(atPoint: t.location( in: self))
}
}
override func update(_ currentTime: TimeInterval) {
rectMovement()
}
func rectMovement() {
if movingSquareLv1.frame.maxX >= self.size.width / 2 {
xVeloicty = -100
} else if movingSquareLv1.frame.minX <= -self.size.width / 2 {
xVeloicty = 100
}
let rate: CGFloat = 0.5
let relativeVelocity: CGVector = CGVector(dx: xVeloicty - movingSquareLv1.physicsBody!.velocity.dx, dy: 0)
movingSquareLv1.physicsBody!.velocity = CGVector(dx: movingSquareLv1.physicsBody!.velocity.dx + relativeVelocity.dx * rate, dy: 0)
}
}
这是由两个精灵组成的对象,我要处理的是最大的一个。
我不知道为什么无论你读到什么都说操作不合适,但如果你想从 update
明确地更改节点的大小,那么你可以设置它的缩放。
myNode.setScale(2.5) // 2.5x as big as normal
myNode.setScale(0.5) // half size
myNode.xScale = 1.5
myNode.yScale = myNode.xScale * 2 // Set x and y separately for non-uniform scaling
请参阅 SKNode
的 "Scaling and Rotation" 部分中的文档:
https://developer.apple.com/documentation/spritekit/sknode
谁告诉你不要使用 SKActions 的都错了。这正是你想要使用 SKAction 的时候,如果你有多个圆圈脉冲,你可以在所有圆圈上使用相同的动作。
您确实希望更新函数尽可能小。相信苹果的优化,因为他们比你更容易获得 API。
我在动画、物理和诸如此类的东西方面遇到了麻烦。
无论如何,我想要做的是为一个球体创建一个脉冲效果,脉冲本身能够与屏幕上的元素发生碰撞,所以我创建了另一个我想要的 spriteNode(球体的子节点)连续缩放,而不依赖于触摸。
我读到在这些情况下最好不要使用 SKActions。
我的问题是:如何通过更新函数缩放或增加 spriteNode 的大小?
例如,该代码代表了我到目前为止如何进行运动。
import SpriteKit
import GameplayKit
class GameScene: SKScene {
var entities = [GKEntity]()
var graphs = [String: GKGraph]()
var movingSquareLv1 = SKSpriteNode()
var pulsingSphereLv2 = SKSpriteNode()
var lv2SpherePulse = SKSpriteNode()
var xVeloicty: CGFloat = 100
override func sceneDidLoad() {
movingSquareLv1 = self.childNode(withName: "movingSquare") as!SKSpriteNode
movingSquareLv1.physicsBody = SKPhysicsBody(rectangleOf: movingSquareLv1.size)
movingSquareLv1.physicsBody ? .affectedByGravity = false
pulsingSphereLv2 = self.childNode(withName: "pulsingSphere") as!SKSpriteNode
pulsingSphereLv2.physicsBody ? .affectedByGravity = false
lv2SpherePulse = pulsingSphereLv2.childNode(withName: "lv2SpherePulse") as!SKSpriteNode
lv2SpherePulse.physicsBody ? .affectedByGravity = false
}
func touchDown(atPoint pos: CGPoint) {
}
func touchMoved(toPoint pos: CGPoint) {
}
func touchUp(atPoint pos: CGPoint) {
}
override func touchesBegan(_ touches: Set < UITouch > , with event: UIEvent ? ) {
for t in touches {
self.touchDown(atPoint: t.location( in: self))
}
}
override func touchesMoved(_ touches: Set < UITouch > , with event: UIEvent ? ) {
for t in touches {
self.touchMoved(toPoint: t.location( in: self))
}
}
override func touchesEnded(_ touches: Set < UITouch > , with event: UIEvent ? ) {
for t in touches {
self.touchUp(atPoint: t.location( in: self))
}
}
override func touchesCancelled(_ touches: Set < UITouch > , with event: UIEvent ? ) {
for t in touches {
self.touchUp(atPoint: t.location( in: self))
}
}
override func update(_ currentTime: TimeInterval) {
rectMovement()
}
func rectMovement() {
if movingSquareLv1.frame.maxX >= self.size.width / 2 {
xVeloicty = -100
} else if movingSquareLv1.frame.minX <= -self.size.width / 2 {
xVeloicty = 100
}
let rate: CGFloat = 0.5
let relativeVelocity: CGVector = CGVector(dx: xVeloicty - movingSquareLv1.physicsBody!.velocity.dx, dy: 0)
movingSquareLv1.physicsBody!.velocity = CGVector(dx: movingSquareLv1.physicsBody!.velocity.dx + relativeVelocity.dx * rate, dy: 0)
}
}
这是由两个精灵组成的对象,我要处理的是最大的一个。
我不知道为什么无论你读到什么都说操作不合适,但如果你想从 update
明确地更改节点的大小,那么你可以设置它的缩放。
myNode.setScale(2.5) // 2.5x as big as normal
myNode.setScale(0.5) // half size
myNode.xScale = 1.5
myNode.yScale = myNode.xScale * 2 // Set x and y separately for non-uniform scaling
请参阅 SKNode
的 "Scaling and Rotation" 部分中的文档:
https://developer.apple.com/documentation/spritekit/sknode
谁告诉你不要使用 SKActions 的都错了。这正是你想要使用 SKAction 的时候,如果你有多个圆圈脉冲,你可以在所有圆圈上使用相同的动作。
您确实希望更新函数尽可能小。相信苹果的优化,因为他们比你更容易获得 API。