Ir para o conteúdo

 Voltar a Linguagem Lua
Tela cheia

Coroutine

4 de Maio de 2011, 22:46 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 10 vezes

Olá pessoal,

Estou tentanto fazer um joguinho em lua, e tava querendo fazer com que o goleiro fique se movendo no gol, durante a execução do programa. Lendo o livro de NCL 3.0, vi um exemplo que usava coroutine, pois dizia que era melhor que o event.timer, então tentei fazer. Primeiramente fiz com que o goleiro começasse de um lado da barra do gol e andasse até o outro lado. Ao executar, fivaca uma tela preta e depois aparecia o goleiro ja parado no lado direito do gol.

Em seguida, fiz com que o goleiro fosse ao final e voltasse, e repetisse isso infinitivamente. Quando executei, a tela ficou preta sempre. É como se a tela ficasse preta enquanto o goleiro esta se movendo. Tou mandando os arquivos em anexos para vocês darem uma olhadas e tentar ver o problema. Ou sugerirem de eu utilizar o event.timer mesmo.

 abraço,

Renato

Autor: Renato Gabriel Pereira


33 comentários

  • 89a40a20aa6f9be2b55d6eb34f639318?only path=false&size=50&d=404Renato Gabriel Pereira(usuário não autenticado)
    4 de Maio de 2011, 22:55

     

    Como não conseguir anexar o arquivo, segue o código:

    <!-- arquivo ncl -->

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!-- Generated by NCL Eclipse -->
    <ncl id="main" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile">
        <head>
            <regionBase>
                <region width="100%" height="100%" top="0%" left="0%" id="rgLua"/>
            </regionBase>
            <descriptorBase>
                <descriptor id="dLua" region="rgLua" focusIndex="luaIdx" />
            </descriptorBase>
        </head>

        <body>
            <media id="lua" src="penalti.lua" descriptor="dLua" />
            <media type="application/x-ginga-settings" id="programSettings">
                <property name="service.currentKeyMaster" value="luaIdx"/>
            </media>
            <port id="pInicio" component="lua"/>
        </body>
    </ncl>

     --arquivo lua

    -- Campo: guarda a imagem, posicao incial e dimensões
    local img = canvas:new('media/campo.png')
    local imgLarg, imgAlt = img:attrSize()
    local campo = {img=img, x=0, y=0, dx=imgLarg, dy=imgAlt}
    -- Bola: guarda a imagem, posicao inicial e dimensões
    local img = canvas:new('media/bola2.png')
    local imgLarg, imgAlt = img:attrSize()
    local bola = {img=img, x=307, y=343, dx=imgLarg, dy=imgAlt}
    -- Goleiro: guarda a imagem, posicao inicial e dimensões
    local img = canvas:new('media/goleiro.png')
    local imgLarg, imgAlt = img:attrSize()
    local goleiro = {img=img, x=290, y=59, dx=imgLarg, dy=imgAlt}

    function animaGoleiro ()
        -- local direcaoDireta = true
        local partida = 158
        local chegada = 481
        goleiro.x = partida
        --repeat
            --if (direcaoDireita) then
                while goleiro.x < chegada do
                    -- suspende a execução da corrotina em execução
                    coroutine.yield()
                    local deslocamento = 0 + math.random(0,3)
                    goleiro.x = goleiro.x + deslocamento
                    redraw()
                end
                --direcaoDireita = false
            --else
                --while goleiro.x > partida do
                    --coroutine.yield()
                    --local deslocamento = 0 + math.random(0,3)
                    --goleiro.x = goleiro.x - deslocamento
                    --redraw()
                --end
                --direcaoDireita = true
            --end
        --until verificacao
    end
    --retorna uma nova corrotina a partir da função
    --passada como parâmetro
    coAnimaGoleiro = coroutine.create(animaGoleiro)

    function updateGoleiro ()
        -- recomeça a execução da corrotina do ponto onde parou
        -- Também serve para iniciar a corrotina
        coroutine.resume(coAnimaGoleiro)
        if coroutine.status(coAnimaGoleiro) ~= 'dead' then
            event.timer(30, updateGoleiro)
        end
    end

    function verificacao()
        event.post{
        class = 'ncl',
        type = 'presentation',
        action = 'pause'}
        return true
    end
    -- Funcao de redesenho:
    -- chamada a cada tecla pressionada
    function redraw()
        canvas:attrColor('black')
        canvas:drawRect('fill', 0,0, canvas:attrSize())
        canvas:compose(campo.x, campo.y, campo.img)
        canvas:compose(bola.x, bola.y, bola.img)
        canvas:compose(goleiro.x, goleiro.y, goleiro.img)
        canvas:attrColor('red')
        canvas:attrFont('vera', 24, 'bold')
        canvas:drawText(50,50,'Teste')
        canvas:flush()
    end

    -- tratadora de evento
    function handler (evt)
        if evt.action == 'start' then
            updateGoleiro()
        end
    end
    event.register(handler)

    • 145ea1662b45b86a90b987f094279123?only path=false&size=50&d=404Guilherme Lima(usuário não autenticado)
      5 de Maio de 2011, 15:25

       

      Oi Renato,

      A tag tem que ser a primeira coisa do xml. Se vc remover o comentario a aplicacao vai funcionar.

    • 89a40a20aa6f9be2b55d6eb34f639318?only path=false&size=50&d=404Renato Gabriel Pereira(usuário não autenticado)
      5 de Maio de 2011, 15:18

       

      Obrigado para quem tentou fazer, mas consegui fazer o movimento do goleiro indo e voltando, segue abaixo o trecho do código:

      function animaGoleiro ()
      local partida = 158
      local chegada = 481
      goleiro.x = partida
      while goleiro.x -- suspende a execução da corrotina em execução
      coroutine.yield()
      local deslocamento = 4 + math.random(0,3)
      goleiro.x = goleiro.x + deslocamento
      redraw()
      end
      animaGoleiro1()
      end

      function animaGoleiro1 ()
      local partida = 158
      while goleiro.x > partida do
      -- suspende a execução da corrotina em execução
      coroutine.yield()
      local deslocamento = 4 + math.random(0,3)
      goleiro.x = goleiro.x - deslocamento
      redraw()
      end
      animaGoleiro()
      end
      --retorna uma nova corrotina a partir da função
      --passada como parâmetro
      coAnimaGoleiro = coroutine.create(animaGoleiro)

      function updateGoleiro ()
      -- recomeça a execução da corrotina do ponto onde parou
      -- Também serve para iniciar a corrotina
      coroutine.resume(coAnimaGoleiro)
      if coroutine.status(coAnimaGoleiro) ~= 'dead' then
      event.timer(30, updateGoleiro)
      end
      end

      coAnimaGoleiro1 = coroutine.create(animaGoleiro1)

      function updateGoleiro1 ()
      -- recomeça a execução da corrotina do ponto onde parou
      -- Também serve para iniciar a corrotina
      coroutine.resume(coAnimaGoleiro1)
      if coroutine.status(coAnimaGoleiro1) ~= 'dead' then
      event.timer(30, updateGoleiro1)
      end
      end

      Se alguem quiser fazer alguma sugestão de melhora, eu agradeço.

