Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 20 di 53
  • livello principiante
Indice lezioni

Profondità, rotazione e scala

Cambiare l'ordine di apparizione degli elementi e applicare le trasformazioni principali
Cambiare l'ordine di apparizione degli elementi e applicare le trasformazioni principali
Link copiato negli appunti

Una delle prime necessità che incontreremo è quella di forzare i nostri sprite ad apparire su schermo secondo un ordine differente da quello delle rispettive chiamate a Draw e DrawString. Per fare questo possiamo assegnare una profondità (il parametro layer depth)per ciascuna chiamata a Draw o DrawString che indica quanto distante dal piano dello schermo sarà disegnata quella entità.

Impostiamo l'ordine di disegno in modo tale che i pixel delle operazioni alle profondità maggiori siano coperti dai pixel delle operazioni a profondità minori:

sprite_batch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);

disegniamo un asteroide prima (ma con profondità minore):

sprite_batch.Draw(asteroid, new Rectangle(50, 50, 100, 100), null, Color.White, 0.0f, Vector2.Zero, SpriteEffects.None, 0.0f);

e una scritta dopo (ma con profondità maggiore):

Figura 28. La scritta appare dietro l'asteroide
La scritta appare dietro l'asteroide

Se avessimo usato la stessa profondità, o non avessimo impostato l'ordinamento nella chiamata a SpriteBatch.Begin, allora il risultato avrebbe rispettato l'ordine delle chiamate a Draw e DrawString:

Figura 29. La scritta appare davanti l'asteroide
 La scritta appare davanti l'asteroide

Rotazione e scala

Possiamo applicare una rotazione ad una chiamata di Draw impostando il parametro appropriato ad un valore diverso da 0.

Come parametro di rotazione possiamo usare qualcosa di dipendente dalla logica interna del gioco, dall'input, o dal tempo. Nel nostro caso usiamo come angolo di rotazione il numero di minuti dall'avvio del gioco; oltre alla rotazione dobbiamo anche indicare (rispetto alle dimensioni del source rectangle) il centro di rotazione, o origine:

sprite_batch.Draw(asteroid, new Rectangle(400, 240, 800, 480),
    new Rectangle(0, 0, asteroid.Width * 10, asteroid.Height * 7),
    Color.White,
    (float)gameTime.TotalGameTime.TotalMinutes,
    new Vector2(asteroid.Width * 10, asteroid.Height * 7) / 2,
    SpriteEffects.None, 0.0f);

Figura 30. Gli asteroidi stanno ruotando
Gli asteroidi stanno ruotando

Un esempio un pochino più semplice, in cui non usiamo né il source rectangle né il destination rectangle, bensì la posizione e la scala, è:

Figura 31. L'asteroide ingrandito e ruotato
L'asteroide ingrandito e ruotato

dove senza né rotazione né scala avremmo ottenuto:

Figura 32. L'asteroide 'originale'
L'asteroide 'originale'

Ti consigliamo anche