LoginSignup
2
2

More than 5 years have passed since last update.

[Swift][Spritekit]上下左右方向のスワイプを検出する

Last updated at Posted at 2015-08-08

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方向に増やしたいときとかも楽にできるんではないかなって思ってます。

拙いコーディングだと自覚していますので、ご指摘等いただけると喜びます(`・ω・´)

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2