Học thuyết
Vì bạn không chỉ định nền tảng nào bạn đang thực hiện điều này, tôi sẽ đưa ra mô tả về thuật toán theo cách không thể biết ngôn ngữ:
- Đầu tiên xếp chồng từng thẻ lên nhau bằng cách cho chúng cùng một vị trí ban đầu.
- Sau đó, đối với mỗi thẻ áp dụng một vòng quay (thường tập trung quanh một trong các góc dưới cùng , nhưng việc di chuyển nguồn gốc này xung quanh sẽ rất cần thiết cho phép bạn điều chỉnh giao diện của quạt).
- Tăng góc xoay giữa mỗi cuộc gọi , tùy thuộc vào số lượng thẻ và mức độ bạn muốn chúng được trải đều.
Việc xoay được tập trung xung quanh một trong các góc dưới cùng của thẻ (hoặc gần góc) nên rõ ràng khi nhìn vào nó:
Thực hiện
Đối với cách thực hiện điều này, nó phụ thuộc vào nền tảng của bạn. Trên XNA, bạn chỉ cần sử dụng tham số Origin SpriteBatch.Draw
để thay đổi tâm xoay của mình.
Đây là những gì tôi nhận được với đoạn mã sau (với một vài điều chỉnh về điểm gốc để làm cho nó trông đẹp hơn - về cơ bản nguồn gốc bắt đầu ở gần góc phải và kết thúc ở gần góc bên trái):
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();
Và kết quả: