2011-10-01 16 views
8

Mi problema es que necesito representar un suelo que cambie de longitud usando un Texture2D, lo que significa un piso que los lados tienen la imagen de los lados, y en el medio repite el mismo 'medio 'imagen, como así: enter image description hereGenerando un Texture2D a partir de varios Texture2Ds

Para lograr esto, me sale el' borde izquierdo ', el' medio 'y el' borde derecho 'texturas, el problema es que no sé cómo combinarlas en una sola texture2D,

Es importante hacerlo en tiempo de ejecución porque la longitud del piso está cambiando (horizontalmente), He leído que puede hacer eso usando SetData pero no tengo ni idea de cómo ...

Es muy importante para mí que actúe como una textura y no como varias partes de textura porque estoy usando el motor de física de Farseer para mover el piso y usarlo.

estoy usando C# y XNA con Visual Studio 2010, soy un casi-experimentado programador de C#,

Gracias!

Respuesta

1

Primero, cree una nueva Texture2D para que sirva como la textura de su piso, especificando el ancho y la altura apropiados. Luego, obtenga los datos de las tres texturas que desea combinar, usando el GetData method. Finalmente, use SetData method para establecer los datos de la textura nueva según corresponda (consulte el enlace, puede especificar el índice de inicio).

Advertencia: Los métodos GetData y SetData son lentos. Si necesita crear esta textura solo una vez por juego (en la inicialización, por ejemplo), no es un problema.

+0

¿Y si necesito para crearlos muchas veces? – Itamar

+0

Entonces la estrategia sugerida en la respuesta a continuación es mejor. –

+0

@MajaRemic Código de ejemplo? – matrixugly

2

This answer puede ayudarlo. O bien, debe usar HLSL para repetir su piso o debe dibujar su piso en un RenderTarget y guardarlo como textura única. Disfrutar.

+0

¿Qué es HLSL, y puede dar un ejemplo de segunda solución, por favor? – Itamar

+2

Aquí hay un pequeño tutorial sobre [Render Target] (http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series3/Render_to_texture.php). Además, si revisas esa página un poco más, encontrarás muchos otros tutoriales, incluido HLSL. –

+0

No hay necesidad de escribir su propio sombreador HLSL para esto, ya que no hará nada que SpriteBatch no pueda manejar. –

1

que está utilizando clarividente ... pero no prohíbe el uso de un enfoque de mosaico ...

No sé clarividente, pero supongo que proporciona una matriz de transformar ...

hacer:

Vector2 pos = Vector2.Zero; 
spriteBatch.Begin(...,....,...,..., Transform); 

spriteBatch.Draw(LeftTexture, pos, null, Color.White); 
pos.X += LeftTexture.Width; 
for (int i=0; i<floor_repeats; i++) 
{ 
    spriteBatch.Draw(MidleTexture, pos , null, Color.White); 
    pos.X += MiddleTexture.Width; 
} 
spriteBatch.Draw(RightTexture, pos , null, Color.White); 
Cuestiones relacionadas