Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dan Borges

Variável sempre nula

Recommended Posts

Estou trabalhando com MonoGame, e estou com um problema que não consigo identificar. Tenho uma classe de animação, nela tenho uma Lista que recebe qualquer tipo de ator (por agora um ator pode ser um Sprite ou objeto de movimento que informa o deslocamento).

    /// <summary>Classe para animação de objetos do jogo.</summary>
    public class AnimationScript : DrawableGameComponent
    {       
        List<Actor> itens = new List<Actor>();

Na minha classe de personagem, edito essa lista:

    public class Ryu : Character
    {
        public Ryu(Game game) : base(game)
        { 
        }

        protected override void LoadContent()
        {
            List<Actor> actors = new List<Actor>();
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/wait1.png"), 150)));
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/wait2.png"), 150)));
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/wait3.png"), 150)));
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/wait4.png"), 150)));
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/wait5.png"), 150)));
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/wait6.png"), 150)));
            EditSkill("Wait", ref actors);

            actors.Add(new Actor(new Movement(5,0)));
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/walk1.png"), 150)));
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/walk2.png"), 150)));
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/walk3.png"), 150)));
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/walk4.png"), 150)));
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/walk5.png"), 150)));
            actors.Add(new Actor(new Sprite(Game.Content.Load<Texture2D>("ryu/walk6.png"), 150)));
            EditSkill("Forward", actors);
        }

Quando é hora de desenhar o personagem, eu verifico se o item da lista é uma sprite, se for, será rendenrizado e adiciona o mesmo valor a uma variável chamada lastSpriteRendered (ela é inicializada como "null" no construtor). Ela irá ser desenhada quando o item for um movimento, sendo assim, irá repetir a última sprite.

        public override void Draw(GameTime gameTime)
        {
            if (!checkList())
                return;
            sb = (SpriteBatch)base.Game.Services.GetService(typeof(SpriteBatch));

            if (itens[index].ActorType == ActorType.Sprite)
            {
                sb.Draw(itens[index].Sprite.Texture, position, Color.White);                                
                lastSpriteRendered = itens[index].Sprite.Texture;
            }
            else
            {
                sb.Draw(lastSpriteRendered, position, Color.White);
            }

            base.Draw(gameTime);
        }

Eu verifiquei a variável no bloco if, e ela recebe o valor, mas quando é necessário entrar no bloco else, ela se encontra novamente nula. Não estou entendendo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu consegui resolver... eu atualizei o valor do index no metódo Update(), eu esqueci de fazer isso...

        public override void Update(GameTime gameTime)
        {
            //Checa se a lista contém itens.
            if (!checkList())
                return;

            //Checa também o valor do index.
            checkIndex();

            //Recebe o tempo de jogo já passado desde o último Update e atualiza o valor da variável.
            timeElapsed += (float)gameTime.ElapsedGameTime.TotalMilliseconds;

            if(itens[index].ActorType == ActorType.Sprite)
            {
                if (timeElapsed >= itens[index].Sprite.Time)
                {                    
                    timeElapsed = 0;
                    index++;                    
                }           
            }
            else if (itens[index].ActorType == ActorType.Movement)
            {
                temporaryPosition = itens[index].Movement.Position;

                //Não estava atualizando o valor do index aqui.
                index++;
            }

            position += temporaryPosition;

            //Confere o valor do "index" para a devida correção mais uma vez.
            checkIndex();

            base.Update(gameTime);
        }

Só pra constar como resolvido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.