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
<!-- 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)
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.