\\ Home : Articoli : Stampa
Sprite
Di robydx (del 19/01/2007 @ 20:14:46, in DirectX9, linkato 3307 volte)

Uno sprite è una texture che non viene utilizzata su un modello ma renderizzata come immagine 2D. Dato che DirectDraw è separato da Direct3D è necessario un controllo di base per tutta la grafica bidimensionale che può servire.  Per usare uno sprite è necessario creare un controller (conviene in fase di inizializzazione).

Per creare uno sprite

Public sprite As Sprite
sprite = New sprite(device)

Create una texture come mostrato nei precedenti tutorial. Ora il colore trasparente conta dato che sarà effettivamente trasparente. La cosa è fondamentale dato che un'immagine è sempre rettangolare e impostando lo sfondo trasparente avrete sullo schermo solo il disegno senza lo sfondo.

All'interno del blocco device.BeginScene , Device.EndScene dovete ora creare un nuovo blocco per lo sprite

sprite.Begin(SpriteFlags.None)
'Rendering
sprite.End()

Questo serve ad ottimizzare il processo di rendering. Le opzioni sono molto importanti. Iniziamo dalle principali

  • None  (o assente nel caso di combinazione con altri effetti)  : renderizza senza usare il colore di trasparenza
  • Alphablend  : usa il colore di trasparenza della texture per non farlo comparire

Esistono diversi 2 tipi di rendering: screen space e object space.

Screenspace:

questa è l'impostazione in pixel per lo schermo. La texture può essere stampata in 2D tramite 2 istruzioni.

Draw2D

sprite.Draw2D(tex1, New Point(0, 0), 0, New Point(200, 200), Color.White)

Il primo point indica il centro di rotazione rispetto l'angolo alto-sinistro , il single indica l'angolo di rotazione in radianti, il secondo point la posizione in pixel ed infine il colore di viraggio. Esistono 6 varianti per l'istruzione, alcuni permettono di specificare la posizione iniziale e finale tramite rettangoli (in modo da indicare la porzione da utilizzare), o di dare solo la posizione. L'editor è molto chiaro per questo. Attenzione però a questa prima forma. La posizione del centro non è solo il centro di rotazione: ma è addirittura il centro di riferimento. Ad esempio inserendo 100,100 come centro e 300,100 come posizione sullo schermo lo sprite apparirà in 200,0. Questo rende molto complesse le rotazioni.

Draw

Questa è un rendering in 3D (anche se piano).

sprite.Transform = Matrix.Transformation2D(New Vector2(0, 0), 0, New Vector2(2, 2), New Vector2(64, 64), angolo * rad, New Vector2(200, 150))
sprite.Draw(tex1, New Rectangle(0, 0, 128, 128), New Vector3(0, 0, 0), New Vector3(0, 0, 0), Color.White)

In pratica viene generata una matrice 2D e passata allo sprite. Il Draw specifica la dimensione della texture, il centro rispetto alla texture (a 3 dimensioni) e la posizione (anch'essa a 3 dimensioni).  Potrete in questo modo compiere rotazioni e movimenti avanti ed indietro. Tuttavia non potrete finchè non passerete al vero draw in objectSpace

aggiungete ai flaqs Or SpriteFlags.ObjectSpace

Ora l'oggetto è renderizzato come sprite (quindi non più in pixel). Ora potrete usare le matrici 3D da passare. Prima però di iniziare la beginscene dovrete passare la telecamera da usare (siamo in 3D ora).

sprite.SetWorldViewLH(WorldMatrix, ViewMatrix)

Anche la matrice world iniziale influenzerà tutti gli sprite. Al posto dell matrice 2D ora passate una normale matrice alla istruzione matrix.Transform. Ruotando le matrici (o la telecamera), gli oggetti saranno dei veri e propri sprite 3D (ruoteranno quindi su se stessi). Come ultima opzione interessante c'è il flaqs

SpriteFlags.Billboard

Questo abbinato a ObjectSpace farà in modo che gli sprite siano, si in 3D, ma che rivolgano la faccia sempre alla telecamera (in pratica non vi serve più il billboard 3D visto che ci pensa lui in automatico).

Le funzioni di trasformazione sono estese anche al testo. Se passate lo sprite al testo all'interno del blocco infatti anchessò potrà ruotare o essere deformato dalla matrice.

testo.DrawText(sprite, "testo", New Rectangle(0, 0, 400, 400), DrawTextFormat.Left, Color.White)

Anche il testo ora ha altre opzioni. Invece di passare il rettangolo ed il flags drawTextFormat potete passare 2 single per la posizione

Molto importante, in VB.Net sembra ci sia un bug per il quale non potete usare il rettangolo ma solo i 2 single. Questo è un errore che ho incontrato. In C# non è invece presente. Vi lascio ad un esempio

Esempio VB.Net

Esempio C#