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
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/~francisco/nclua/tutorial/exemplo_04.html. Outra fonte que também pode ser útil é o material do Minicurso de NCLua: www.telemidia.puc-rio.br/sites/telemidia.puc-rio.br/files/MCNCLua.pdf 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.