2010-11-22 22 views
6

के बीच पथ बना रहा एक स्पर्श आधारित खेल पर काम कर रहा हूँ, और मैं एक पथ उपयोगकर्ता के माध्यम से छुआ है ड्राइंग समस्याएं आ रही हैं। मैं इन ऐप्स की तरह कुछ नकल करने की कोशिश कर रहा हूं http://www.youtube.com/watch?v=G3CECr6mT1Q या http://www.youtube.com/watch?v=r34-_0wrVC4दो अंक

मैं इसे एक्सएनए/सी # में कर रहा हूं।

मेरा मुद्दा है: मेरे पास वेप पॉइंट्स का सेट है जो परिभाषित करता है कि उपयोगकर्ता पथ को स्पर्श करते हैं। मुझे यकीन नहीं था कि मैं इन सभी बिंदुओं के बीच एक शैलीबद्ध रेखा कैसे प्राप्त कर सकता हूं, इसलिए मैंने सोचा "अरे, मेरे पास सिर्फ एक छोटी सी छवि होगी जो 'रेखा' है, और इसे रास्ते के बीच हर जगह पर खींचें, और तदनुसार घुमाएं । मुझे यकीन है कि यह है कि अगर यह सबसे अच्छा समाधान है या नहीं नहीं कर रहा हूँ।

लेकिन मैं क्योंकि मैं इन दो बिंदुओं के बीच सभी निर्देशांक पाने के लिए नहीं पता था फंस गया था। मैं दो अंक है, मैं एक मिल सकता है पहले से वेक्टर दूसरा, आदि, लेकिन मैं नहीं कर सकते गणित सही पाने के लिए नमूना http://create.msdn.com/en-US/education/catalog/sample/primitives पर कितना आसान आकर्षित करने के लिए पर जानकारी के लिए लग रहे हैं।

कोई सुझाव या मदद? धन्यवाद!

उत्तर

5

एक मध्यवर्ती बिंदु की गणना करने के लिए दो अंक दूसरे से एक बिंदु से दिशा वेक्टर और बिंदुओं के बीच दूरी को खोजने के बीच। 0 और 1 के बीच एक कारक टी द्वारा दूरी को स्केल करें जहां टी = 0 पहले बिंदु से मेल खाता है = 0.5 उनके बीच आधा रास्ता है और टी = 1 दूसरे बिंदु से मेल खाता है। फिर इस वैल्यू द्वारा दिशा वेक्टर को स्केल करें और इसे मूल बिंदु में जोड़ें।

Vector2 IntermediatePoint(Vector2 p0, Vector2 p1, float t) 
{ 
    Vector2 delta = p1 - p0; 

    float distance = delta.Length(); 

    if (distance == 0.0f) 
    { 
     return p0; 
    } 
    else 
    { 
     Vector2 direction = delta/distance; 

     return p0 + direction * (distance * t); 
    } 
} 

आप p0 के बीच कई बिंदुओं की गणना और P1 आप केवल दूरी और दिशा एक बार की गणना चाहिए।

आप अपने अंक जोड़ने के लिए XNA RoundLine का उपयोग भी देख सकते हैं।

एक और सुझाव set up a textured rotated quad है।

+0

+1। –

+0

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

+0

एक वेक्टर की लंबाई कंप्यूटिंग एक महंगा ऑपरेशन है। लेकिन आप यहां क्या कर रहे हैं के लिए बहुत महंगा नहीं है। एक्सएनए इसे लाइन लाइन ड्राइंग आदिम के हिस्से के रूप में नहीं करता है। हालांकि, रेखा रेखाचित्र आदिम का उपयोग करने की सलाह नहीं है। जैसा कि आप अपने प्रश्न में सुझाव देते हैं, यह बिल्कुल अनुकूल नहीं है। – Empyrean

0

चेक आउट एक पंक्ति सहित "Primitives"।

+0

धन्यवाद, लेकिन मैंने वास्तव में पहले से ही इसे देखा है। उस पर ध्यान से, मुझे यकीन नहीं था कि मैं कुछ और अधिक आकर्षक होने के लिए अपनी लाइन को कैसे अनुकूलित कर पाऊंगा - केवल एकमात्र अनुकूलन मुझे रंग विकल्प था। मुझे यह भी लगता है कि वे एक्सएनए ड्राइंग के लिए गणनाओं के बहुत सारे हैं, इस प्रकार मैं उनके गणित को यह नहीं देख सकता कि उन्होंने यह कैसे किया। RoundLine के लिए – Steve

1
pointA = waypointsToDraw.ElementAt(i); 
pointB = waypointsToDraw.ElementAt(i + 1); 
deltaVector = pointB - pointA; 
distance = deltaVector.Length(); 
direction = deltaVector/distance; 
for (int z = 1; z < distance; z++) 
{ 
    newPoint = pointA + direction * (distance * (z/distance)); 
    //this is the newPoint - it will be every point/pixel between pointA and pointB. Put drawing code here 

} 

उपरोक्त कोड नमूने। प्वाइंट ए और पॉइंट बी दो अंत बिंदु हैं, न्यूपॉइंट उनके बीच हर बिंदु होगा

+0

मैं सुझाव देता हूं कि जब आप दूरी से विभाजित हों तो प्रति लूप एक बार रूपांतरण को फ़्लोट करने से बचने के लिए ज़ेड प्रकार के फ्लोट को बनाने का सुझाव दें। इष्टतम प्रदर्शन के लिए गणित संचालन में मिश्रण प्रकारों से बचने का प्रयास करें। – Empyrean

+0

प्रतिक्रिया के लिए धन्यवाद, मैं इसे ध्यान में रखूंगा। बस सीखने के अभ्यास को जारी रखने के लिए, अगर मैं ऊपर के लिए एक बेजियर वक्र या catmull-rom spline लागू करना चाहता था - क्या इसके लिए उपरोक्त को ट्विक करना आसान होगा? :) – Steve