Jump to content


Photo

Variavel Sempre Nula


  • Faça o login para participar
1 reply to this topic

#1 Lucas99

Lucas99

    Normal

  • Usuários
  • 84 posts
  • Sexo:Masculino
  • Localidade:Santos

Posted 09/12/2014, 17:01

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.

#2 Danilomaru

Danilomaru

    Ativo

  • Moderadores
  • 300 posts
  • Sexo:Masculino
  • Localidade:brasil

Posted 10/12/2014, 14:04

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);
}





0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq