Dalga dalgalanma etkisi?


9

Bir süredir kule savunma oyunu üzerinde çalışıyorum ve şimdiye kadar sonuçlardan gerçekten memnunum. Ancak, eklemek istediğim bir şey var.

Windows Phone 7 için GeoDefense videosunu burada gördüm: http://www.youtube.com/watch?v=YhPr4A4LRPQ

Bir birimin nasıl öldürüldüğü veya merminin bir birime çarptığı zaman, arka planın bir tür dalga etkisi ile dalgalandığına dikkat edin.

Nasıl eşdeğer yapabilirim? Bir şekilde tepe gölgeleyicisinde, birçok köşeden yapılmış bir dörtlü ile yapmam gerektiğini düşünüyorum.

Çağrın ne?

Düzenle XNA oyunumun Windows telefon için değil, Windows PC'ler için yapıldığına dikkat etmek önemlidir.

Yanıtlar:


8

Bunu - Sorun Windows Phone XNA özel shader desteği yok olmasıdır edemez bir vertex shader veya pixel shader yazın. Ancak, aynı etkiyi elde etmek için köşe ızgarasını deforme eden Catalin Zima tarafından tarif edilen bir numara kullanabilirsiniz .

Windows Phone 7'yi hedeflemiyorsanız, blogumda açıkladığım bir hile kullanabilirsiniz . İlgili bitlerin kopyalanması:

Bu deformasyonlar 2 resim gerektirir. Öncelikle tüm sahneyi bir oluşturma hedefi (örn. Texture2D) ve deformasyon oluşturma hedefi olarak gerekir. Genellikle, bozulma oluşturma hedefini doldurmak için bir parçacık sistemi kullanırsınız; özel distorsiyon sprite kullanarak (aşağıdaki örnek).

Bozulma hedefindeki (ve bozulma spritelarındaki) her renk bileşeni aşağıdakileri temsil eder:

  • R : dx: X ofseti - f (x) = 2x-1 eşleme ([0,0f, 1,0f] ila [-1,0f, 1,0f]).
  • G : dy: Y ofseti - f (x) = 2x-1 eşleme.
  • B : m: Z gücü - f (x) = x haritalama.

Bir dalgalanma için kullanılacak bir sprite örneği:

Dalgalanma Sprite

Bir dalgalanmanın sonucunu belirlemek, dalgaları bir araya getirmek kadar basittir (önce [-1.0f, 1.0f] 'ye yapmanız gereken haritalamayı unutmayın); çünkü gerçekte dalgalar da toplanır bu sadece işe yarıyor - gerçek dalgaların çok iyi yaklaşımlarını alacaksınız.

İki oluşturma hedefine sahip olduğunuzda, aşağıdaki gölgelendiriciyi kullanabilirsiniz:

Texture InputTexture; // The distortion map.
Texture LastTexture; // The actual rendered scene.

sampler inputTexture = sampler_state
{
    texture = <InputTexture>;
    magFilter = POINT;
    minFilter = POINT;
    mipFilter = POINT;
};

sampler lastTexture = sampler_state
{
    texture = <LastTexture>;
    magFilter = LINEAR;
    minFilter = LINEAR;
    mipFilter = LINEAR;
    addressU = CLAMP;
    addressV = CLAMP;
};

struct VS_OUTPUT
{
    float4 Position : POSITION;
    float2 TexCoords : TEXCOORD0;
};

float4 Distort (VS_OUTPUT Input)
{
    float4 color1;
    float4 color2;
    float2 coords;
    float mul;

    coords = Input.TexCoords;
    color1 = tex2D(inputTexture, coords);

    // 0.1 seems to work nicely.
    mul = (color1.b * 0.1);

    coords.x += (color1.r * mul) - mul / 2;
    coords.y += (color1.g * mul) - mul / 2;

    color2 = tex2D(lastTexture, coords);

    return color2;
}

float4 RunEffects (VS_OUTPUT Input) : COLOR0
{
    float4 color;

    color = Distort(Input);

    return color;
}

technique Main
{
    pass P0
    {
        PixelShader = compile ps_2_0 RunEffects();
    }
}

Bu nihai etki:

Dalga etkisi

Bu teknik 3D oyunlar için de çalışmalıdır; parçacık gölgelendiricisine ve bozulma gölgelendiricisine daha fazla düşünce ayırmanız gerekebilir.


Windows Phone için oyun yapmıyorum. Sorumu güncelledim.
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen Blogumdan bazı içerikleri kaldırdım ve cevaba koydum, umarım size iyi bir başlangıç ​​noktası verir.
Jonathan Dickinson

Telefon örneği güzel ve tam olarak yapmaya çalıştığım şey bu. Ne yazık ki, efektin dünyayla birlikte hareket etmesini ve ekran koordinatlarına dayanmamasını istiyorum. Mümkün mü?
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen Kesinlikle mümkün, ama inanılmaz derecede pahalı olacak - bu durumda benim çözümüm için gitmenizi tavsiye ederim. Eğer bulabilirsem size kodu postalayacağım; sürece benim sanat hiçbirini kullanmak için söz veriyorum :).
Jonathan Dickinson

@Jonathan Dickinson Bize güncellenmiş XNA 4 kodunu verir misiniz?
Amir Rezaei
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.