2014-11-09 10 views
5

मैं स्विफ्ट कोड में निरंतर उपयोगकर्ता स्पर्श को कैसे पहचान सकता हूं? निरंतर मेरा मतलब है कि उपयोगकर्ता की स्क्रीन पर उसकी उंगली है। जब तक उपयोगकर्ता स्क्रीन को छू रहा है, तब तक मैं उपयोगकर्ता के स्पर्श की दिशा में एक स्प्राइट किट नोड को स्थानांतरित करना चाहता हूं।स्विफ्ट में लगातार स्पर्श कैसे पहचानें?

उत्तर

10

इस प्रक्रिया के बारे में सबसे कठिन बात एक मल्टीटच पर्यावरण के भीतर एक छूता ट्रैक कर रहा है। इस के "सरल" समाधान के साथ समस्या (यानी, touchesBegan में "आइसचॉच" चालू करें और touchesEnded में इसे बंद करें) यह है कि यदि उपयोगकर्ता स्क्रीन पर दूसरी उंगली छूता है और फिर इसे ले जाता है, तो यह पहले स्पर्श के कार्यों को रद्द कर देगा ।

इस बुलेटप्रूफ को बनाने के लिए, आपको अपने जीवनकाल में व्यक्तिगत स्पर्शों को ट्रैक करने की आवश्यकता है। जब पहला स्पर्श होता है, तो आप उस स्पर्श के स्थान को सहेजते हैं और ऑब्जेक्ट को उस स्थान की ओर ले जाते हैं। किसी भी और स्पर्श की तुलना पहले स्पर्श से की जानी चाहिए, और अगर वे पहले स्पर्श नहीं हैं तो उन्हें अनदेखा किया जाना चाहिए। यह दृष्टिकोण आपको मल्टीटाउच को संभालने की भी अनुमति देता है, जहां ऑब्जेक्ट को स्क्रीन पर वर्तमान में किसी भी उंगली की ओर बढ़ने के लिए बनाया जा सकता है, और फिर अगली उंगली पर ले जाया जाता है यदि पहले वाला उठाया जाता है, और इसी तरह।

यह ध्यान रखना महत्वपूर्ण है कि UITouch ऑब्जेक्ट्स touchesBegan, touchesMoved, और touchesEnded पर स्थिर हैं। touchesBegan में बनाए गए UITouch ऑब्जेक्ट के बारे में आप सोच सकते हैं, touchesMoved में बदलकर touchesEnded में नष्ट हो गया। आप touchesBegan में बनाए गए टच ऑब्जेक्ट के संदर्भ को सहेजकर अपने जीवन के दौरान स्पर्श के चरण को ट्रैक कर सकते हैं, फिर touchesMoved में आप किसी भी मौजूदा स्पर्श और परिवर्तन के नए स्थान की जांच कर सकते हैं ऑब्जेक्ट का कोर्स यदि उपयोगकर्ता अपनी उंगली चलाता है (आप जिटर को रोकने के लिए सहनशीलता लागू कर सकते हैं, उदाहरण के लिए, यदि x/y दूरी कुछ सहिष्णुता से कम है, तो पाठ्यक्रम को न बदलें)। touchesEnded में आप यह जांच सकते हैं कि फ़ोकस में स्पर्श समाप्त हो गया है या ऑब्जेक्ट के आंदोलन को रद्द कर दिया गया है, या इसे अभी भी होने वाले किसी अन्य स्पर्श की ओर बढ़ने के लिए सेट किया गया है। यह महत्वपूर्ण है, जैसे कि आप किसी भी पुराने टच ऑब्जेक्ट को समाप्त करने की जांच करते हैं, यह अन्य स्पर्शों को भी रद्द कर देगा, जो अप्रत्याशित परिणाम उत्पन्न कर सकता है।

यह लेख Obj सी में है, लेकिन कोड स्विफ्ट को आसानी से पोर्टेड है और आपको पता चलता है कि आप क्या करने की जरूरत है, बस के नीचे "एक परिसर बहुस्पर्श अनुक्रम हैंडलिंग" सामान की जाँच: https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/multitouch_background/multitouch_background.html

16

बुनियादी कदम

  1. स्टोर स्पर्श नहीं रह गया है का पता चला है जब स्पर्श घटनाओं (touchesBegan/touchesMoved) उस स्थान की ओर
  2. ले जाएँ स्प्राइट नोड के स्थान (update)
  3. बंद करो नोड चलती (touchesEnded)

यहाँ कैसे करना है, इसका एक उदाहरण है कि

0,123,

Xcode 8

let sprite = SKSpriteNode(color: SKColor.white, size: CGSize(width:32, height:32)) 
var touched:Bool = false 
var location = CGPoint.zero 

override func didMove(to view: SKView) { 
    /* Add a sprite to the scene */ 
    sprite.position = CGPoint(x:0, y:0) 
    self.addChild(sprite) 
} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    touched = true 
    for touch in touches { 
     location = touch.location(in:self) 
    } 
} 

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

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    // Stop node from moving to touch 
    touched = false 
} 

override func update(_ currentTime: TimeInterval) { 
    // Called before each frame is rendered 
    if (touched) { 
     moveNodeToLocation() 
    } 
} 

// Move the node to the location of the touch 
func moveNodeToLocation() { 
    // Compute vector components in direction of the touch 
    var dx = location.x - sprite.position.x 
    var dy = location.y - sprite.position.y 
    // How fast to move the node. Adjust this as needed 
    let speed:CGFloat = 0.25 
    // Scale vector 
    dx = dx * speed 
    dy = dy * speed 
    sprite.position = CGPoint(x:sprite.position.x+dx, y:sprite.position.y+dy) 
} 

Xcode 7

let sprite = SKSpriteNode(color: SKColor.whiteColor(), size: CGSizeMake(32, 32)) 
var touched:Bool = false 
var location = CGPointMake(0, 0) 

override func didMoveToView(view: SKView) { 
    self.scaleMode = .ResizeFill 
    /* Add a sprite to the scene */ 
    sprite.position = CGPointMake(100, 100) 
    self.addChild(sprite) 
} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    /* Start moving node to touch location */ 
    touched = true 
    for touch in touches { 
     location = touch.locationInNode(self) 
    } 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    /* Update to new touch location */ 
    for touch in touches { 
     location = touch.locationInNode(self) 
    } 
} 

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    // Stop node from moving to touch 
    touched = false 
} 

override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 
    if (touched) { 
     moveNodeToLocation() 
    } 
} 

// Move the node to the location of the touch 
func moveNodeToLocation() { 
    // How fast to move the node 
    let speed:CGFloat = 0.25 
    // Compute vector components in direction of the touch 
    var dx = location.x - sprite.position.x 
    var dy = location.y - sprite.position.y 
    // Scale vector 
    dx = dx * speed 
    dy = dy * speed 
    sprite.position = CGPointMake(sprite.position.x+dx, sprite.position.y+dy) 

} 
संबंधित मुद्दे