2012-09-12 19 views
6

Soy totalmente nuevo en esto y tengo una pregunta. Trabajé con un ejercicio en la escuela y en casa pero no puedo encontrar la forma de hacerlo.¿Cómo puedo dibujar un solo sprite en posiciones aleatorias 10 veces?

La cuestión es que quiero dibujar un solo sprite en 10 posiciones aleatorias en la pantalla sin usar una clase de sprite especial. Mi problema es que después de que se dibujan desaparecen de nuevo.

¡Lo resolvió, gracias por toda la ayuda!

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

Qué quiere decir que desea mantener fotogramas anteriores visible mientras se dibuja más ¿sprites? –

+0

Esto podría ser más adecuado en [GameDev] (http://gamedev.stackexchange.com) –

+0

¿Por qué hay 'if (contador <10)' en su código, si hay 'for' loop que cuenta a 10 después de eso ? – Bartosz

Respuesta

7

Si desea tener sus sprites en las mismas posiciones aleatorias todo el tiempo y seguir borrando su ventana gráfica (por ejemplo, puede querer representar otro contenido) puede restablecer la semilla aleatoria en cada fotograma al mismo valor:

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

donde la semilla debe ser generada de forma aleatoria en el método de Initialize(), y no se puede cambiar después de eso.

Es posible que también acaba de lista inicializar con coord predefinidos:

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

y utilizar esta lista en su rutina de dibujo:

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

Esto funciona técnicamente, pero ¿no tendría más sentido generar una matriz de 10 vectores en el constructor y luego usarlos? Esto tendría el beneficio adicional de ser más fácil de mantener a largo plazo. – JDB

+0

Exactamente, y estaba en medio de mi respuesta para reflejar eso. Ahora está ahí también. Supongo que solo quería ser sabelotodo al azar;) – Bartosz

+0

Me atrevería a alejarme del primer enfoque todos juntos. No puedo imaginar ningún escenario donde esta sea una buena idea. El segundo es mucho mejor. En el futuro, sería mucho más fácil ejercer un mayor control de la matriz, como comenzar las tortugas en posición aleatoria, pero luego hacer que se muevan sobre la pantalla, etc. – JDB

1
GraphicsDevice.Clear(Color.White); 

Esto borra la pantalla (es decir, nada dibujado previamente se borrarán). La función Dibujar en la que se contiene esta instrucción se llama aproximadamente de 30 a 60 veces por segundo, y su aleatorizador obtendrá nuevos valores en cada una de estas iteraciones.

Es correcto borrar la pantalla en cada iteración de Draw, por lo que en lugar de elegir coordenadas al azar en cada llamada a Draw, determine las coordenadas antes de la mano. Un mejor enfoque podría ser inicializar una matriz de 10 vectores en su constructor, luego usar esa matriz en su función Draw (en lugar de llamar al randomera.Next() una y otra vez).

EDIT: (.. Véase la segunda mitad de la respuesta de Bartosz para un ejemplo que no soy capaz de abrir mi IDE XNA en el momento, así que no puedo escribir el código de ejemplo para usted)

1

Usted está llamando Clear en su método de sorteo

GraphicsDevice.Clear(Color.White); 

Esto borrará la pantalla.

Elimina esta línea y mantendrá las cosas dibujadas anteriormente.

+0

Esta es una mala idea. Va a llenar su pantalla con sprites en un orden extremadamente corto ya que su función Draw se llamará 30 veces por segundo o más. – JDB

+0

@ Cyborgx37 No creo que hayas leído su código correctamente. Dibujará 10 sprites y luego dejará de dibujar. Esto soluciona su problema – Doomsknight

+0

Sí, estás en lo correcto ... Me perdí esa parte. Pero eliminar la función 'Clear' de la aplicación sigue siendo una mala idea. Va en contra de las mejores prácticas para un juego XNA y obstaculizará cualquier uso futuro de esta aplicación. No creo que esta sea una buena idea. – JDB

Cuestiones relacionadas