Teori
Karena Anda tidak menentukan dalam platform apa Anda menerapkan ini, saya akan memberikan deskripsi algoritma dengan cara agnostik bahasa:
- Pertama, susun setiap kartu saling bertumpukan dengan memberi mereka posisi awal yang sama.
- Kemudian untuk setiap kartu menerapkan rotasi (biasanya berpusat di sekitar salah satu sudut bawah , tetapi memindahkan asal-usul ini pada dasarnya akan memungkinkan Anda untuk mengubah tampilan kipas).
- Menambah sudut rotasi antara setiap panggilan , tergantung pada jumlah kartu dan seberapa banyak Anda ingin tersebar.
Bahwa rotasi terpusat di sekitar salah satu sudut bawah kartu (atau di dekat sudut) harus jelas dari melihatnya:
Pelaksanaan
Adapun cara mengimplementasikannya, itu tergantung pada platform Anda. Pada XNA Anda cukup menggunakan parameter Origin SpriteBatch.Draw
untuk mengubah pusat rotasi Anda.
Inilah yang saya dapatkan dengan kode berikut (dengan beberapa penyesuaian ke asal agar terlihat lebih baik - pada dasarnya asal dimulai di dekat sudut kanan dan berakhir di dekat sudut kiri):
int cards = 20;
float range = MathHelper.ToRadians(90);
float initialAngle = MathHelper.ToRadians(-45);
float increment = range / cards;
Vector2 leftCorner = new Vector2(0, texture.Height * 0.9f);
Vector2 rightCorner = new Vector2(texture.Width, texture.Height * 0.9f);
Vector2 fanPosition = new Vector2(400, 300);
spriteBatch.Begin();
for (float angle = 0; angle < range; angle+=increment)
{
float cardAngle = initialAngle + angle;
Vector2 cardOrigin = Vector2.Lerp(rightCorner, leftCorner, angle / range);
spriteBatch.Draw(texture, fanPosition, null, Color.White, cardAngle, cardOrigin, 1f, SpriteEffects.None, 0f);
}
spriteBatch.End();
Dan hasilnya: