Swift 保持水平的 SpriteKit 马里奥风格旋转平台
Swift SpriteKit Mario style rotating platform that stays horizontal
我正在尝试创建一个保持水平的马里奥风格旋转平台。
到目前为止我所做的是创建一个简单的 class 用于测试目的。
class PlatformRound: SKNode {
let platform: Platform
// MARK: - Init
init(barSize: CGSize, color: SKColor, pos: CGPoint) {
/// Base
let base = SKShapeNode(circleOfRadius: 6)
//base.name = Platform.Name.normal
base.fillColor = SKColor.darkGrayColor()
base.strokeColor = base.fillColor
base.position = pos
let rotatingAction = SKAction.rotateByAngle(CGFloat(-M_PI), duration: 8)
base.runAction(SKAction.repeatActionForever(rotatingAction))
/// Bar
let bar = Platform(size: barSize, color: color, pos: CGPointMake(0, 0 - (barSize.height / 2)), ofType: .Normal)
bar.zPosition = -200
/// Platform that supposed to stay horizontal
let platformSize = CGSizeMake(40, GameplayConfig.World.platformHeight)
let platformPos = CGPointMake(0, 0 - (bar.size.height / 2))
platform = Platform(size: platformSize, color: color, pos: platformPos, ofType: .Normal)
super.init()
addChild(base)
base.addChild(bar)
bar.addChild(platform)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
我正在创建一个可以旋转的 roundBase。然后,我创建了一个从底部向下的栏,将其添加到基础节点。最后,我创建了应该始终保持水平的平台。
我正在使用另一个 Platform subclass 来创建栏和平台,但它们与这个问题无关。
如何让平台保持水平。我尝试了以下方法,但没有用。
1) 在我的 gameScene 更新中,我不断更新平台位置或 zRotation
platformRound.platform.zRotation = ...
2) 创建一个 zRotation 属性,在添加平台后设置它,然后使用它 属性 不断更新 zRotation。
3) 尝试使用 physicsJoints
我确定我缺少一种简单的方法。如果有任何帮助,我将不胜感激。
这应该有效:
class GameScene: SKScene{
override func didMoveToView(view: SKView) {
backgroundColor = .blackColor()
let centerSprite = SKSpriteNode(color: .whiteColor(), size: CGSize(width: 10, height: 10))
centerSprite.zPosition = 3
let platform = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 70, height: 20))
platform.zPosition = 2
platform.name = "platform"
let container = SKNode()
container.position = CGPoint(x: frame.midX, y: frame.midY)
container.addChild(centerSprite) //Just for debugging
container.addChild(platform)
let radius = 120
let chain = SKSpriteNode(color: .grayColor(), size: CGSize(width: 3, height: radius))
chain.position = CGPoint(x: 0, y: radius/2)
container.addChild(chain)
platform.position = CGPoint(x: 0, y: radius)
let rotatingAction = SKAction.rotateByAngle(CGFloat(-M_PI), duration: 8)
container.runAction(SKAction.repeatActionForever(rotatingAction), withKey: "rotating")
addChild(container)
}
override func didEvaluateActions() {
self.enumerateChildNodesWithName("//platform") { node,stop in
if let parent = node.parent{
node.zRotation = -parent.zRotation
}
}
}
}
我所做的是,我已将平台节点添加到容器节点中并将旋转应用于该容器。后来,在 didEvaluateActions
中,我调整了平台的旋转(使其父级的 zRotation 具有负值)。就是这样。
这是我看到的结果:
需要进行调整,否则平台最终将与其父级一起旋转(注意白色的中心精灵如何与容器节点一起旋转)。
我正在尝试创建一个保持水平的马里奥风格旋转平台。
到目前为止我所做的是创建一个简单的 class 用于测试目的。
class PlatformRound: SKNode {
let platform: Platform
// MARK: - Init
init(barSize: CGSize, color: SKColor, pos: CGPoint) {
/// Base
let base = SKShapeNode(circleOfRadius: 6)
//base.name = Platform.Name.normal
base.fillColor = SKColor.darkGrayColor()
base.strokeColor = base.fillColor
base.position = pos
let rotatingAction = SKAction.rotateByAngle(CGFloat(-M_PI), duration: 8)
base.runAction(SKAction.repeatActionForever(rotatingAction))
/// Bar
let bar = Platform(size: barSize, color: color, pos: CGPointMake(0, 0 - (barSize.height / 2)), ofType: .Normal)
bar.zPosition = -200
/// Platform that supposed to stay horizontal
let platformSize = CGSizeMake(40, GameplayConfig.World.platformHeight)
let platformPos = CGPointMake(0, 0 - (bar.size.height / 2))
platform = Platform(size: platformSize, color: color, pos: platformPos, ofType: .Normal)
super.init()
addChild(base)
base.addChild(bar)
bar.addChild(platform)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
我正在创建一个可以旋转的 roundBase。然后,我创建了一个从底部向下的栏,将其添加到基础节点。最后,我创建了应该始终保持水平的平台。 我正在使用另一个 Platform subclass 来创建栏和平台,但它们与这个问题无关。
如何让平台保持水平。我尝试了以下方法,但没有用。
1) 在我的 gameScene 更新中,我不断更新平台位置或 zRotation
platformRound.platform.zRotation = ...
2) 创建一个 zRotation 属性,在添加平台后设置它,然后使用它 属性 不断更新 zRotation。
3) 尝试使用 physicsJoints
我确定我缺少一种简单的方法。如果有任何帮助,我将不胜感激。
这应该有效:
class GameScene: SKScene{
override func didMoveToView(view: SKView) {
backgroundColor = .blackColor()
let centerSprite = SKSpriteNode(color: .whiteColor(), size: CGSize(width: 10, height: 10))
centerSprite.zPosition = 3
let platform = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 70, height: 20))
platform.zPosition = 2
platform.name = "platform"
let container = SKNode()
container.position = CGPoint(x: frame.midX, y: frame.midY)
container.addChild(centerSprite) //Just for debugging
container.addChild(platform)
let radius = 120
let chain = SKSpriteNode(color: .grayColor(), size: CGSize(width: 3, height: radius))
chain.position = CGPoint(x: 0, y: radius/2)
container.addChild(chain)
platform.position = CGPoint(x: 0, y: radius)
let rotatingAction = SKAction.rotateByAngle(CGFloat(-M_PI), duration: 8)
container.runAction(SKAction.repeatActionForever(rotatingAction), withKey: "rotating")
addChild(container)
}
override func didEvaluateActions() {
self.enumerateChildNodesWithName("//platform") { node,stop in
if let parent = node.parent{
node.zRotation = -parent.zRotation
}
}
}
}
我所做的是,我已将平台节点添加到容器节点中并将旋转应用于该容器。后来,在 didEvaluateActions
中,我调整了平台的旋转(使其父级的 zRotation 具有负值)。就是这样。
这是我看到的结果:
需要进行调整,否则平台最终将与其父级一起旋转(注意白色的中心精灵如何与容器节点一起旋转)。