Seperti kata Jimmy, elips mungkin lebih cocok untuk gerakan ini. Berikut adalah beberapa ide tentang bagaimana sebenarnya mengimplementasikannya dengan sedikit lebih detail bagi mereka yang tertarik.
Mengambil waktu
Sebagai permulaan, Anda membutuhkan variabel untuk melacak waktu di dunia game. Anda dapat menerapkannya dengan cara apa pun yang Anda suka, tetapi inilah sebuah contoh. Saya akan menggunakan variabel yang dipanggil hours
yang bervariasi dari 0 hingga 24 (meskipun ketika mencapai 24 itu akan kembali ke 0).
Tidak seperti kehidupan nyata, saya hanya akan mempertimbangkan hari itu dimulai pada 0 jam, dan malam dimulai pada 12 jam. Ini akan membuat beberapa perhitungan lebih mudah.
Saya juga akan menentukan tingkat perubahan waktu permainan dalam kaitannya dengan waktu nyata. Dalam contoh ini, setiap dua menit waktu nyata akan sesuai dengan satu jam dalam permainan.
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
}
Konfigurasi
Sekarang sebelum mengatur gerakan matahari kita, kita perlu menentukan beberapa parameternya. Secara khusus, pada nilai X apa yang dinaikkannya dari cakrawala, dan pada nilai X apa nilai itu jatuh ke cakrawala? Juga, apa yang Y sesuai dengan cakrawala, dan seberapa tinggi dia seharusnya naik di atas garis itu.
float startX = 0;
float endX = 1000;
float horizonY = worldHeight/2;
float amplitudeY = 200;
Menghitung Koordinat Matahari
Sekarang saatnya menghitung posisi matahari kita untuk waktu tertentu dalam sehari. Saya akan menggunakan fungsi parametrik yang sama yang digunakan oleh Jimmy tetapi dengan domain mulai dari [0..2PI] sebagai gantinya (untuk membawa matahari kembali ke posisi semula saat fajar):
x = (1-cos (t)) / 2
y = dosa (t)
Ini adalah fungsi yang baik karena nilai X bervariasi dari 0 hingga 1 dan kemudian kembali ke 0 lagi (yang akan kami pemetaan ke nilai X awal dan akhir matahari) dan nilai Y dimulai dari 0 dan bergerak ke 1 dan kembali ke 0 lagi (yang akan menjadi porsi hari kita ) dan kemudian mengulangi hal yang sama persis di sisi negatif sebelum kembali ke posisi semula (yang akan menjadi malam kita meskipun matahari tidak akan ditarik pada titik ini).
Langkah pertama adalah penskalaan jam dari rentang [0..24) ke rentang fungsi kami yaitu [0..2PI):
float t = (hours / 24f) * MathHelper.TwoPi; // Scale: [0..24) to [0..2PI)
Selanjutnya kita menerapkan fungsi untuk mendapatkan kembali nilai antara 0 dan 1 yang saya bicarakan di atas:
float horizontal = (float)((1-Math.Cos(t)) / 2f); // Changes: 0 1 0
float vertical = (float)(Math.Sin(t)); // Changes: 0 1 0 -1 0
Dan akhirnya kami skala nilai-nilai itu menggunakan parameter matahari:
float sunX = startX + (endX - startX) * horizontal; // From startX to endX and back
float sunY = horizonY + amplitydeY * vertical; // Up and down around horizonY