जैसे जिमी ने कहा कि एक दीर्घवृत्त शायद इस गति के लिए एक बेहतर फिट है। यहाँ कुछ विचार हैं कि वास्तव में इसे कैसे दिलचस्पी रखने वालों के लिए थोड़ा और विस्तार के साथ लागू किया जाए।
समय ले रहा है
शुरुआत के लिए, आपको खेल की दुनिया में समय का ध्यान रखने के लिए एक चर की आवश्यकता होती है। आप इसे किसी भी तरह से लागू कर सकते हैं, लेकिन यहाँ एक उदाहरण है। मैं एक वैरिएबल का उपयोग करता हूं जिसे hours0 से 24 तक भिन्न होता है (हालांकि जब यह 24 तक पहुंचता है तो यह 0 से वापस हो जाता है)।
हालांकि वास्तविक जीवन के विपरीत, मैं सिर्फ इस बात पर विचार करूंगा कि दिन 0 घंटे से शुरू होता है, और रात 12 घंटे से शुरू होती है। इससे कुछ गणनाएं आसान हो जाएंगी।
मैं उस दर को भी परिभाषित करूंगा जिसमें वास्तविक समय के संबंध में खेल का समय बदलता है। इस उदाहरण में, हर दो मिनट का वास्तविक समय खेल में एक घंटे के अनुरूप होगा।
float hours = 0.0f; // From 0 to 24 wrapping around
const float HoursPerSecond = 1f / 120f; // E.g. 2 minutes = 1 hour ingame
public void Update(float elapsed)
{
hours += elapsed * HoursPerSecond; // Advance clock
if(hours >= 24f) hours -= 24f; // Wrap around 24 hours
}
विन्यास
अब हमारे सूरज की गति को निर्धारित करने से पहले हमें इसके कुछ मापदंडों को निर्दिष्ट करने की आवश्यकता है। विशेष रूप से, यह किस एक्स मान को क्षितिज से बढ़ाता है, और किस एक्स मूल्य पर यह क्षितिज में गिरता है। इसके अलावा, वाई जो क्षितिज से मेल खाती है, और वह उस रेखा से ऊपर उठने वाला है।
float startX = 0;
float endX = 1000;
float horizonY = worldHeight/2;
float amplitudeY = 200;
सूर्य के निर्देशांक की गणना
अब दिन के एक निश्चित समय के लिए हमारे सूर्य की स्थिति की गणना करने का समय है। मैं जिमी द्वारा उपयोग किए गए समान पैरामीट्रिक फ़ंक्शन का उपयोग करूंगा, लेकिन डोमेन से [0..2PI] के बजाय (दिन के प्रकोप से सूर्य को उसकी मूल स्थिति में वापस लाने के लिए):
x = (1-cos (t)) / 2
y = पाप (t)
यह एक अच्छा कार्य है क्योंकि एक्स मान 0 से 1 तक भिन्न होता है और फिर 0 से फिर से होता है (जो हम अपने सूरज की शुरुआत और अंत एक्स मानों के लिए मैपिंग करेंगे) और वाई मान 0 से शुरू होता है और 1 और पीछे चलता है 0 पर फिर से (जो हमारा दिन का हिस्सा होगा) और फिर मूल स्थिति पर वापस आने से पहले नकारात्मक पक्ष पर सटीक बात को दोहराता है (जो कि हमारी रात होगी हालांकि सूरज इस बिंदु पर नहीं खींचा जाएगा)।
पहला चरण हमारे फ़ंक्शन की सीमा [[०.२.२४] तक घंटों को स्केल कर रहा है:
float t = (hours / 24f) * MathHelper.TwoPi; // Scale: [0..24) to [0..2PI)
अगला हम 0 और 1 के बीच के मूल्यों को वापस पाने के लिए कार्यों को लागू करते हैं जो मैंने ऊपर बात की थी:
float horizontal = (float)((1-Math.Cos(t)) / 2f); // Changes: 0 1 0
float vertical = (float)(Math.Sin(t)); // Changes: 0 1 0 -1 0
और अंत में हम सूरज के मापदंडों का उपयोग करके उन मूल्यों को मापते हैं:
float sunX = startX + (endX - startX) * horizontal; // From startX to endX and back
float sunY = horizonY + amplitydeY * vertical; // Up and down around horizonY