comenzando con XNA..primeras dificultades..

Hola buenas tardes,

desgraciadamente ahora tengo mucho tiempo libre por las tardes(reduccion de jornada en el trabajo) y he decidido dedicarle parte de mi tiempo libre a la programacion.

Me he decidido por XNA, por que se puede portar a xbox360,dicho esto expongo mi duda,que seguramente sea una tonteria tremendapero no se como se hace y por eso lo pregunto.

Por lo que he leido se programa en c++,del cual no tengo ni puñetera idea,pero para lo que estoy haciendo ahora mismo me sobra con ir entendiendo el codigo de los tutoriales,que es una forma de ir aprendiendo.

supongo que todos sabeis lo que es una "clase" "atributos de una clase" "metodos" el "constructor",......y un largo etc de terminologia que espero poco a poco ir familiarizandome con ella.
Pues Bien,despues de este ladrillo:



namespace disparo2
{


    class Disparo  //DEFINICION DE LA CLASE
    {

        //DEFINICION DE ATRIBUTOS///

        //textura de la nave
        public Texture2D TexturaDisparo;

        //posicion de la nave
        public Vector2 PosicionDisparo;
        // velocidad
        public Vector2 VelocidadDisparo;

        private ContentManager _Content;

        public void Initialize()  // el metodo initialize establece las propiedades iniciales de  la clase
        {

            if
                (VelocidadDisparo.Y >= 0)
                VelocidadDisparo.Y--;
        }

        public void LoadContent(ContentManager Content)
 
        {

            this._Content = Content;
            TexturaDisparo = Content.Load<Texture2D>("textures/nave");

            //PosicionInfo = Content.Load<SpriteFont>("Font/menu");

            PosicionDisparo = new Vector2(600, 600);
       
           
        }
        public void Update()
        {
            DibujarDisparo();
            Avancedisparo();
     
        }

        public void DibujarDisparo( )

        {
            KeyboardState teclado;
            teclado = Keyboard.GetState();


            if (teclado.IsKeyUp(Keys.Up) && PosicionDisparo.Y >= 0)

                Draw.draw(spriteBatch);
        }


        public void Avancedisparo()
        {
            PosicionDisparo.Y -= 1;
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(TexturaDisparo, PosicionDisparo, Color.White);//dibujamos la nave

        }

    }
}




Como se hace para dibujar elementos "anidados". quiero que se pulse la tecla y se dibuje el sprite que se moverça según el proceso update de la clase.

seguro que es una tonteria,pero es lo que tiene ser autodidacta....

¿hay que hacer otra clase? y "enlazarla" a esta?
lo que quiero basicamente es que aparezca el sprite cuando le de a una tecla.

Gracias por adelantado¡¡¡¡¡


edit:

he avanzado algo..bastatante para mi jejeje.


ya sale el sprite cuando le doy a la tecla,hablando rapido y mal......habia que crear una lista,almacenarla y dibujar cada elemento de dicha lista....pero..... por que no se me repite la accióncada vez que pulso la tecla?

el codigo



    class Disparo  //DEFINICION DE LA CLASE
    {

        //DEFINICION DE ATRIBUTOS///

        //textura de la nave
        public Texture2D TexturaDisparo;

        //posicion de la nave
        public Vector2 PosicionDisparo;
        // velocidad

        //Lista de disparos:
        List<Disparo> disparos = new List<Disparo>();

        private ContentManager _Content;

        public void Initialize()  // el metodo initialize establece las propiedades iniciales de  la clase
        {
     
        }

        public void LoadContent(ContentManager Content)
 
        {

            this._Content = Content;
            TexturaDisparo = Content.Load<Texture2D>("textures/nave");

            //PosicionInfo = Content.Load<SpriteFont>("Font/menu");

            PosicionDisparo = new Vector2(600, 600);
         
        }
        public void Update()
        {

            creardisparo();
            avancedisparo();
           
        }

        public void avancedisparo()
        {
            PosicionDisparo.Y -= 1;
        }

        public void creardisparo( )

        {
            KeyboardState teclado;
            teclado = Keyboard.GetState();


            if (teclado.IsKeyDown(Keys.Up))
         
            {
               
                Disparo disparo = new Disparo();
           
                PosicionDisparo = new Vector2(PosicionDisparo.X , PosicionDisparo.Y );

                disparos.Add(disparo);
               
            }
        }



        public void Dibujardisparo(SpriteBatch spriteBatch)
        {
            foreach(Disparo s in disparos)
       
            spriteBatch.Draw(TexturaDisparo, PosicionDisparo, Color.White);

        }

   
    }
}

Buenas.

Yo tambien estoy empezando con XNA y la verdad que ando igual de perdido que tú. :-?

¿No puede ser que en la funcion que usas para mover el disparo tengas que poner un bucle como el que tienes en el draw para ir modificando la coordenada Y de cada disparo?

A ver si algún entendido te ayuda mejor.

Si quieres empezar algún proyecto no dudes en ponerte en contacto conmigo.

Saludos.
Lo mejor para aprender a programar juegos en mi opinión es BennuGD seguido de Game Maker.
Si quieres programar en C++ mi recomendación es que utilizes un buen libro de introducción a la programación en C++/C porque eso de ir entendiendo el código de los tutoriales te puedo asegurar que nunca es suficiente.
Uno tiene que aprender a expresar sus algoritmos de forma natural en el lenguaje de programación que esté usando.

En resumen:

Si quieres aprender a programar videojuegos de forma "divertida" moviendo monigotes por la pantalla desde el momento 0 , utiliza BennuGD y si quieres cojer el camino rápido y hacer un juego sin tener ni idea de programación utiliza Game Maker.

http://www.bennugd.org/

BennuGD es un lenguaje interpretado y tiene interpretes para muchas plataformas , incluyendo Windows , GNU/Linux , Wii , Xbox , Dreamcast , PS2 , Android y un largo etc

Unos cuantos juegos que programados en BennuGD:
http://www.youtube.com/watch?v=qFTYAxsF9GQ#t=77
http://www.youtube.com/watch?v=i643JpSGpwI

Mucha gente de la comunidad de BennuGD son personas sin experiencia previa en el mundo de la programación así que encontraras tutoriales y documentación a casco porro orientado a los que se están iniciando. Tutoriales que enseñan a utilizar el lenguaje , las bases de la programación y de los videojuegos de una manera bastante entretenida , pues con dos o tres lineas de código ya puedes pintar algo en la pantalla.
kappa64 escribió:Lo mejor para aprender a programar juegos en mi opinión es BennuGD seguido de Game Maker.
Si quieres programar en C++ mi recomendación es que utilizes un buen libro de introducción a la programación en C++/C porque eso de ir entendiendo el código de los tutoriales te puedo asegurar que nunca es suficiente.
Uno tiene que aprender a expresar sus algoritmos de forma natural en el lenguaje de programación que esté usando.

En resumen:

Si quieres aprender a programar videojuegos de forma "divertida" moviendo monigotes por la pantalla desde el momento 0 , utiliza BennuGD y si quieres cojer el camino rápido y hacer un juego sin tener ni idea de programación utiliza Game Maker.

http://www.bennugd.org/

BennuGD es un lenguaje interpretado y tiene interpretes para muchas plataformas , incluyendo Windows , GNU/Linux , Wii , Xbox , Dreamcast , PS2 , Android y un largo etc

Unos cuantos juegos que programados en BennuGD:
http://www.youtube.com/watch?v=qFTYAxsF9GQ#t=77
http://www.youtube.com/watch?v=i643JpSGpwI

Mucha gente de la comunidad de BennuGD son personas sin experiencia previa en el mundo de la programación así que encontraras tutoriales y documentación a casco porro orientado a los que se están iniciando. Tutoriales que enseñan a utilizar el lenguaje , las bases de la programación y de los videojuegos de una manera bastante entretenida , pues con dos o tres lineas de código ya puedes pintar algo en la pantalla.


Lo bueno de XNA es que si sabes C# ya tienes medio aprendizaje hecho, ademas de poder trabajar en 2d y 3d.

Yo tengo ganas de empezar algún proyecto sencillito, pero me da pereza hacerlo solo, ya que para aprender es mejor estar dentro de un grupo para pillar cosas de cada uno.
jeje ya he dado con la tecla..bicheando un poco se encuentra todo,

creo otra variable "tiempo disparo" y se la añado al if


      public void creardisparo()

        {
            KeyboardState teclado;
            teclado = Keyboard.GetState();

            tiempodedisparo++;

         
               if (teclado.IsKeyDown(Keys.Up) && tiempodedisparo > 25)

            {
               
                Disparo disparo = new Disparo();

                disparo.PosicionDisparo = new Vector2(PosicionDisparo.X, PosicionDisparo.Y);

                disparos.Add(disparo);

                tiempodedisparo = 0; 

            }

           
        }


asi "dispara" con el intervalo de tiempo que yo quiera,dejando el boton pulsado.Ahora me toca detectar cuando se sale de la pantalla, borrarlo,y que dispare cada vez que pulso el boton no dejandolo pulsado....poquito a poco.




Lo de BennuGD no lo conocia, la verdad qeu tiene buena pinta,pero ya me he liado con XNA y le voy pillando el rollo,hay bastante informacion y ejemplos por la red.

Lo suyo seria compilar con el udk a xbox360...( he modelado varios proyectos de arquitectura en el)pero no se puede de manera gratuita,y no he encontrado el medio de hacerlo.Con XNA y una consola jtag no hay problema.

se modelar en 3d con relativa facilidad ( cosas del trabajo) y XNA tb lo admite con relativa facilidad.
Mi ilusion es ver, aunque sea una pantalla de un KidKamaleon hecho por mi adaptado a los nuevos tiempos,pero como podeis comprobar....me queda muuuucho camino por andar jejeje.

UN saludo y gracias por los comentarios¡¡¡¡¡¡¡
Buenas, si vais a formar algún grupo de desarrollo en XNA yo quiero unirme xD.

Dicho esto, por aquí dejo un proyecto que no está completamente finalizado pese a que está muy avanzado, lo deje porque la universidad me quitaba demasiado tiempo y luego me dió demasiada pereza continuarlo pero, mirando el código puede eliminar dudas a mas de uno.

Proyecto: https://dl.dropboxusercontent.com/u/23705939/BubbleDestroy.rar

Un saludo,
tchusami.
tchusami escribió:Buenas, si vai a formar algún grupo de desarrollo en XNA yo quiero unirme xD.

Dicho esto, por aquí dejo un proyecto que no está completamente finalizado pese a que está muy avanzado, lo deje porque la universidad me quitaba demasiado tiempo y luego me dió demasiada pereza continuarlo pero, mirando el código puede eliminar dudas a mas de uno.

Proyecto: https://dl.dropboxusercontent.com/u/23705939/BubbleDestroy.rar

Un saludo,
tchusami.


Yo no tenga mucha experiencia, pero si vais a montar algo me apunto.
gracias por el codigo¡¡¡¡

muy interesante para seguir avanzando.

yo de momento practicamente no se nada,jeje pero poco a poco voy aprendiendo.

cuando domine más el tema contad conmigo para hacer algo.

un saludo¡¡¡¡
__KURRY__ escribió:asi "dispara" con el intervalo de tiempo que yo quiera,dejando el boton pulsado.Ahora me toca detectar cuando se sale de la pantalla, borrarlo,y que dispare cada vez que pulso el boton no dejandolo pulsado....poquito a poco.


Para detectar si se sale de la pantalla solo tienes que comprobar los bordes. Ejemplo en una 800x600:
if(  disparo.PosicionDisparo.X > 800 or  disparo.PosicionDisparo.X < 0 or
    disparo.PosicionDisparo.X > 600 or  disparo.PosicionDisparo.Y < 0){

         disparos.remove(disparo);

}

Supongo que tu Draw tiene una funcion que dibuja los elementos del array "disparos". Asi que si lo quitas del array cuando sobrepase los limites, ya no lo dibujara.

Recuerda que tu disparo continua creado aunque lo hayas quitado del array, por lo que tienes que liberarlo llamando al destructor.

Por otro lado, para detectar cuando se levanta una tecla es con teclado.IsKeyUP(Keys.Up)


Suerte a todos los que estais aprendiendo a programar. XNA me parece la mejor manera para empezar.

Un saludo
jeje yo de momento lo he hecho asi:

Creacion del disparo:



   public void creardisparo()

        {

            KeyboardState teclado;
            teclado = Keyboard.GetState();

            tiempodedisparo++;

            //detectar si se pulsa la tecla

            if (teclado.IsKeyDown(Keys.A))
            {
                disparopulsado = true;
                tiempodedisparo--;
            }

            if (teclado.IsKeyUp(Keys.A))
            {
                disparopulsado = false;
            }

            //Condicion para crear los disparos
            if (disparopulsado && tiempodedisparo > 1)

            {
              //disparo simple
                Disparo1 disparo = new Disparo1();
                disparo.PosicionDisparo = new Vector2(PosicionDisparo.X, PosicionDisparo.Y);
                disparos.Add(disparo);
                tiempodedisparo = 0;
           
            }


avance y eliminacion del disparo


      public void avancedisparo()

        {
            VelocidadDisparo = 5;

            for (int i = 0; i < disparos.Count; i++)
            {
                // Anima cada disparo
                disparos[i].PosicionDisparo = new Vector2(disparos[i].PosicionDisparo.X  , disparos[i].PosicionDisparo.Y - VelocidadDisparo);
               
                //borrar disparos si se salen de la pantalla
                if (disparos[i].PosicionDisparo.Y < 0)
                {
                    disparos.RemoveAt(i);
                    i--;
                }
            }

        }


por otra parte.....

como puedo relacionar la posicion de la nave y la posicion del disparo?

de momento solo lo he conseguido creando el mismo metodo en ambas clases

      public void moverdisparo ()

        {
            KeyboardState teclado;
            teclado = Keyboard.GetState();

             if (teclado.IsKeyDown(Keys.Right) && PosicionDisparo.X <= 1280 )

                 PosicionDisparo.X += VelocidadDisparo;

             if (teclado.IsKeyDown(Keys.Left) && PosicionDisparo.X >= 0 )

                 PosicionDisparo.X -= VelocidadDisparo;
             if (teclado.IsKeyDown(Keys.Up) && PosicionDisparo.Y >= 0 )

                 PosicionDisparo.Y -= VelocidadDisparo;
             if (teclado.IsKeyDown(Keys.Down) && PosicionDisparo.Y <= 720 )

                 PosicionDisparo.Y += VelocidadDisparo;

        }


el metodo de la nave seria igual cambiando posicionDisparo por posicionNave
He revisado el código que puse antes, después de bastante tiempo y me he dado cuenta de que lo hice mas dificil de lo que es en realidad, por eso he aplicado unos cuantos patrones de diseño y he dejado todo un poco mas claro y correcto. He sustituido el fichero en el enlace anterior pero lo vuelvo a poner, por si quereis echarle un ojo, ahora esta mucho mas claro.

Link: https://dl.dropboxusercontent.com/u/23705939/BubbleDestroy.rar.

También tengo que comentarte algo, solo por convenio, en C# se escribe el nombre de los atributos y métodos públicos con mayúscula la primera letra de cada palabra, por ejemplo: moverdisparo sería MoverDisparo. En los atributos y métodos privados se utiliza una nomenclatura tipo java, primera letra de la primera palabra en minúscula el resto en mayúscula, por ejemplo: moverdisparo sería moverDisparo.

Un saludo,
tchusami.
Jeje,mas interesante aun.Gracias por el apunte de las mayúsculas.

Poco a poco sigo avanzando,las animaciones y colisiones se empiezan a poner interesantes.....

un saludo!!!!!
pufff....a ver si me podeis echar una mano......


estoy con mis primeras colisiones y mis grandes problemas.

tengo dos clases una "disparos" y otra "enemigos".

he definido una funcion en la clase "disparos" que recibe como parametros la lista de disparos y la lista de enemigos:



public Boolean ColisionEnemigos( Disparo  disparos, Enemigos enemigos)
        {
           
            Vector3 min1 = new Vector3 (enemigos.PosicionEnemigos.X, enemigos.PosicionEnemigos.Y,0);
            Vector3 max1 = new Vector3 (enemigos.PosicionEnemigos.X + 50, enemigos.PosicionEnemigos.Y + 50,0);

            Vector3 min2 = new Vector3(disparos.Posiciondisparo.X,disparos.Posiciondisparo.Y, 0);
            Vector3 max2 = new Vector3(disparos.Posiciondisparo.X + 50, disparos.Posiciondisparo.Y + 50, 0);


            BoundingBox box1 = new BoundingBox(min1,max1* new Vector3(0.99f, 0.99f, 0));

           BoundingBox box2 = new BoundingBox(min1,max1* new Vector3(0.99f, 0.99f, 0));

           if (box1.Intersects(box2))
           {
               return true;
           }
           else
           {
               return false;

            }
        }



luego en el "update"



for (int i = 0; i < enemigos.Count; i++)
            {

             
                //colision//

                if (enemigos[i].ColisionEnemigos(disparos[i],enemigos[i]))
                {

                    enemigos[i].PosicionEnemigos = Vector2.Zero; ;// los enemigos van a 0.0
                   
                }

            }



pues bien,el problema es el siguiente como logo hacer que me acepte la lista de disparos que esta definida en la clase "disparos".

resumiendo,sigo con el mismo problema que para mover la nave,que tengo que hacer una unica clase en la que defino disparos y enemigos y asi funciona,pero me gustaria tenerlas separadas para asi poder editar las cosas mejor y tener todo más ordenado,pero no doy con la tecla :(

Me valdria un ejemplo:

Dos sprite creados en dos clases distintas y que uno se mueva en funcion del otro.

Unsaludo¡¡¡¡
Tu "main" tiene que:

1- Crear objeto de la clase Disparos la cual continene un array de disparos. Dentro de esta tienes el metodo crear_disparo() que añade un objeto Disparo al array.

2- Crear objeto de la clase Enemigos la cual contiene un array de enemigos. Dentro de esta tienes el metodo crear_enemigo que añade un objeto Enemigo al array.

En el draw del main:

1 - Disparos.Draw() -> el metodo esta en Disparos y lo que hace es recorrer su array dibujando los disparos

2- Enemigos.Draw() -> lo mismo

En el update de tu main:

1- Disparos.Update(Enemigos.getArray()) -> el metodo dentro de Disparos actualiza la posicion de los disparos de su array. Tambien hace contorl de colisiones a partir del array Enemigos que le entra.

2- Enemigos.Update(Disparos.getArray()) -> al reves.

Espero haber explicado bien!

Saludos
explicado esta....pero los dos ultimos puntos....nada [carcajad]

he estado mirando y existe lo que se llaman clases heredadas,mediante las cuales puedes compartir las propiedades de una a otra,posicion,variables,etc,....me lo estoy mirando ahora,jejeje

Ya me acepta la lista,pero no hace nada la colisión.

Adjunto el codigo para ver si alguien me da un empujón.Todo lo que encuentro sobre colisiones,o es muy facil,o muy muy complicado para mi aún,y necesito lo intermedio,jejeje.

Un saludo¡¡¡¡

https://www.dropbox.com/s/qm3hju56dtuudiy/disparo2%28win%29%20-%20copia.rar
La verdad es que veo tu proyecto un poco lio, lo suyo sería tener una clase Disparo y otra clase Enemigo, te pongo por aqui un poco de info:

class Disparo {
Vector2 Posicion { get; private set; }
BoundingBox Colision { get; private set; }
Texture2D Imagen { get; private set; }

public void Update() { ... }

public void Draw() { ... }
}


y la clase Enemigo mas o menos igual. Si quieres que te explique la herencia me lo dices, podemos hablar por Skype o algo, te quitas parte del trabajo pero hay que tener cuidado con el aliasing.

Para seguir como lo tienes, la nave tendría un Disparo[] Disparos, aunque yo pondría donde está inicializada la nave, es decir, en la clase Game1 el array de disparos y un array Enemigo[] Enemigos ya que, es el juego el que gestiona los enemigos y los disparos y la nave no tiene porque gestionar los disparos, solo crearlos, no se si me explico.

Un saludo ;)
Creo que lo que deberías de hacer es aprender a programar y entender la orientación a objetos antes de meterte con un videojuego. Las dudas que tienes ahora te van a parecer triviales y vas a avanzar mucho más rápido.
Dentro de enemigos recorres los disparos para ver si colisionan, pero no declaras disparos en ningun sitio.

Los disparos no tienen que estar dentro de la clase enemigo, en todo caso dentro de la clase Nave que es el que dispara.

Desde la clase game, en update tienes que poner:

enemigos.update(nave.getDisparos());

Lo que hace es pasar lo que devuelve getDisparos (el array de disparos) al update de enemigos y entonces si puedes recorrer los disparos
Buenas a todos,

no he podido evitar leer vuestra inacabada conversación. ¿Qué ocurrió para que no le pusierais fin? ¿Creasteis un grupo y os movisteis a Skype?

Aquí un servidor está interesado en aprender XNA. Y, como dice el refrán, cuatro ojos ven mejor que dos.
No ocurrió nada, simplemente ahí quedó la cosa pero si tienes dudas no habrá problema en prestarte nuestra ayuda :)
De momento no tengo muchas dudas, más allá del lío terminológico, pero sí estaba interesado en aprender junto a otras personas a fin de hacerlo más rápido y mejor :)
Saludos chicos, no he podido resistirme y animaros a que probeis cocos2dxna. Que ademas de estar basado en xna es multiplataforma xbox incluida. Sistema de partículas etc... Estoy bastante metido, así que si queréis creamos un grupo de skype y hacemos cositas. Un saludo!
magurin escribió:Saludos chicos, no he podido resistirme y animaros a que probeis cocos2dxna. Que ademas de estar basado en xna es multiplataforma xbox incluida. Sistema de partículas etc... Estoy bastante metido, así que si queréis creamos un grupo de skype y hacemos cositas. Un saludo!


Una duda...¿Sigue siendo necesario el compilador de Xamarin para generar los "ports" desde Visual Studio si la solución tiene como target el sistema Android / iOS?

Yo también vengo de C# y he trabajado con XNA (3.1 y 4). Hace un par de días me dió por trastear con libGDX y la verdad es que sin tener de idea de Java (vale que si que tengo bastante soltura con C#) tengo medio portado a android un chorrijuego que tenía medio abandonado en XNA. Todo ello usando herramientas gratuitas (Eclipse Kepler / Android SDK / libGDX)
22 respuestas