2016-08-17 5 views
7

मैं बस इतना करने की कोशिश कर रहा हूं कि स्क्रीन पर एक स्प्राइट खींचने और छोड़ने में सक्षम हो। मैं निम्नलिखित कोड की कोशिश की है:मैं स्विफ्ट 3.0 में एक स्प्राइट को कैसे खींचूं और छोड़ूं?

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    for touch in (touches) { 
     let location = touch.locationInNode(self) 
     if ball.containsPoint(location) { 
      ball.position = location  
} 
} 
} 

इस कोड है काम, तथापि, जब मैं काफी तेजी से गेंद खींचें, मैं यह पता लगाता है कि "गेंद" अब बात "स्थान" और गेंद शामिल लगता है बंद हो जाता है, जिसका अर्थ है कि मैंने गेंद को फिर से उठाया है। मैं चाहता हूं कि गेंद जल्दी से मेरे स्पर्शों का जवाब दे सके, ताकि गेंद आगे बढ़ना बंद न करे। यह मैं कैसे करूंगा?

+1

क्योंकि आपको इसे तर्कसंगत रूप से सोचने की आवश्यकता है, यदि आप तेजी से आगे बढ़ते हैं, तो आपकी उंगली अब गेंद को छूती है जब यह जांच करता है। आपको अपने कंटेनपॉइंट कोड का उपयोग करके एक सक्रिय स्थिति शुरू करने के लिए स्पर्शों का उपयोग करने की आवश्यकता है, फिर आप स्पर्श का उपयोग करते हैं, अगर आप सक्रिय हो जाते हैं तो आप बस गेंद को स्थानांतरित करते हैं, तो आप बिंदु की जांच नहीं करते हैं, फिर स्पर्श पर या स्पर्श किए जाते हैं, आप इसे – Knight0fDragon

उत्तर

-3

मैं एक कार्यान्वयन है जहाँ मैं एक UIImageView subclassed और एक "DraggableImage"

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     originalPosition = self.center 
    } 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     if let touch = touches.first { 
      let position = touch.location(in: self.superview) 
      self.center = CGPoint(x: position.x, y: position.y) 
     } 
    } 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 

     self.center = originalPosition 
    } 
+0

कैसे निष्क्रिय करते हैं यह भी एक जवाब है, एसकेएनओड्स और यूआईवीव्स 2 अलग-अलग चीजें हैं, और यदि आप तेजी से आगे बढ़ते हैं, तो आपको अभी भी इस ड्रैगगेबल छवि स्पर्श की समस्या होनी चाहिए। निकाल दिया नहीं जा रहा है क्योंकि आप फ्रेम – Knight0fDragon

10

यह स्प्राइट किट में यह करने के लिए सही तरीका क्या है यह कहा है की है। जैसा कि मैंने अपनी टिप्पणी में कहा था, आपको चलती नोड को एक सक्रिय स्थिति में असाइन करने की आवश्यकता है, इस मामले में मैं movableNode नामक चर का उपयोग करता हूं, यह कार्य सक्रिय है। जब आप गेंद को छूते हैं, तो इसे movableNode पर निर्दिष्ट करके सक्रिय हो जाता है। फिर जब आप अपनी उंगली खींचते हैं, तो movableNode ड्रैग के साथ जाएगा, फिर एक बार रिलीज होने के बाद, आप movableNode को शून्य पर सेट करके एक निष्क्रिय राज्य दर्ज करें। ध्यान दें कि यह कोड केवल मल्टीटाउच को संभालने के लिए एकल स्पर्श अनुप्रयोगों पर काम करेगा, फिर आपको ट्रैक करना होगा कि कौन सा स्पर्श ड्रैगिंग कर रहा है।

var movableNode : SKNode? 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first { 
     let location = touch.locationInNode(self) 
     if ball.containsPoint(location) { 
      movableNode = ball 
      movableNode!.position = location  
     } 
    } 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first where movableNode != nil { 
     movableNode!.position = touch.locationInNode(self) 
    } 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first where movableNode != nil { 
     movableNode!.position = touch.locationInNode(self) 
     movableNode = nil 
    } 
} 
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first { 
     movableNode = nil 
    } 
} 
+0

से आगे गए हैं, यदि आप वोट नीचे जा रहे हैं, तो समझाएं , यह सही समाधान – Knight0fDragon

6

नाइटऑफड्रैगन समाधान ठीक काम करता है। मैंने कुछ पंक्तियां जोड़ दी हैं यदि आप स्प्राइट सेंटर की स्थिति को उस स्थिति में स्थानांतरित नहीं करना चाहते हैं जहां आपकी अंगुली स्क्रीन को छूती है और आप स्प्राइट को अपने केंद्र की मूल स्थिति से स्थानांतरित करना चाहते हैं।

var movableNode : SKNode? 
var ballStartX: CGFloat = 0.0 
var ballStartY: CGFloat = 0.0 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first { 
     let location = touch.location(in: self) 
     if (map?.contains(location))! { 
      movableNode = ball 
      ballStartX = (movableNode?.position.x)! - location.x // Location X of your sprite when touch started 
      ballStartY = (movableNode?.position.y)! - location.y // Location Y of your sprite when touch started 
     } 
    } 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first, movableNode != nil { 
     let location = touch.location(in: self) 
     movableNode!.position = CGPoint(x: location.x+ballStartX, y: location.y+ballStartY) // Move node around with distance to your finger 
    } 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let _ = touches.first, movableNode != nil { 
     movableNode = nil 
    } 
} 
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 
if let touch = touches.first { 
    movableNode = nil 
} 
+0

शानदार है। धन्यवाद। – Steve

+0

तो यह मूल रूप से केवल मेरे नोड को चलने योग्य बना देगा यदि आप इसे सही खींचते हैं? क्योंकि जब मैं डिस्प्ले के कुछ हिस्सों को टैप करता हूं, तो नोड वहां जाता है। मैं नोड को तब तक नहीं लेना चाहता जब तक कि मैं इसके लिए स्क्रीन पर कहीं न खींच रहा हूं। – Dewan

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