Concurso ITU-T de Aplicações para IPTV 2012

13 de Agosto de 2012, 19:38, por Desconhecido

Gostaríamos de lembrar aos possíveis interessados que o prazo de registro para participação no Concurso ITU-T de Aplicações para IPTV 2012 (IPTV Application Challenge) se encerra nesta semana, dia 15 de agosto de 2012. Já o prazo para a submissão de aplicações se encerra no dia 07 de setembro de 2012.



NCL Eclipse 1.6 disponível

10 de Janeiro de 2012, 21:19, por Desconhecido

Caros membros da Comunidade Ginga,



Concursos de Aplicações Ginga-NCL

22 de Setembro de 2011, 3:22, por Desconhecido

    Gostaríamos de relembra-los de que há dois concursos de aplicações Ginga-NCL com inscrições ainda abertas. O convite é aberto a toda a comunidade de desenvolvedores de aplicações para o Middleware Ginga-NCL, em nível internacional. São os seguintes concursos:



Novas versões: Ginga e Ginga-NCL Virtual Set-top Box (v.0.12.3)

1 de Agosto de 2011, 20:58, por Desconhecido



Algumas Boas Notícias da Comunidade Ginga

28 de Julho de 2011, 21:31, por Desconhecido

Autor: Roberto Azevedo