locked
Desaparecer al personaje principal RRS feed

  • Pregunta

  • Estoy comenzando a programar con XNA y he seguido el siguiente tutorial:

    Desarrollo en XNA - Microsoft Virtual Academy

    De a poco mi jueguito de naves fue tomando forma y funcionaba, pero ahora tengo un problema gigante que no encuentro la solucion (creanme que busque todo)

    En primer lugar tengo creada una clase llamada Jugador.cs

    using System;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Graphics;
    
    namespace XAviation
    {
        class Jugador
        {
            public Texture2D Textura;
            public Vector2 Posicion;
            public bool Mostrar;
            public int Ancho
            {
                get { return Textura.Width; }
            }
            public int Alto
            {
                get { return Textura.Height; }
            }
    
            public int Vida;
            public int Puntaje;
            public int Ataque;
            float Velocidad;
    
    
            public void Initialize(Texture2D textura, Vector2 posicion)
            {
                Textura = textura;
                Posicion = posicion;
                Vida = 10;
                Ataque = 100;
                Velocidad = 4f;
                Puntaje = 100;
                Mostrar = true;
    
    
            }
    
            public void Update(GameTime gameTime)
            {
               
                if ( Vida <= 0)
                {
                    Mostrar = false;
                }
            }
    
            public void Draw(SpriteBatch spriteBatch)
            {
                spriteBatch.Draw(Textura, Posicion, null,
                    Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
            }
        }
    }

    Luego el tipico Enemigos.cs

    using System;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Graphics;
    
    namespace XAviation
    {
        class Enemigos
        {
            public Texture2D Textura;
            public Vector2 Posicion;
            public bool Mostrar;
            public int Ancho
            {
                get { return Textura.Width; }
            }
            public int Alto
            {
                get { return Textura.Height; }
            }
    
            public int Vida;
            public int Puntaje;
            public int Ataque;
            float Velocidad;
    
    
            public void Initialize(Texture2D textura, Vector2 posicion)
            {
                Textura = textura;
                Posicion = posicion;
                Vida = 10;
                Ataque = 100;
                Velocidad = 4f;
                Puntaje = 100;
                Mostrar = true;
    
    
            }
    
            public void Update(GameTime gameTime)
            {
                Posicion.X -= Velocidad;
                if (Posicion.X < -Ancho || Vida <= 0)
                {
                    Mostrar = false;
                }
            }
    
            public void Draw(SpriteBatch spriteBatch)
            {
                spriteBatch.Draw(this.Textura, Posicion, null,
                    Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
            }
        }
    }

    Y el tan importante Game1.cs que no lo pongo porque ya lo hice desastre y no lo van a entender...

    Bueno sin dar mas vueltas cuando la nave choca contra un objeto la vida de la nave se resta por el ataque del objeto, mientras que el objeto vuelve su vida a 0. Cuando la vida del objeto es igual a 0 entonces Mostrar = false y el objeto desaparece, ¿Como? No se!

    Ahora cuando mi navesita se queda sin vida hago también jugador1.Mostrar = false y no sucede nada! La nave sigue apareciendo y se puede jugar sin complicaciones...

    No se que podria ser..

    El codigo de coliciones lo unico que hace es restarle la vida a los objetos y desaparecen pero si lo hago con el personaje principal no sucede nada y esto me esta poniendo nervioso :(! Porfa ayudenme ..

    EDITO: Y ya que estamos, para no crear otro tema sin sentido. ¿Seria bueno hacer un juego de lucha 2D utilizando solo colicion? O debo aprender otras cosas?

    • Editado GonzaFY sábado, 29 de diciembre de 2012 6:33
    sábado, 29 de diciembre de 2012 5:15

Todas las respuestas

  • Viendo el codigo que has puesto, no deberia dejarse de pintar nada por poner Mostrar = false. Me da a mi que hay alguna cosa que no has puesto que controla que si un enemigo su valor Mostrar es false, entonces lo elimina de la lista de enemigos (y por eso desaparece).

    En este caso, para tu jugador, podrías hacer simplemente en el método Draw comprobar si Mostrar vale true o false para decidir si tienes que pintar la nave o no.

    Un saludo!


    Vicente Cartas Espinel - MVP XNA/DirectX

    Blog about C# and XNA Development

    Blog about Role Playing Games


    sábado, 29 de diciembre de 2012 18:19
    Moderador
  • Habia probado eso pero sucede que no lo pinta pero las colisiones se siguen detectando y los puntos sumando.. Es decir lo que no entiendo es porque al poner false al enemigo desaparece pero el jugador no... Probe poniendo en muchos lugares la comprobacion (por ej en Update) pero no pasa nada =/

    sábado, 29 de diciembre de 2012 22:01
  • El enemigo desaparece porque en otro lado compruebas la variable Mostrar y con eso lo eliminas, busca por el código todos los usos de Mostrar y seguro que lo encuentras.

    Y para el personaje es lo mismo, igual que has puesto que si Mostrar es false no se pinte, tienes tambien que comprobar que si Mostrar es false pues que no se tenga en cuenta en las colisiones, etc etc.

    Vamos, que lo que ocurre está en trozos del código que no has puesto, lo mejor que puedes hacer es mirar cuando se usa Mostrar y eso te dara pistas de como seguir.


    Vicente Cartas Espinel - MVP XNA/DirectX

    Blog about C# and XNA Development

    Blog about Role Playing Games

    domingo, 30 de diciembre de 2012 2:16
    Moderador
  • Es que esta muy raro, porque en la funcion de colicion dice que si los objetos interptan a la nave entonces su vida se vuelve automaticamente 0 y al jugador se le resta el ataque del objeto (aunque probe tambien volviendolo 0) y nada mas.

    Luego en la clase de el jugador y los enemigos en el Update dice: if (Vida <= 0) { Mostrar = false; } y con eso los enemigos desaparecen pero si hago lo mismo en el jugador no lo hace..

    De ultima lo que seria el problema es la forma en que invoco a la nave pero igual seria raro.. A los en Update utilizando un void que cree mientras que al jugador lo inicializo en LoadContent... ¿Sera por eso?

    Bueno de todas formas lo que se podria hacer seria que si la vida del jugador = 0 te lleve a otra pantalla y listo.. Solo que hice el tutorial para practicar pero no todo en el codigo que te dan esta bien =/...

    Elaborare otras preguntas en un foro nuevo (ya que no tiene nada que ver con esto) para intentar comenzar con un juego que si deseo terminar...

    domingo, 30 de diciembre de 2012 2:34
  • Mira busca el lugar donde esta la colision con el enemigo y pon if(mostrar==true)//todo el rollo de la colision 

    y asi si esta muerto ya no hay colision simple.

    domingo, 30 de diciembre de 2012 10:57