Tutorial FP 8 – Cronometragem e Movimento
Autor: Luiz Eduardo da Silva | Publicado: 2011-11-25T08:45:00-08:00

Pessoal já estamos quase acabado o basico!

Este tutorial irá ensinar sobre cronometragem e movimento usando FP, relacionado com a iteração que escolheu no inicio do game.

ESCOLHENDO ITERAÇÃO
FP suporta dois tipos de iteração:

Iteração fixa
Iteração variavel

Quando sua Engine inicia em sua Class Main, você escolhe sua iteração:


package
{
    import net.flashpunk.Engine;

    public class Main extends Engine
    {
        public function Main()
        {
            super(800, 600, 60, false);
        }
    }
}

O quarto parametro no construtor da Engine, "fixed", atribui se a sua taxa de quadros vai ser fixa ou não.

Nos proximos passos estarei mostrando como usar a cronometragem e movimento baseando em que iteração estamos usando. Mas antes de continuar é importante anotar que:

Com iteração fixa, tempo é em quadros(frames).
Com iteração variavel, tempo é em segundos.


Isto porque uma iteração fixa tenta rodar em uma taxa de quadros constantes( pro exemplo, 60 quadros por segundo). Com uma iteração variavel não importa, seu game ira iterar na velocidade que conseguir. Isto porque, enquanto usando iteração variavel, sua cronometragem e movimento ira usar a propriedade FP.lapse para julgar quanto tempo passou desde o ultimo quadro.

CRONOMETRAGEM BASICA

cronometragem tem um papel muito importante no desenvolvimento de game. Uma coisa simples que você ira usar com frequência é contadores, que é basicamente variaveis que incrementam seu valor a cada quadro, você pode ter alguns eventos atribuidos para quando o contador chegar a certo valor.

Iteração Fixa

Se você está usando uma iteração fixa, seus contadores trabalham em quadros, então um sistema simples de cronometragem ficaria assim:


package
{
    import net.flashpunk.Entity;

    public class Player extends Entity
    {
        public function Player()
        {

        }

        public var time:int = 0;

        override public function update():void
        {
            time ++;
            if (time == 60)
            {
                // reinicia o contador depois de 60 quadros.
                time = 0;
            }
        }
    }
}

Então basicamente, o codigo dentro de nosso "if" ira ser executado a cada 60 quadros. Se seu games tem a taxa de quadros de 60 por segundo, você tera nosso "if" a cada 60 segundos

Iteração Variavel

Quando usamos uma iteração variavel, seu contador trabalha em segundos, então para o mesmo sistema iremos usar FP.elapsed assim:


package
{
    import net.flashpunk.Entity;
    import net.flashpunk.FP;

    public class Player extends Entity
    {
        public function Player()
        {

        }

        public var time:Number = 0;

        override public function update():void
        {
            time += FP.elapsed;
            if (time >= 2)
            {
                // reinicia o contador depois de 2 segundos.
                time = 0;
            }
        }
    }
}

Este foi um pouco mais complicado.

Primeiro, nossa variavel de tempo deve ser do tipo Number, porque estamos trabalhando com valores decimais.
Segundo, ao inves de incrementar em 1 todo quadro, nos incrementamos por FP.elapse, que é o tempo em segundos que passou desde o ultimo quadro.

Então se continuarmos incrementando nossa variavel vai ultrapassar os dois segundos, por isso checamos se 2 segundos ja passaram.
Dica: Se estamos criando um cronometro como no exemplo acima, aqui está um jeito melhor de faze-lo:


override public function update():void
{
    time += FP.elapsed;
    if (time >= 2)
    {
        time -= 2;
    }
}

Ao inves de atribuirmos 0 a variavel time, subtraimos pelo tempo que estamos calculando, assim os milessimos que seriam descartados serão reaproveitados na proxima iteração.
Assim você terá um cronometro muito mais apurado!MOVIMENTAÇÃO BASICA

Não iremos cobrir movimentação complexa, somente mostra a diferença entre movimentação com iteração fixa e variavel. Para ambos os exemplos podemos usar as imagens dos tutoriais anteriores.

Iteração Fixa

Uma movimentação com iteração fixa de um objeto ficaria assim:


package
{
    import net.flashpunk.Entity;

    public class Player extends Entity
    {
        public function Player()
        {

        }

        // velocidade de movimentação (pixels por quadro).
        public var speed:Number = 5;

        override public function update():void
        {
            x += speed;
        }
    }
}

Acima eu só criei a variavel speed(velocidade), que é a velocidade do Player em pixels por quadro, e então adicionar o valor para a posição x da Entity na função update para mover para direita, e subtrair para mover para esquerda.

Iteração Variavel

Quando usamos uma iteração variavel, funciona assim:


package
{
    import net.flashpunk.Entity;
    import net.flashpunk.FP;

    public class Player extends Entity
    {
        public function Player()
        {

        }

        // velocidade de movimentação (pixels por segundo).
        public var speed:Number = 50;

        override public function update():void
        {
            x += speed * FP.elapsed;
        }
    }
}

Desta vez, nossa variavel speed representa nosso movimento em pixels por segundo. Então, tudo que devemos fazer para mover nossa entidade é adicionar a velocidade a posição x como antes, mas desta vez nos multiplicames o valor por FP.elapsed.
Desde que FP.elapsed é igual ao tempo desde o ultimo quadro, isto significa que se 10% de um segundo passou, nos movemos 1/10 de nossa velocidade de movimento. Então após 1 segundo, teremos nos movido em 50 pixels.

Fonte : FlashPunk

Créditos : ChevyRay