[英]Is there a way in Sprite Kit to get coordinates of a finger that doesn't move at the moment?
为了避免意外的游戏行为,我想在任何给定时刻知道触摸屏上所有手指的坐标。 有办法吗?
例如,当从屏幕上移走第二个手指时,获取拳头的坐标。
提前致谢!
这是基于trojanfoe想法的解决方案。
import SpriteKit
class GameScene : SKScene {
struct fingerTrackData {
var fingerID : Int // used to identify fingers in other part of the code
var lastLocation : CGPoint // location of each finger
}
// array that stores information about each finger coordinates
var fingerTracks : [fingerTrackData] = []
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
let location = touch.locationInNode(self)
// getAvailableFingerID() returns available fingerID to avoid ID duplication
self.fingerTracks.append(fingerTrackData(fingerID: self.getAvailableFingerID(), lastLocation: location))
}
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
let location = touch.locationInNode(self)
self.updateFingerTracks(location)
}
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
let location = touch.locationInNode(self)
// deregistering unnecessary finger tracks
self.fingerTracks.removeAtIndex(self.getClosestFingerArrayIndexByLocation(location))
}
}
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
// touchesCancelled occurs e.g. when more than 5 fingers on iPhone is on the screen
// Deregistering all tracks here
self.fingerTracks.removeAll()
}
override func update(currentTime: NSTimeInterval) {
// to see in console what is actually happening in array
if fingerTracks.count > 0 {
for fingerTrack in self.fingerTracks {
print("Finger: \(fingerTrack.fingerID) Location: \(fingerTrack.lastLocation)")
}
} else {
print("---")
}
}
/*
* Below are some helper functions for convenience
*/
func getClosestFingerArrayIndexByLocation (location: CGPoint) -> Int {
var fingerTrackKeyToUpdate : Int = 0
var shortestDistance : CGFloat = 100500 // some big number that is much bigger than screen size
for (fingerTrackKey, fingerTrack) in self.fingerTracks.enumerate() {
// calculating distance from previous record for each finger
let calculatedDistance = sqrt(pow(fingerTrack.lastLocation.x - location.x,2) + pow(fingerTrack.lastLocation.y - location.y,2))
// shortest one gives us finger ID
if calculatedDistance < shortestDistance {
shortestDistance = calculatedDistance
fingerTrackKeyToUpdate = fingerTrackKey
}
}
return fingerTrackKeyToUpdate
}
func updateFingerTracks(location: CGPoint) {
let closestFingerArrayIndex = self.getClosestFingerArrayIndexByLocation(location)
let fingerIDToUpdate = self.fingerTracks[closestFingerArrayIndex].fingerID
self.fingerTracks[closestFingerArrayIndex] = fingerTrackData(fingerID: fingerIDToUpdate, lastLocation: location)
}
func getClosestFingerIdByLocation(location: CGPoint) -> Int {
return self.fingerTracks[self.getClosestFingerArrayIndexByLocation(location)].fingerID
}
func getAvailableFingerID() -> Int {
var availableFingerID : Int = 0
if self.fingerTracks.count > 0 {
var checkAgain = true
while checkAgain {
checkAgain = false
for fingerTrack in self.fingerTracks {
if availableFingerID == fingerTrack.fingerID {
checkAgain = true
availableFingerID++
}
}
}
}
return availableFingerID
}
}
谢谢大家的协助!
class GameScene : SKScene {
// stores all touches at any moment
var touchTracks : [UITouch] = []
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
self.touchTracks.append(touch)
}
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
var touchIndexToRemove : Int?
for i in 0..<self.touchTracks.count {
if self.touchTracks[i] == touch {
touchIndexToRemove = i
}
}
self.touchTracks.removeAtIndex(touchIndexToRemove!)
}
}
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
// touchesCancelled occurs e.g. when more than 5 fingers on iPhone is on the screen
// Deregistering all tracks here
self.touchTracks.removeAll()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.