Theorie
Da Sie nicht angegeben haben, auf welcher Plattform Sie dies implementieren, werde ich den Algorithmus sprachunabhängig beschreiben:
- Erste stapeln jede Karte auf der jeweils anderen von ihnen die gleiche Ausgangslage zu geben.
- Wenden Sie dann für jede Karte eine Drehung an (normalerweise zentriert um eine der unteren Ecken , aber wenn Sie diesen Ursprung verschieben, können Sie das Aussehen des Lüfters ändern).
- Erhöhen Sie den Drehwinkel zwischen den einzelnen Aufrufen , abhängig von der Anzahl der Karten und der gewünschten Verteilung.
Dass die Drehung um eine der unteren Ecken der Karte (oder in der Nähe der Ecke) zentriert ist, sollte sich aus dem Blick ergeben:
Implementierung
Wie dies implementiert wird, hängt von Ihrer Plattform ab. In XNA können Sie einfach den Origin-Parameter von verwenden SpriteBatch.Draw
, um den Mittelpunkt Ihrer Rotation zu ändern.
Folgendes habe ich mit folgendem Code erhalten (mit ein paar Änderungen am Ursprung, damit er besser aussieht - im Grunde beginnt der Ursprung in der Nähe der rechten Ecke und endet in der Nähe der linken Ecke):
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();
Und das Ergebnis: