Ir para o conteúdo

 Voltar a Linguagem Lua
Tela cheia

Problemas com Input do Controle

19 de Janeiro de 2012, 0:13 , por Desconhecido - | 1 Pessoa seguindo este artigo.
Visualizado 32 vezes

Olá.

Estou tentando fazer meu primeiro programa em NCL-Lua, mas estou tendo dificuldade em fazer o aplicativo reconhecer quando um botão é pressionado.

Pelo que eu entendi, é necessário fazer uma função dentro do Script para processar os eventos provenientes do NCL, e foi o que eu fiz. Entretanto, o input não é reconhecido, tornando inacessível o código dentro da função tratadora de eventos.

 

--SCRIPT MAIN--

counter = 0
spriteX = {}
spriteY = {}
repeating = true
num = 10 -- NUMERO DE SPRITES A DESENHAR
updt = 100 -- NUMERO DE UPDATES

local function generateSprite(i)

    canvas:attrColor('black')
    img = canvas:new('media/img1.png')
    spriteX[i] = math.random(0, 640)
    spriteY[i] = (counter * 2)
    canvas:compose(spriteX[i], spriteY[i], img)
    counter = counter + 1
   
end

local function updateSprite(i)
    spriteX[i] = spriteX[i] + 2
    canvas:compose(spriteX[i], spriteY[i], img)
end

function eventListener (evt)
   
    if evt.class == 'key' and evt.type == 'press' then
        num = 0;
    end

end

while repeating == true do

    for i=1,num do
        generateSprite(i)
    end

    canvas:flush()

    for z=1,updt do
        canvas:attrColor('black')
        canvas:drawRect('fill', 0,0, canvas:attrSize())
            for i=1,num do
            updateSprite(i)
            end
        canvas:flush()
    end
   
counter = 0;
num = num + 10;


event.register (eventListener);


end
 

Autor: Marcos Soares


33 comentários

  • 5df5d8eeb3770422cc9c42a466faee62?only path=false&size=50&d=404Roberto Azevedo(usuário não autenticado)
    19 de Janeiro de 2012, 14:14

     

    Oi Marcos,

     você está setando o valor do service.currentKeyMaster no NCL para o teu nó Lua?

     Talvez essa outra thread ajude: www.​soft​ware​publ​ico.​gov.​br/d​otlr​n/cl​ubs/​ging​a/fo​rums​/mes​sage​-vie​w?me​ssag​e_id​=437​3547​3

    • 923ab03a13a9f4008e02f4fff9b63ce7?only path=false&size=50&d=404Marcos Soares(usuário não autenticado)
      19 de Janeiro de 2012, 15:52

       

      É, eu vi esta thread depois de postar aqui, e vi que realmente havia esquecido de fazer isso.

      Mas mesmo depois de setar o service.currentKeyMaster para o nó do Lua, continuo não tendo o resultado esperado. Acho que tem alguma a coisa a ver com o loop do programa. Não existe alguma forma de deixar o programa em loop, mas fazer com que a função de processamento de eventos seja chamada paralelamente ao loop?

       Porque, se eu tirar o loop, o script é lido apenas uma vez, e terminado antes que qualquer Input tenha tempo de ser lido e processado.

      • 5df5d8eeb3770422cc9c42a466faee62?only path=false&size=50&d=404Roberto Azevedo(usuário não autenticado)
        19 de Janeiro de 2012, 16:51

         

        Oi Marcos,

         revendo teu código com mais cuidado, realmente tem um problema com o teu 'loop'.

        A comunicação entre o formatador NCL e o script NCLua é toda baseada em eventos. Ao carregar o script NCLua o formatador executa o código Lua uma vez, o que chamamos de inicialização do script. Após essa fase de inicialização, toda a comunicação é feita baseada em eventos. Os eventos podem ser enviados pelo formatador NCL (ou pelo próprio NCLua) e recebidos pelo Lua (por meio das funções tratadoras de eventos que são registradas com a função event.regiter) ou vice-versa (o Lua envia eventos para o formatador por meio da função event.post).

        Uma descrição BEM MAIS COMPLETA do que eu falei acima pode ser encontrada no Exemplo 1 do tutorial do Francisco: www.​lua.​inf.​puc-​rio.​br/~​fran​cisc​o/nc​lua/​tuto​rial​/ind​ex.h​tml

        Dado isso, é fácil perceber que o teu código está entrando em loop infinito "while repeating == true" ainda na fase de inicialização. Como você nunca sai da fase de inicialização, tua função tratadora de eventos nunca será chamada.

        Pelo que pude perceber você está querendo fazer uma animação, certo? Como você já pôde perceber pelo teu código, a melhor forma de fazer isso NÃO é usando while. Isso justamente porque assim você  bloqueia o teu script de receber novos eventos do formatador (inclusive os eventos de tecla).

        A melhor forma então é colocar teu código de atualização da tela dentro da própria função tratadora e se utilizar dos eventos para atualizá-la sempre que necessário. Teu código ficaria algo como:

        --SCRIPT MAIN--
        counter = 0
        spriteX = {}
        spriteY = {}
        repeating = true
        num = 10 -- NUMERO DE SPRITES A DESENHAR
        updt = 100 -- NUMERO DE UPDATES

        local function generateSprite(i)
            ...
        end

        local function updateSprite(i)
            ...
        end

        function eventListener (evt)
            if evt.class == 'key' and evt.type == 'press' then
                num = 0;
            end

        if evt.class == 'user' then
        -- Aqui vai o teu código que estava dentro do while
        -- o while em si nao precisa mais
        ...

        -- Por fim, eu posto um evento para o próprio script NCLua
        -- (por isso o 'in')
        event.post('in', { class='user', time=now })

        -- O resultado disso é que a funcao tratadora eventListener será
        -- chamada de novo para o meu evento interno.
        -- Com isso, ela também não será bloqueada e está livre para
        -- ser chamada de novo para eventos que estejam vindo do formatador (como o evento de tecla).
        -- p.s. O time = now não é necessário, mas você poderia usá-lo no futuro para fazer
        -- uma animação baseada no tempo.

        end
        end

        -- Teu while aqui não precisa mais!!
        -- Outra coisa: o teu event.register estava dentro do while e não deveria estar!
        -- A função eventListener não é chamada quando você registra ela,
        -- mas sempre que um novo evento é recebido pelo NCLua
        event.register (eventListener);

        Recomendo que você dê uma olhada no Exemplo 4 do Tutorial de NCLua do Francisco: www.​lua.​inf.​puc-​rio.​br/~​fran​cisc​o/nc​lua/​tuto​rial​/exe​mplo​_04.​html​.

        Outra fonte que também pode ser útil é o material do Minicurso de NCLua: www.​tele​midi​a.pu​c-ri​o.br​/sit​es/t​elem​idia​.puc​-rio​.br/​file​s/MC​NCLu​a.pd​f onde você pode encontrar toda a introdução de como é feita a comunicação formatador NCL <-> script NCLua. Lá também tem algumas formas mais avançadas de como fazer animações, por exemplo, usando corotinas.

         

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