জিমির মতো একটি এলিপস সম্ভবত এই গতির জন্য আরও ভাল ফিট। আগ্রহীদের জন্য কিছুটা বিশদ সহ এটি কীভাবে বাস্তবে বাস্তবায়ন করা যায় সে সম্পর্কে এখানে কিছু ধারণা।
সময় গ্রহণ
প্রারম্ভিকদের জন্য, গেমের জগতের সময়ের ট্র্যাক রাখতে আপনার একটি পরিবর্তনশীল প্রয়োজন। আপনি এটি আপনার পছন্দমতোভাবে প্রয়োগ করতে পারেন, তবে এখানে একটি উদাহরণ রয়েছে। আমি একটি পরিবর্তনশীল নামক ব্যবহার করব hours
যা 0 থেকে 24 এর মধ্যে পরিবর্তিত হয় (যদিও এটি 24 এ পৌঁছায় এটি 0 এ ফিরে আসে)।
যদিও বাস্তব জীবনের বিপরীতে, আমি কেবল সেই দিনটি 0 ঘন্টা থেকে শুরু হয় এবং রাত 12 ঘন্টা শুরু হয় consider এটি কিছু গণনা সহজ করে তুলবে।
গেমের সময়টি বাস্তব সময়ের সাথে পরিবর্তিত হয় এমন হারটিও আমি সংজ্ঞায়িত করব। এই উদাহরণস্বরূপ, প্রতি দুই মিনিটের রিয়েল টাইম খেলায় এক ঘন্টার সাথে মিলবে।
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
}
কনফিগারেশন
এখন আমাদের সূর্যের গতিবিধি সেট করার আগে আমাদের এর কয়েকটি পরামিতি নির্দিষ্ট করতে হবে। বিশেষত, কোন এক্সের মান এটি দিগন্ত থেকে উত্থাপন করে এবং কোন X মান এটি দিগন্তের মধ্যে পড়ে। এছাড়াও, ওয়াই দিগন্তের সাথে কী সামঞ্জস্যপূর্ণ এবং তাঁর এই লাইনের ওপরে কতটা উঁচু হওয়ার কথা।
float startX = 0;
float endX = 1000;
float horizonY = worldHeight/2;
float amplitudeY = 200;
সূর্যের স্থানাঙ্ক গণনা করা হচ্ছে
দিনের নির্দিষ্ট সময়ের জন্য আমাদের সূর্যের অবস্থান গণনার এখন সময় time আমি জিমি দ্বারা ব্যবহৃত একই প্যারামিটারিক ফাংশনটি ব্যবহার করব তবে [0..2PI] এর পরিবর্তে ডোমেনের সাথে (সূর্যকে তার প্রকৃত অবস্থানে ফিরিয়ে আনার জন্য)
x = (1-কোস (টি)) / 2
y = পাপ (টি)
এটি একটি ভাল ফাংশন কারণ এক্স মান 0 থেকে 1 এবং তারপরে আবার 0 এ পরিবর্তিত হয় (যা আমরা আমাদের সূর্যের শুরু এবং শেষের এক্স মানগুলিতে ম্যাপিং করব) এবং Y মান 0 থেকে শুরু হয় এবং 1 এবং পিছনে চলে যায় আবার 0 তে (যা আমাদের দিনের অংশ হবে) এবং তারপরে আসল অবস্থানে ফিরে আসার আগে নেতিবাচক দিকটিতে ঠিক একই জিনিসটি পুনরাবৃত্তি করে (যা আমাদের রাত্রি হবে যদিও সূর্যটি এই সময়ে টানা হবে না)।
প্রথম পদক্ষেপটি [0..24) পরিসীমা থেকে আমাদের ফাংশনের পরিসীমা যা [0..2PI) এর পরিসীমা ঘটাচ্ছে:
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