swift * spritekit でスワイプ方向を検出するコードを書いてみました。
※あんまりspritekitは関係ないかも・・・
コード
GameScene.swift
import SpriteKit
class GameScene: SKScene {
var beganPos:CGPoint!
override func didMoveToView(view: SKView) {
//略
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
var touch: AnyObject! = touches.anyObject()
beganPos = touch.locationInNode(self)
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
var touch: AnyObject! = touches.anyObject()
var endedPos:CGPoint = touch.locationInNode(self)
var diffPos:CGPoint = CGPointMake(
endedPos.x - beganPos.x,
endedPos.y - beganPos.y
)
println(diffPos)
println("Direction = \(detectSwipeDirection(diffPos))")
}
func detectSwipeDirection(diffPos:CGPoint) -> Direction{
var degree:Int
if(diffPos.x != 0){
let radian = atan(diffPos.y/fabs(diffPos.x)) //arctan からラジアンを求める
degree = Int(radian * CGFloat(180 * M_1_PI)) //ラジアンから角度に変換
}else{
// x方向の変化がなかった場合(=垂直方向にスワイプされた場合)
degree = diffPos.y < 0 ? -90:90;
}
println(degree)
switch degree {
case -90 ..< -45:
return Direction.DOWN
case -45 ..< 45:
if(diffPos.x >= 0){
return Direction.RIGHT
}else{
return Direction.LEFT
}
case 45 ... 90:
return Direction.UP
default:
return Direction.UP
}
}
}
enum Direction: Int, Printable {
case UP = 0, DOWN, RIGHT, LEFT
var direction: String{
switch self {
case .UP:
return "UP"
case .DOWN:
return "DOWN"
case .RIGHT:
return "RIGHT"
case .LEFT:
return "LEFT"
}
}
var description: String {
return self.direction
}
}
x方向とy方向の距離の差分の+-で方向を検出しているやり方しか見つからなかったので、
角度で方向を検出するようにしてみました。
atanでラジアンを求める際にx方向の絶対値を用いることによって、
上下方向の区別をつきやすくしています。
今回は4方向の実装ですが、このやり方なら8方向に増やしたいときとかも楽にできるんではないかなって思ってます。
拙いコーディングだと自覚していますので、ご指摘等いただけると喜びます(`・ω・´)