2017-01-24 3 views
5

पर पैनिंग करते समय कैमरे को सही स्थिति में रखें। मुझे पैनिंग के बाद मेरे दृश्य के अंदर सीमाओं और स्थिति को सही ढंग से सेट करने में कठिनाई हो रही है। तो यहाँ मेरा परिदृश्य है।पैनिंग के बाद

मेरे पास एक नोड है जो स्क्रीन से बड़ा है और मैं उपयोगकर्ता को पूरा नक्शा देखने के लिए चारों ओर घूमना चाहता हूं। मेरा नोड 1000 by 1400 है जब दृश्य 640 by 1136 है। नक्शा नोड के अंदर स्प्राइट्स डिफ़ॉल्ट एंकर पॉइंट होता है। फिर मैंने मानचित्र नोड में एक कैमरा जोड़ा है और इसकी स्थिति (0.5, 0.5) पर सेट की है।

enter image description here

अब मैं अगर मैं कैमरे के स्थिति या नक्शा नोड उपयोगकर्ता स्क्रीन धूपदान जब बदलते जाना चाहिए सोच रहा हूँ? पहला दृष्टिकोण समस्याग्रस्त प्रतीत होता है, क्योंकि मैं केवल कैमरे की स्थिति में अनुवाद जोड़ नहीं सकता क्योंकि स्थिति को (0.5, 0.5) के रूप में परिभाषित किया जाता है और अनुवाद मान उस से बड़े होते हैं। तो मैंने स्क्रीन आकार से इसे गुणा/विभाजित करने की कोशिश की लेकिन यह काम नहीं लग रहा है। क्या दूसरा दृष्टिकोण बेहतर है?

var map = Map(size: CGSize(width: 1000, height: 1400)) 

override func didMove(to view: SKView) { 
    (...) 
    let pan = UIPanGestureRecognizer(target: self, action: #selector(panned(sender:))) 
    view.addGestureRecognizer(pan) 

    self.anchorPoint = CGPoint.zero 
    self.cam = SKCameraNode() 
    self.cam.name = "camera" 

    self.camera = cam 
    self.addChild(map) 
    self.map.addChild(self.cam!) 

    cam.position = CGPoint(x: 0.5, y: 0.5) 
} 

var previousTranslateX:CGFloat = 0.0 

func panned (sender:UIPanGestureRecognizer) { 
    let currentTranslateX = sender.translation(in: view!).x 

    //calculate translation since last measurement 
    let translateX = currentTranslateX - previousTranslateX 

    let xMargin = (map.nodeSize.width - self.frame.width)/2 

    var newCamPosition = CGPoint(x: cam.position.x, y: cam.position.y) 
    let newPositionX = cam.position.x*self.frame.width + translateX 

    // since the camera x is 320, our limits are 140 and 460 ? 
    if newPositionX > self.frame.width/2 - xMargin && newPositionX < self.frame.width - xMargin { 
     newCamPosition.x = newPositionX/self.frame.width 
    } 

    centerCameraOnPoint(point: newCamPosition) 

    //(re-)set previous measurement 
    if sender.state == .ended { 
     previousTranslateX = 0 
    } else { 
     previousTranslateX = currentTranslateX 
    } 
} 

func centerCameraOnPoint(point: CGPoint) { 
    if cam != nil { 
     cam.position = point 
    } 
} 
+0

आपको कैमरे के लिए (0.5, 0.5) स्थिति कहां मिल रही है? – Confused

+0

प्रतीक्षा करें .. मुझे लगता है कि मैंने देखा है कि आपने क्या किया है ... क्या आपने एक्सकोड से डिफ़ॉल्ट टेम्पलेट के साथ शुरुआत की है? और दृश्य के एंकर पॉइंट्स को नहीं बदला? – Confused

+0

मैंने कैमरे की स्थिति के साथ एंकरपॉइंट (जिसे आप परिभाषित कर सकते हैं) को मिश्रित किया। इस मामले में यह केंद्र से 0.5 पिक्सेल है। मैंने दृश्य के एंकरपॉइंट को 0.0 को 'डीडलोड' में सेट किया है। अन्यथा उन्हें छुआ नहीं है। – owca

उत्तर

4

आपका कैमरा वास्तव में केंद्र के दाईं ओर 0.5 अंक पॉइंटल बिंदु पर और केंद्र से 0.5 अंक ऊपर है। (0, 0) पर आपका कैमरा स्क्रीन का मृत केंद्र है।

मुझे लगता है कि आपने जो गलती की है वह एक वैचारिक है, यह सोचकर कि दृश्य का लंगर बिंदु (0.5, 0.5) दृश्य के केंद्र निर्देशांक के समान है।

यदि आप पिक्सेल में काम कर रहे हैं, जो ऐसा लगता है, तो आपके मानचित्र के ऊपरी दाएं भाग पर 500 (700, 700) की कैमरा स्थिति नीचे होगी, (-500, -700) नीचे होगी बाएं।

यह मानता है कि आप मिडपॉइंट एंकर का उपयोग कर रहे हैं जो एक्सकोड स्प्राइटकिट टेम्पलेट के साथ डिफ़ॉल्ट रूप से आता है।

जिसका अर्थ है कि आपके प्रश्न का उत्तर यह है: अपने मानचित्र के आस-पास, जैसा कि आप कृपया अपने कैमरे को ले जाएं, क्योंकि अब आप ज्ञान में विश्वास करेंगे कि यह पिक्सेल शाब्दिक है।

एक चेतावनी के साथ ...

खेल का एक बहुत इतना है कि नक्शे से आधा है और स्क्रीन पर आधा नहीं है कैमरा कुछ हद तक इससे पहले कि यह एक नक्शे के किनारे करने के लिए हो जाता है को रोकने के लिए की कमी का उपयोग करें। इस तरह नक्शा का किनारा दिखा रहा है, लेकिन सबसे दूर कैमरे की यात्रा नक्शे के किनारे को प्रकट करने के लिए पर्याप्त है। यह एक बाधा आधारित प्रयास बन जाता है जब आपके पास कोई खिलाड़ी/चरित्र होता है जो किनारे पर जा सकता है/आगे बढ़ सकता है, लेकिन कैमरा वहां से बाहर नहीं जाता है।

+1

अच्छा जवाब उलझन में है। –

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