locked
ayudan con animacion del jugador y los tiles RRS feed

  • Pregunta

  • hola a todos, como ya habia comentado anteriormente me habia envarcado en XNA gracias aunos turotiales que encontre.

    en estos tutoriales aprende a crear un esenario (o entorno, no conosco bien como definirlo) mediante tiles con un player (o jugador) que interactuara con en el, se puede secir que temine con algo al estilo marios bros.

    public void Load(ContentManager content)
            {
                textura = content.Load<Texture2D>("player3");
            }
    
            public void Update(GameTime gameTime)
            {
                posicion += velosidad;
                rectangulo = new Rectangle((int)posicion.X, (int)posicion.Y, textura.Width, textura.Height);
    
                Input(gameTime);
    
                if (velosidad.Y < 10)
                    velosidad.Y += 0.4f;
            }
    
    public void Collision(Rectangle newRectangulo, int xOffset, int yOffset)
            {
                if (rectangulo.TouchTopOf(newRectangulo))
                {
                    rectangulo.Y = newRectangulo.Y - rectangulo.Height;
                    velosidad.Y = 0f;
                    hasJumped = false;
                }
    
                if (rectangulo.TouchLeftOf(newRectangulo))
                {
                    posicion.X = newRectangulo.X - rectangulo.Width - 2;
                }
                if (rectangulo.TouchRightOf(newRectangulo))
                {
                    posicion.X = newRectangulo.X + newRectangulo.Width + 2;
                }
                if (rectangulo.TouchBottomOf(newRectangulo))
                    velosidad.Y = 1f;
    
                if (posicion.X < 0) posicion.X = 0;
                if (posicion.X > xOffset - rectangulo.Width) posicion.X = xOffset - rectangulo.Width;
                if (posicion.Y < 0) velosidad.Y = 1f;
                if (posicion.Y > yOffset - rectangulo.Height) posicion.Y = yOffset - rectangulo.Height;
            }
    
            public void Draw(SpriteBatch spriteBatch)
            {
                spriteBatch.Draw(textura, rectangulo, Color.White);
            }


    pero en ejemplo se utilizaba un rectangulo y un sprite para crear al jugador y para que este se moviera por enciema de los tiles (parte del codigo esta arriba).

    honestamente pase un buen tiempo jugando con los tiles y manejando el esenario de varioas formas.

    pero luego de esto quise ir un poco mas lejor y darle un poco de animacion sensilla al personaje, pero anteriormente ya via hecho un ejemplo de como dar animacion mediente la un un rectangulo que fuera caonbiando de frame diferente en la sprite sheet.

    al gina intente juntar estos 2 ejemplos y termine con algo asi:

    public void Update(GameTime gameTime)
            {
                posicion += velosidad;
                rectangulo = new Rectangle(currentFrame * frameWidth, 0, frameWidth, frameHeight);
                origen = new Vector2(rectangulo.Width / 2, rectangulo.Height / 2);
    
                Input(gameTime);
    
                if (velosidad.Y < 10)
                    velosidad.Y += 0.4f;
            }
    
            public void Input(GameTime gameTime)
            {
                if (Keyboard.GetState().IsKeyDown(Keys.D))
                {
                    velosidad.X = (float)gameTime.ElapsedGameTime.TotalMilliseconds / 3;
                    AnimateRight(gameTime);
                }
                else if (Keyboard.GetState().IsKeyDown(Keys.A))
                {
                    velosidad.X = -(float)gameTime.ElapsedGameTime.TotalMilliseconds / 3;
                    AnimateLeft(gameTime);
                }
                else velosidad.X = 0f;
    
                if (Keyboard.GetState().IsKeyDown(Keys.Space) && hasJumped == false)
                {
                    posicion.Y -= 5f;
                    velosidad.Y = -9f;
                    hasJumped = true;
                }
            }
    
            public void Collision(Rectangle newRectangulo, int xOffset, int yOffset)
            {
                if (rectangulo.TouchTopOf(newRectangulo))
                {
                    rectangulo.Y = newRectangulo.Y - rectangulo.Height;
                    velosidad.Y = 0f;
                    hasJumped = false;
                }
    
                if (rectangulo.TouchLeftOf(newRectangulo))
                {
                    posicion.X = newRectangulo.X - rectangulo.Width - 2;
                }
                if (rectangulo.TouchRightOf(newRectangulo))
                {
                    posicion.X = newRectangulo.X + newRectangulo.Width + 2;
                }
                if (rectangulo.TouchBottomOf(newRectangulo))
                    velosidad.Y = 1f;
    
                if (posicion.X < 0) posicion.X = 0;
                if (posicion.X > xOffset - rectangulo.Width) posicion.X = xOffset - rectangulo.Width;
                if (posicion.Y < 0) velosidad.Y = 1f;
                if (posicion.Y > yOffset - rectangulo.Height) posicion.Y = yOffset - rectangulo.Height;
            }
    
            public void AnimateRight(GameTime gameTime)
            {
                timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds / 2;
                if (timer > interval)
                {
                    currentFrame++;
                    timer = 0;
                    if (currentFrame > 3)
                        currentFrame = 0;
                }
            }
    
            public void AnimateLeft(GameTime gameTime)
            {
                timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds / 2;
                if (timer > interval)
                {
                    currentFrame++;
                    timer = 0;
                    if (currentFrame > 7 || currentFrame < 4)
                        currentFrame = 4;
                }
            }
    
            public void Draw(SpriteBatch spriteBatch)
            {
                //spriteBatch.Draw(textura, rectangulo, Color.White);
                spriteBatch.Draw(textura, posicion, rectangulo, Color.White, 0f, origen, 1.0f, SpriteEffects.None, 0);
    
            }

    pero mi problema es que el jugador no se para encia de los bloques y anda por el borde de la ventana, luego de revisar las cosas me dicuenta que el problema estaba en al definir el "rectangulo" en el metodo "Update" ya que anteriormente aqui definia la posicion del jugador

    rectangulo = new Rectangle((int)posicion.X, (int)posicion.Y, textura.Width, textura.Height);

    pero para poder aplicar la animacion este variable tenia que cambiar par poder hacer cambiar el frame del sprite para poder hacer la animacion.

    por lo que de momento me encuentro varado y no se como estableser la animacion y que el jugador se mantencia encima de los bloques.

    hojala alguien tenga una sugerencia

    miércoles, 31 de julio de 2013 16:46