Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ayuda, Camara 2D Xna

Iniciado por Darkgold, 19 de Agosto de 2011, 12:10:45 AM

« anterior - próximo »

Darkgold

Hola, me presento, llevo bastante tiempo leyendo vuestro foro y recomendandolo pero unca me habia dado por registrarme y participar dado que no considero que tenga los suficientes conocimientos para ello.
No soy de escribir post pero sta vez necesito su ayuda / sabiduria  :), he buscado en google y por todos lados pero no consigo comprender el problema que me ataña.

Estoy aprendiendo xna y quiero crear una camara 2D que para que se vaya viendo el juego conforme avanzas, decirles que ya he probado otras alternativas como la de mover el fondo y que de la sensacion de avance, pero quiero aprender todas las posibles y esta es otra de ellas.

He aqui el codigo que intento entender:

Código (csharp) [Seleccionar]
namespace camara_y_colision
{
 
   public class Game1 : Microsoft.Xna.Framework.Game
   {
       Texture2D animacion;
       Texture2D fondo;
       Matrix camara;
       int posCamX;
       int posCamY;
       Vector2 posicionSPRITE;


       GraphicsDeviceManager graphics;
       SpriteBatch spriteBatch;

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

     
       protected override void Initialize()
       {
           posicionSPRITE = new Vector2(400, 500);
           posCamX = 400;
           posCamY = 500;
           //BUFFER DE LA PANTALLA
           graphics.PreferredBackBufferWidth = 800;
           graphics.PreferredBackBufferHeight = 600;
           base.Initialize();
       }

       protected override void LoadContent()
       {
           spriteBatch = new SpriteBatch(GraphicsDevice);
           animacion= Content.Load<Texture2D>("img/animacion");
           fondo = Content.Load<Texture2D>("img/fondo1");
       }

       protected override void UnloadContent()
       {
         
       }

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

           if (Keyboard.GetState().IsKeyDown(Keys.Left))
           {
               if (posicionSPRITE.X >= 0)
                   posicionSPRITE.X -= 5;
               if ((posicionSPRITE.X >= 400) && (posicionSPRITE.X <= 800))
                   posCamX -= 5;
           }
           if (Keyboard.GetState().IsKeyDown(Keys.Right))
           {
               if (posicionSPRITE.X <= 1200 - seta.Height)
                   posicionSPRITE.X += 5;
               if ((posicionSPRITE.X <= 800) && (posicionSPRITE.X >= 400))
                   posCamX += 5;
           }
           if (Keyboard.GetState().IsKeyDown(Keys.Up))
           {
               if (posicionSPRITE.Y >= 0)
                   posicionSPRITE.Y -= 5;
               if ((posicionSPRITE.Y >= 300) && (posicionSPRITE.Y <= 500))
                   posCamY -= 5;
           }
           if (Keyboard.GetState().IsKeyDown(Keys.Down))
           {
               if (posicionSPRITE.Y < 800 - animacion.Height)
                   posicionSPRITE.Y += 5;
               if ((posicionSPRITE.Y <= 500) && (posicionSPRITE.Y >= 300))
                   posCamY += 5;
           }

         
           camara = Matrix.CreateTranslation(new Vector3(graphics.PreferredBackBufferWidth / 2, graphics.PreferredBackBufferHeight / 2, 0)) * Matrix.CreateTranslation(new Vector3(-posCamX, -posCamY, 0));


           base.Update(gameTime);
       }

       protected override void Draw(GameTime gameTime)
       {
           GraphicsDevice.Clear(Color.CornflowerBlue);
           spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate,SaveStateMode.SaveState, camara);
           spriteBatch.Draw(fondo, Vector2.Zero, Color.White);
           spriteBatch.Draw(animacion, posicionSPRITE, Color.White);
           spriteBatch.End();

           base.Draw(gameTime);
       }
   }
}


No consigo entender como se hace funcionar la camara con este codigo por mucho que toquetee y busque, ¿en que parte del codigo entra en juego la aparicion de la camara y su modificacion?

CitarspriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate,SaveStateMode.SaveState, camara);

1-    Supongo que en esa parte de codigo esta la clave para entender como se dibuja, como dibuja o como funciona la camara XD, pero no lo consigo      entender, he mirado la api de ms y tmp me aclara.

2-La "idea" que tengo es que al pulsar una tecla actualizamos la posicion de la camara, vale... pero ¿para que, si despues en Draw no dibujamos ninguna camara.?,.

Gracias de antemano, y Saludos!


Warchief

1) Primero se calcula la camara en Update


protected override void Update(GameTime gameTime)
{
  // ...
  camara = Matrix.CreateTranslation( blah )


Esa camara depende de posCamX y posCamY.

2) Luego se usa la camara en SpriteBatch, para transformar la posicion del sprite a coordenadas de pantalla

spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate,SaveStateMode.SaveState, camara);
http://msdn.microsoft.com/en-us/library/ff433701.aspx
transformMatrix
    Transformation matrix for scale, rotate, translate options.

Darkgold

Citar2) Luego se usa la camara en SpriteBatch, para transformar la posicion del sprite a coordenadas de pantalla

¿Entonces lo que se consigue metiendole la "camara" (matriz) al begin() es que dibuje los objetos en pantalla en la posicion obtenida mediante la multiplicacion:  (posicion del sprite) * (matriz)?

[EX3]

Cita de: Darkgold en 19 de Agosto de 2011, 10:38:55 AM
¿Entonces lo que se consigue metiendole la "camara" (matriz) al begin() es que dibuje los objetos en pantalla en la posicion obtenida mediante la multiplicacion:  (posicion del sprite) * (matriz)?
La camara al final no es mas que un desplazamiento de la escena, osea, los elementos que dibujas. Yo en un motor 2D propio que tengo lo que hago para implementar una camara es definir una coordenada global que se suma a la coordenada de cada objeto grafico (salvo que indique que este sea fijo en pantalla para mostrar marcadores o elementos de la interfaz) en el momento de dibujar toda la escena.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Warchief

Cita de: Darkgold en 19 de Agosto de 2011, 10:38:55 AM
Citar2) Luego se usa la camara en SpriteBatch, para transformar la posicion del sprite a coordenadas de pantalla

¿Entonces lo que se consigue metiendole la "camara" (matriz) al begin() es que dibuje los objetos en pantalla en la posicion obtenida mediante la multiplicacion:  (posicion del sprite) * (matriz)?

Si, pero ten en cuenta que la matriz en realidad es de transformacion = escala, rotacion y traslacion, no solo traslacion (posicion). Una matriz distinta puede rotar y deformar sprites. En el ejemplo, la matriz se crea a partir de Matrix.CreateTranslation, por eso no hay rotacion ni escalado, pero tambien se podria crear una camara que rotara las cosas en vez de trasladarlas mediante Matrix.CreateRotationY:
http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.matrix.createrotationy.aspx

Darkgold

Oks, muchas gracias a los dos entre sus comentarios mas un poco mas de toqueteo ya he comprendido x fin como funciona.

Saludos!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.