2012-09-12 11 views
6

Sono totalmente nuovo in questo e ho una domanda. Ho lavorato con un esercizio a scuola ea casa, ma non riesco a capire come farlo.Come posso disegnare un singolo sprite in posizioni casuali per 10 volte?

Il fatto è che voglio disegnare un singolo sprite su 10 posizioni casuali sullo schermo senza usare una classe speciale di sprite. Il mio problema è che dopo che sono stati disegnati spariscono di nuovo.

Risolto, grazie per tutto l'aiuto!

public class Game1 : Microsoft.Xna.Framework.Game 
{ 
    GraphicsDeviceManager graphics; 
    SpriteBatch spriteBatch; 

    Texture2D turtleTexture; 
    int counter = 0; 
    Random randomera = new Random(); 
    int x; 
    int y; 

    public Game1() 
    { 
     graphics = new GraphicsDeviceManager(this); 
     Content.RootDirectory = "Content";   
    } 

    protected override void Initialize() 
    { 
     base.Initialize(); 
    } 

    /// <summary> 
    /// </summary> 
    protected override void LoadContent() 
    { 
     spriteBatch = new SpriteBatch(GraphicsDevice); 
     turtleTexture = Content.Load<Texture2D>(@"Images/turtle_50x38"); 
    } 

    protected override void UnloadContent() 
    { 
    } 

    protected override void Update(GameTime gameTime) 
    { 
     if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) 
      this.Exit(); 

     /* 
     if(counter < 10) 
     { 
      x = randomera.Next(600); 
      y = randomera.Next(400); 
      counter++; 
     } 
     */ 

     base.Update(gameTime); 
    } 

    protected override void Draw(GameTime gameTime) 
    { 
     GraphicsDevice.Clear(Color.White); 

     spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend); 


     if (counter < 10) 
     { 
      for (int i = 0; i < 10; i++) 
      { 
       spriteBatch.Draw(turtleTexture, new Vector2(randomera.Next(600), randomera.Next(400)), 
        Color.Black); 
       counter++; 
      } 
     } 

     spriteBatch.End(); 
     base.Draw(gameTime); 
    } 
} 

}

+0

Vuoi dire che si desidera conservare fotogrammi precedenti visibile mentre si disegna più sprite? –

+0

Questo potrebbe essere più adatto in [GameDev] (http://gamedev.stackexchange.com) –

+0

Perché c'è 'if (counter <10)' nel tuo codice, se c'è 'for' loop che conta fino a 10 dopo che ? – Bartosz

risposta

7

Se si desidera che gli sprite si trovino sempre nelle stesse posizioni casuali e si cancelli ancora la vista (ad esempio, si desideri eseguire il rendering di altri contenuti), è possibile reimpostare il seme casuale ogni fotogramma sullo stesso valore:

protected override void Draw(GameTime gameTime) 
{ 
    randomera = new Random(seed); 
    GraphicsDevice.Clear(Color.White); 

    spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend); 


    if (counter < 10) 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      spriteBatch.Draw(turtleTexture, new Vector2(randomera.Next(600), randomera.Next(400)), 
       Color.Black); 
      counter++; 
     } 
    } 

    spriteBatch.End(); 
    base.Draw(gameTime); 
} 

dove il seme deve essere generata in modo casuale nel metodo Initialize(), e non può essere cambiato dopo.

Si può anche solo inizializzare lista con coordinate predefiniti:

List<Vector2> coords = Enumerable.Range(0, 10).Select(i => new Vector2(randomera.Next(600), randomera.Next(400)).ToList(); 

e utilizzare questo elenco nella vostra routine disegno:

for (int i = 0; i < 10; i++) 
{ 
    spriteBatch.Draw(turtleTexture, coords[i], 
     Color.Black); 
} 
+1

Funziona tecnicamente, ma non avrebbe più senso generare un array di 10 vettori nel costruttore e quindi utilizzarli? Ciò avrebbe l'ulteriore vantaggio di essere più facile da mantenere a lungo termine. – JDB

+0

Esattamente, ed ero nel mezzo di modificare la mia risposta per riflettere questo. Ora è anche lì. Immagino che volessi essere solo uno smart-seme casuale;) – Bartosz

+0

Vorrei evitare il primo approccio tutti insieme. Non riesco a immaginare nessuno scenario in cui sarebbe una buona idea. Il secondo è molto meglio. In futuro, sarebbe molto più facile esercitare un maggiore controllo dell'array, ad esempio avviando le tartarughe in posizione casuale ma facendole spostare sullo schermo, ecc. – JDB

1
GraphicsDevice.Clear(Color.White); 

questo cancella lo schermo (che significa tutto ciò in precedenza disegnato verrà cancellato). La funzione Draw in cui è contenuta questa istruzione è chiamata approssimativamente da 30 a 60 volte al secondo, e il tuo randomizer preleverà nuovi valori su ciascuna di queste iterazioni.

È corretto cancellare lo schermo su ogni iterazione di Draw, quindi piuttosto che scegliere le coordinate casuali su ogni chiamata a Draw, determinare le coordinate prima della mano. Un approccio migliore potrebbe essere quello di inizializzare una serie di 10 vettori nel costruttore, quindi utilizzare tale matrice nella funzione Disegna (anziché chiamare randomera.Next() ripetutamente).

EDIT: (.. Vedere la seconda metà della risposta di Bartosz per un esempio io non sono in grado di aprire il mio XNA IDE in questo momento, quindi non posso scrivere il codice di esempio per voi)

1

si sta chiamando Clear nel metodo draw

GraphicsDevice.Clear(Color.White); 

Questo cancellerà lo schermo.

Rimuovi questa riga e manterrà le cose estratte precedenti.

+0

Questa è una cattiva idea. Riempi il tuo schermo di sprite in un ordine estremamente breve poiché la tua funzione Draw verrà chiamata 30 volte al secondo o più. – JDB

+0

@ Cyborgx37 Non penso che tu abbia letto correttamente il suo codice. Trarrà 10 sprite e quindi smetterà di disegnare. Questo risolve il suo problema – Doomsknight

+0

Sì, hai ragione ... Ho perso quella parte. Ma rimuovere la funzione 'Clear' dall'applicazione è ancora una cattiva idea. È contro le migliori pratiche per un gioco XNA e ostacolerà qualsiasi utilizzo futuro di questa applicazione. Non penso sia una buona idea. – JDB

Problemi correlati