私が構築しているゲームでは、ユーザーはスクロールビューと同様に画面をドラッグしてカメラを動かすことができます。これはすべて、メインシーンファイルでtouchesBeganおよびtouchesMovedメソッドによって処理されます。しかし、私はまた、ユーザーがSKSpriteNode(実際には移動しない)から別のSKSpriteNodeにドラッグできるようにしたい - 次に、2つのノードに基づいてアクションを実行する。私はこれらの両方を別々に行うことができます。しかし、ユーザーがあるノードから別のノードにドラッグしているときは、カメラをパンしたくありません。Spritekitはスプライトからドラッグしない場合のみカメラを移動します
もう一度、ノードに触れた場合、touchesBeganに設定されたブール値フラグを使用してこれを解決することができました。しかしながら、ユーザがスプライトの1つに触れ始めるが、例えば、ノード上で起きたパンを実際に素早く実行した場合、画面はパンしない。誰にもこれに対する良い解決策がありますか?
touchesMovedにすべてのタッチイベントを格納し、touchesEndedでそれらをループし、スプライトで開始して終了しなかった場合、同じ動作ロジックを実行するという考えでした。例:
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
movingTouches.append(touch)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if startedOnSprite && !endedOnSprite || !(startedOnSprite && endedOnSprite) {
let location = movingTouches.last().location(in: self)
let previousLocation = movingTouches.first().location(in: self)
let deltaY = location.y - previousLocation.y
let deltax = location.x - previousLocation.x
gameCamera?.position.y -= deltaY
view.frame.size.height
gameCamera?.position.y = (gameCamera?.position.y)! > viewHeight/2 ? viewHeight/2 : (gameCamera?.position.y)!
gameCamera?.position.y = (gameCamera?.position.y)! < -(viewHeight/2) ? -(viewHeight/2) : (gameCamera?.position.y)!
gameCamera?.position.x -= deltax
gameCamera?.position.x = (gameCamera?.position.x)! < -(viewWidth/2) ? -(viewWidth/2) : (gameCamera?.position.x)!
gameCamera?.position.x = (gameCamera?.position.x)! > (viewWidth/2) ? (viewWidth/2) : (gameCamera?.position.x)!
}
movingTouches = [UITouch]()
endedOnSprite = false
startedOnSprite = false
}
問題を複雑にするには、Spritesにもドラッグと同様にタップイベントが必要です。私はSpriteKitでこのすべてを行う良い方法を見つけるのに苦労しています
残念ながら、上記はあまり滑らかではなく、私が期待する距離をスクロールしていないように思えますスプライトで始まるかどうかわからない場合は正しくスクロールします)
明確にするために、ユーザーがスプライトから実際に指を使用していない場合は、スクロール動作が必要です他の人に
?理論的には、あるスプライトから別のスプライトにドラッグすると、スワイプとして分類され、パンニングの結果にならないでしょうか? – TommyBs
ジェスチャ認識が完了したかどうかを示す状態で、ジェスチャ認識プログラムで細かい制御がたくさんあります。 –
また、各ジェスチャーは、互いに干渉しないように区別されており、目標位置、すなわちスプライトまたはバックグラウンドノードが何であるかを知ることによって、異なる種類のパンニングを処理できますか? –