none
Lag na movimentação de Objetos com Timer RRS feed

  • Pergunta

  • Boa noite pessoal!

    Estou desenvolvendo um jogo de plataforma, para estudos em C# pelo Visual Studio 2017, sem XNA ou qualquer ferramenta terceira.

    Eu utilizo um timer para controlar todos os movimentos do personagem e da tela. Quando o personagem andar até o centro da Tela da esquerda para a direita, a partir deste ponto o panel que é maior que o formulário começa a se mover para a esquerda, como no jogo Super Mario Bros.

    Quando é feito este movimento é preciso mover algumas Labels, e PictureBox junto, porém nessa hora a aplicação pisca, e dá um lag toda vez que tento mover tudo ao mesmo tempo.

    Teria algum código ou poderia desabilitar algum recurso para tornar essa movimentação mais suave, ou pelo menos sem lag?

    Vou deixar o código das movimentações básicas logo abaixo

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (jogadorparadireita.Equals(true))
        {
            pbjogador.Left += movimentacao.Andar();
            if (JogadorNoCentro(pbjogador))
            {
                MovimentarTelaParaDireita();
            }
        }
        if (jogadorparaesquerda.Equals(true))
        {
            pbjogador.Left -= movimentacao.Andar();
            if (JogadorNoCentro(pbjogador))
            {
                MovimentarTelaParaEsquerda();
            }
         }
    }
    
    private bool JogadorNoCentro(PictureBox jogador)
    {
        return jogador.Left >= (this.Width / 2);
    }
    
    private void MovimentarTelaParaDireita()
    {
        lblVidas.Left += movimentacao.Andar();
        lblTempo.Left += movimentacao.Andar();
        lblViewTempo.Left += movimentacao.Andar();
        pbVida1.Left += movimentacao.Andar();
        pbVida2.Left += movimentacao.Andar();
        pbVida3.Left += movimentacao.Andar();
        pnTela.Left = pnTela.Location.X - 
        movimentacao.Andar();
    }
    
    private void MovimentarTelaParaEsquerda()
    {
        lblVidas.Left -= movimentacao.Andar();
        lblTempo.Left -= movimentacao.Andar();
        lblViewTempo.Left -= movimentacao.Andar();
        pbVida1.Left -= movimentacao.Andar();
        pbVida2.Left -= movimentacao.Andar();
        pbVida3.Left -= movimentacao.Andar();
        pnTela.Left = pnTela.Location.X + 
        movimentacao.Andar();
    }

    Desde já agradeço!

    domingo, 15 de outubro de 2017 23:36

Respostas

  • Bom dia!

    Consegui resolver o problema!

    Eu inseri todos os objetos dentro de um panel e ao invés de mover as Labels e PictureBoxes eu mexo apenas o Panel, e o jogador.

    Pude economizar muitas linhas e melhorar muito o desempenho.

    • Marcado como Resposta Shigueaki segunda-feira, 16 de outubro de 2017 11:02
    segunda-feira, 16 de outubro de 2017 11:01

Todas as Respostas

  • Bom dia!

    Consegui resolver o problema!

    Eu inseri todos os objetos dentro de um panel e ao invés de mover as Labels e PictureBoxes eu mexo apenas o Panel, e o jogador.

    Pude economizar muitas linhas e melhorar muito o desempenho.

    • Marcado como Resposta Shigueaki segunda-feira, 16 de outubro de 2017 11:02
    segunda-feira, 16 de outubro de 2017 11:01
  • Bom dia, Shigueaki.

    Obrigado por usar o fórum MSDN.

    Que bom que conseguiu resolver o problema.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 16 de outubro de 2017 11:50
    Moderador