Bir el kartını nasıl eşit olarak havalandırabilirim?


20

Bir dizi oyun kartı (genişlik ve yükseklikteki dikdörtgen görüntüler) göz önüne alındığında, her birini bir 'fan' deseninde görünecek şekilde nasıl döndürebilirim ve konumlandırabilirim, tıpkı gerçek hayatta bir elinizi tutacağınız gibi. Bunu yapmak için hangi matematik gereklidir?

GÜNCELLEME

JavaScript tarayıcı uygulamasında son nokta: https://cosmicrealms.com/blog/2013/03/16/hand-of-cards/ ve http://jsfiddle.net/tyyvk/108/


9
Efendim, elinizde çok fazla as var gibi görünüyor. Lütfen masadan uzaklaşın.
Tomas Andrle

Kemanın MooTools'un sonraki bir sürümünü kullanmak için güncellenmesi gerekiyor.
tomdemuyt

Yanıtlar:


30

teori

Bunu hangi platformda uyguladığınızı belirtmediğiniz için, algoritmanın dile agnostik bir şekilde bir açıklamasını vereceğim:

  1. Önce aynı başlangıç ​​pozisyonunu vererek her kartı üst üste istifleyin .
  2. Daha sonra her kart için bir rotasyon uygulayın (genellikle alt köşelerden birinin etrafında ortalanır , ancak bu orijini hareket ettirmek aslında fanın görünümünü değiştirmenize izin verir).
  3. Kart sayısına ve ne kadar yayılmasını istediğinize bağlı olarak her arama arasındaki dönüş açısını artırın.

Bu rotasyon kartın alt köşelerinden birinde etrafında merkezli (ya da köşesine yakın) bakarak gelen belirgin olmalıdır:

resim açıklamasını buraya girin


uygulama

Bunu nasıl uygulayacağınıza gelince, platformunuza bağlıdır. XNA'da SpriteBatch.Draw, rotasyonunuzun merkezini değiştirmek için konumunda Origin parametresini kullanabilirsiniz .

İşte aşağıdaki kod ile ne var (daha iyi görünmesini sağlamak için kökeni birkaç tweaks ile - temelde kökeni sağ köşede başlar ve sol köşede biter):

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();

Ve sonuç:

resim açıklamasını buraya girin


7
Görünümün farklı bir dönme merkezi kullanılarak ayarlanabileceğini, daha küçük bir yayı yaymak istiyorsanız, kartın altında bulunan bir dönme noktası kullanmanız gerektiğini ekliyorum.
aaaaaaaaaaaa

@eBusiness Haklısın, bunu ekleyeceğim.
David Gouveia

Çok teşekkürler David! JavaScript'te gösterdiğiniz kodu burada uyguladım
Sembiance
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.