SpriteKitでは、ユーザーが回転させるホイールのように、スプライトを軸(たとえば、スプライトの中心を通る軸)に沿って回転させる必要があります。軸に沿ってスプライトを回転する
私はapplyTorque
機能を使用しようとしましたが(角張っているだけで線形ではない力を加えるために)、私は画面上の異なる動きによって引き起こされる異なる力を扱うことができません適用する)。
この問題をどのように処理するかを教えてもらえますか?
SpriteKitでは、ユーザーが回転させるホイールのように、スプライトを軸(たとえば、スプライトの中心を通る軸)に沿って回転させる必要があります。軸に沿ってスプライトを回転する
私はapplyTorque
機能を使用しようとしましたが(角張っているだけで線形ではない力を加えるために)、私は画面上の異なる動きによって引き起こされる異なる力を扱うことができません適用する)。
この問題をどのように処理するかを教えてもらえますか?
あなたは右/左スワイプどのくらいの速に応じてボールを回転させるの答えです:
class GameScene: SKScene {
let speedLabel = SKLabelNode(text: "Speed: 0")
let wheel = SKShapeNode(circleOfRadius: 25)
var recognizer: UIPanGestureRecognizer!
func pan(recognizer: UIPanGestureRecognizer) {
let velocity = recognizer.velocity(in: view!).x
// Play with this value until if feels right to you.
let adjustor = CGFloat(60)
let speed = velocity/adjustor
wheel.physicsBody!.angularVelocity = -speed
}
// Scene setup:
override func didMove(to view: SKView) {
removeAllChildren()
physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
wheel.fillColor = .blue
wheel.physicsBody = SKPhysicsBody(circleOfRadius: 25)
wheel.physicsBody!.affectedByGravity = false
let wheelDot = SKSpriteNode(color: .gray, size: CGSize(width: 5, height:5))
wheel.addChild(wheelDot)
wheelDot.position.y += 20
wheel.setScale(3)
speedLabel.setScale(3)
speedLabel.position.y = (frame.maxY - speedLabel.frame.size.height/2) - 45
recognizer = UIPanGestureRecognizer(target: self, action: #selector(pan))
view.addGestureRecognizer(recognizer)
addChild(wheel)
addChild(speedLabel)
}
override func didSimulatePhysics() {
speedLabel.text = "Speed: \(abs(Int(wheel.physicsBody!.angularVelocity)))"
}
}
素晴らしい!それはまさに私が必要なものです! – ThugMazzola
ここでは、画面の左右を押すかどうかによって時計回りまたは反時計回りにホイールを回転させる基本的な例を示します。速度を上げるためにホールド:ここ
class GameScene : SKScene {
enum Direction { case left, right }
var directionToMove: Direction?
let wheel = SKShapeNode(circleOfRadius: 25)
let speedLabel = SKLabelNode(text: "Speed: 0")
override func didMove(to view: SKView) {
// Scene setup:
anchorPoint = CGPoint(x: 0.5, y: 0.5)
removeAllChildren()
physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
wheel.fillColor = .blue
wheel.physicsBody = SKPhysicsBody(circleOfRadius: 25)
wheel.physicsBody!.affectedByGravity = false
let wheelDot = SKSpriteNode(color: .gray, size: CGSize(width: 5, height:5))
wheel.addChild(wheelDot)
wheelDot.position.y += 20
wheel.setScale(3)
speedLabel.setScale(3)
speedLabel.position.y = (frame.maxY - speedLabel.frame.size.height/2) - 45
addChild(wheel)
addChild(speedLabel)
}
// Change this to touchesBegan for iOS:
override func mouseDown(with event: NSEvent) {
// Change this to touches.first!.location(in: self) for iOS.
let location = event.location(in: self)
// Determine if touch left or right side:
if location.x > 0 {
directionToMove = .right
}
else if location.x < 0 {
directionToMove = .left
}
}
override func mouseUp(with event: NSEvent) {
// Stop applying gas:
directionToMove = nil
print("lol")
}
override func update(_ currentTime: TimeInterval) {
// This is how much speed we gain each frame:
let torque = CGFloat(0.01)
guard let direction = directionToMove else { return }
// Apply torque in the proper direction
switch direction {
case .left:
wheel.physicsBody!.applyTorque(torque)
case .right:
wheel.physicsBody!.applyTorque(-torque)
}
}
override func didSimulatePhysics() {
// Speedometer:
speedLabel.text = "Speed: \(abs(Int(wheel.physicsBody!.angularVelocity)))"
}
}
これは良い出発点です!この場合、iOSではキャンバスが(0,0)から始まるため、左方向は決して呼び出されません。しかし、私は車輪に適用されているさまざまな力を処理する方法が必要です – ThugMazzola
アンカーポイントを0.5 0.5に設定してください申し訳ありません私はsksファイルを持っていました@ThugMazzola – Fluidity
あなたは「別の動きによって引き起こされる異なる力を扱うことにより、何を意味していますo画面? – Fluidity
申し訳ありませんが、私はこれを意味します:あなたが押すとスワイプするとホイールから始めて回転させる必要があります。スワイプが長い場合、ユーザは大きなスピンを持ちたいと考えているのに対し、スワイプが短い場合は、少しスピンしたいと思う。この2つの状況を区別し、これに基づいてトルクを適用する方法が必要です。 – ThugMazzola
私はこれを行う方法を知っています。 'UIPanGestureRecognizer'(またはtouchesMovedやFriendと似た独自のものを実装する)だけで、認識オブジェクトの' .velocity'をチェックし、それに基づいてトルクを適用するだけです。私はあなたが今日はないかもしれないが、私の答えを更新することができます。 – Fluidity