2017-11-07 16 views
1

SpriteKit으로 RPG Birds-eye 스타일 게임을 만들고 있습니다. D-Pad가 플레이어에게 캐릭터를 충분히 제어하지 못하기 때문에 조이스틱을 만들었습니다.SpriteKit : 조이스틱의 각도를 계산하고이를 기반으로 스프라이트를 변경하십시오.

조이스틱 엄지 노드의 각도에 따라 내 캐릭터의 Sprite를 변경하는 데 필요한 데이터를 계산하는 방법에 대해 두뇌를 감쌀 수 없습니다. 여기

은 내가

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 
     if isTracking == false && base.contains(location) { 
      isTracking = true 
     } 
    } 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location: CGPoint = touch.location(in: self) 
     if isTracking == true { 

      let v = CGVector(dx: location.x - base.position.x, dy: location.y - DPad.position.y) 
      let angle = atan2(v.dy, v.dx) 
      let deg = angle * CGFloat(180/Double.pi) 

      let Length:CGFloat = base.frame.size.height/2 
      let xDist: CGFloat = sin(angle - 1.57079633) * Length 
      let yDist: CGFloat = cos(angle - 1.57079633) * Length 

      print(xDist,yDist) 

      xJoystickDelta = location.x * base.position.x/CGFloat(Double.pi) 
      yJoystickDelta = location.y * base.position.y/CGFloat(Double.pi) 


      if base.contains(location) { 
       thumbNode.position = location 
      } else { 
       thumbNode.position = CGPoint(x: base.position.x - xDist, y: base.position.y + yDist) 
      } 

     } 

    } 

} 

업데이트 방법

override func update(_ currentTime: TimeInterval) { 
    // Called before each frame is rendered 
    if xJoystickDelta > 0 && yJoystickDelta < 0 { 
     print("forward") 
    } 

} 

내가 지금 설정 십자가에 조이스틱 위치의 양 또는 음의 상태를 테스트 한 방법을 사용하고 내 코드입니다 엄지 노드가 아래 표시된 4 개의 섹션 중 어디에 위치하는지에 기초한 방법

는 내가하고 싶은 해달라고

어떻게는 엄지 손가락 노드가 실제로 그렇게처럼 내 조이스틱 기지 내부 가리키는 위치에 따라 스프라이트를 변경하도록 내가 그것을 설정합니다. 내가 지금 3 일이 고민 한

image 2

그래서 어떤 도움을 주시면 감사하겠습니다.

답변

1

너무 복잡해 보입니다. 차이 벡터 v의 x 및 y 구성 요소 을 비교하면됩니다. 이 같은 것을 :

if v.dx > abs(v.dy) { 
    // right 
} else if v.dx < -abs(v.dy) { 
    // left 
} else if v.dy < 0 { 
    // up 
} else if v.dy > 0 { 
    // down 
} 
+0

정말 고마워요! 당신은 생명을 구하는 사람입니다. 저는 지금 이것을 며칠 동안 해왔습니다. 추신 아래로 위로 전환해야합니다 –

+0

@ E.Huckabee : 좌표계에 따라 다릅니다. UIKit에서 원점은 왼쪽 위 모서리에 있습니다. 그래서 나는 긍정적 인 Δy를 "아래로"간주했습니다. SpriteKit에서 다른 방법입니다. –

+0

나는 그것이 매우 간단하다는 것을 깨닫지 못했다. 당신의 빠른 anwser에 감사한다. –