import SpriteKit
import GameplayKit
//Extensions borrowed from here : http://stackoverflow.com/a/29179878/3402095
extension Int {
var degreesToRadians: Double { return Double(self) * .pi/180 }
var radiansToDegrees: Double { return Double(self) * 180/.pi }
}
extension FloatingPoint {
var degreesToRadians: Self { return self * .pi/180 }
var radiansToDegrees: Self { return self * 180/.pi }
}
let kActionKey = "rotate"
class GameScene:SKScene {
let purpleCube = SKSpriteNode(color: .purple, size: CGSize(width: 150, height: 150))
let yellowCube = SKSpriteNode(color: .yellow, size: CGSize(width: 150, height: 150))
override func didMove(to view: SKView) {
addChild(purpleCube)
purpleCube.position.y = purpleCube.size.height
purpleCube.name = "purple"
addChild(yellowCube)
yellowCube.position.y = -yellowCube.size.height
yellowCube.name = "yellow"
let rotate = SKAction.rotate(byAngle: CGFloat(-M_PI * 2.0), duration: 5)
let loop = SKAction.repeatForever(rotate)
purpleCube.run(loop, withKey: kActionKey)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
if let touch = touches.first {
let location = touch.location(in: self)
if let cube = atPoint(location) as? SKSpriteNode {
if let name = cube.name {
switch name {
case "purple":
if let action = purpleCube.action(forKey: kActionKey){
purpleCube.run(action.reversed(), withKey: kActionKey)
}
case "yellow":
if action(forKey: "rotating") == nil{
yellowCube.run(SKAction.rotate(byAngle: CGFloat(4.degreesToRadians), duration: 0.1), withKey: kActionKey)
}
default:
break
}
}
}
}
}
}
В этом примере есть два узла, которые были повернуты в течение двух различных способов. Фиолетовый узел постоянно вращается с определенной скоростью по часовой стрелке. Чтобы достичь этого, я создал действие, которое вращает спрайт на 360 градусов ... Это будет один оборот, который будет повторяться вечно, поэтому спрайт будет повернут навсегда.
О желтом узле ... Он будет повернут на 4 градуса каждый раз, когда вы нажмете на него. В настоящее время вам нужно подождать, пока стрелка перестанет вращаться, чтобы вы могли повернуть ее больше. Конечно, это необязательно, я просто хотел показать вам полезность клавиш действия.
Направление вращения
Поскольку в SpriteKit 0 градусов указуют положительную ось х и положительный угол в направлении против часовой стрелки, я повернут фиолетовый куб на -360 градусов, который вращает спрайты в направлении по часовой стрелке. Чтобы узнать больше о системе координат SpriteKit, прочитайте this documentation section.
Радианы Vs Градусы
Как вы можете видеть, я имею в виду в градусах, а не в радианах ... Это потому, что это было бы очень трудно сказать, я повернул спрайт на 6.2831853072 радианах:) Вот почему я использовал расширения, которые делают преобразование из градусов в радианы и наоборот. Вы можете использовать это часто, поэтому я добавил их для вас.
Вы должны использовать 'SKAction.rotate (byAngle' с радианами, а не градусами, посмотрите [здесь] (https://developer.apple.com/reference/spritekit/skaction/1417805-rotate) –
Это дает мне ошибка «ожидаемого разделителя»: пусть действие = SKAction.rotate (byAngle radians: CGFloat (directionToRotate * direction), duration: TimeInterval (2)) – John
@John Так вы называете этот метод: 'let action = SKAction.rotate (byAngle: CGFloat (M_PI), продолжительность: 1) ', не просто копировать и вставлять код из документов. – Whirlwind