Anuncios Google

Metodos y Tecnicas de Programacion (Lua PLayer HM)

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

COROUTINES.-

bueno, el tema de hoy es coroutines...

corutines, es la forma mas sencilla de hacer "multitarea" en lua, y aunque no es asi en la realidad, podemos hacer grandes cosas con esta funcion.

Coroutines sirve para funciones en modo "multitarea" o funciones cooperativas, sabemos que es multitarea, en el caso de una pc, el sistema operativo permite ejecutar dos programas distintos a la vez, pero no vemos como lo hace.

Aqui nosotros tenemos que indicarle cuando deve hacer eso. ejemplos.

para crear un coroutine necesitamos la funcion a la cual asignar como una funcion para multitarea..."no dijimos que programas?", asi es...

de esta manera cargariamos nuestro programa como una funcion, etc...

----------------------------------------------------------------------------------

--"LuaIdent v3.0 de WinShell Tools"
--"programa principal"
--regla general, NUNCA programes directo a screen, siempre usa un form (Tecnologia Winshell)
form=Image.createEmpty(480, 272)
form:clear(Color.new(0,0,0))
Image.startBlit()
screen:fastBlit(0, 0, form, 0, 0,  form:width(), form:height(), false)
Image.endBlit()
screen.flip()
screen.waitVblankStart()
--esto carga el programa1.lua como una funcion, y es asignada a dos coroutines diferentes
programa={}
programa[1]=loadfile("programa1.lua")
MiCo={}
MiCo[1] = coroutine.create(programa[1])
MiCo[2] = coroutine.create(programa[1])
focus=1 --indica que el programa 1 tendra el focus, ver mas adelante
--presentando opcional
px=0
py=0
capi=Color.new(192,192,192)
coroutine.resume (MiCo[1])
px=200
py=0
capi=Color.new(255,0,0)
coroutine.resume (MiCo[2])
oldPad = Controls.read()
while true do
 pad = Controls.read()
 --- no se recomienda hacer esto, porque el rendimiento del programa baja, ya que tiene que revisar todo a cada vuelta, usar el metodo select case de WinShell, o un simple if ~= then
 if pad:triangle() then
  break -- termina el programa principal
 end
 -- indica quien tiene el foco, osea quien esta activo y quien no.
 if pad:l() then
  focus=1
 end
 if pad:r() then
  focus=2
 end
 -- el focus puede pertenecer a una matriz, asi con un for y break podemos rastrear el actual, o un simpe tag, para mas rapido. (Tecnologia Winshell)
 if focus==1 then
  --propiedades del programa
  px=0
  py=0
  capi=Color.new(192,192,192)
  ---
  coroutine.resume (MiCo[1])
 end
 if focus==2 then
  --propiedades del programa
  px=200
  py=0
  capi=Color.new(255,0,0)
  ---
  coroutine.resume (MiCo[2])
 end
end
 

----------------------------------------------------------------------------------

--"LuaIdent v3.0 de WinShell Tools"
--"programa1.lua"
--registrando variables locales,  para que no interfieran con la misma aplicacion en caso de llamarse dos veces....recomendado (tecnologia WinShell)
local contador = 5
local area
area=Image.createEmpty(100, 100)
area:clear(capi)
oldPad = Controls.read()
while true do
 pad = Controls.read()
 if pad ~= oldPad then
  oldpad=pad --impide la doble pulsacion, pero aqui no es valida, porque se la cambia el programa principal, por eso deve usarse Local.
  if pad:up() then
   contador=contador+1
  end
  if pad:down() then
   contador=contador-1
  end
  area:clear(capi)--esto solo ocurre cuando hay un cambio, devido a que tarda mucho, y si lo hicieramos constante mente, tendriamos..como se dice!!!?...un programa nada optimo y muy lento...a la larga...
 end
 area:print(10,10,contador,Color.new(0,0,0)) -- hacer todos los cambios sobre el area de trabajo, un form en este caso llamado area
 fondo:blit(px, py, area, 0, 0,  area:width(), area:height(), false) --darle toda la informacion a quien representa la pantalla
 Image.startBlit()
 screen:fastBlit(0, 0, fondo, 0, 0,  fondo:width(), fondo:height(), false) -- darle a la pantalla lo que queremos ver. en este caso el form principal, y el area de trabajo llamada area.
 Image.endBlit()
 --esto yo asi lo uso, aunque deveria ser alrevez, creo...
 screen.flip()
 screen.waitVblankStart()
 coroutine.yield() -- al terminara las operaciones, pasa el control al programa principal
end
 

---------------------------------------------------------------------------------- 

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

TEMA, EL FOR.-

el FOR, algo muy util a la hora de contar....

Unas de las formas de usar el for, es como un simple contador.

Normal mente cuando contamos, lo hacemos de 1 en 1, he aqui las forma de utilizar un for que he empleado en todos estos años.....

(estos ejemplos corren solo en WinShell)

ejemplo1.-

inicio=1

fin=10

contador=nil

for contador=incio,fin do

locate(1,contador)

 print(contador)

end

lo que hace el programa anterios, es imprmir en pantalla en la linea 1, columna contador, el valor de contador, si tomamos en cuenta que el bucle for se repetira de 1 en 1 desde el 1 hasta el 10 segun las variables, entonces..obtendremos

12345678910    <---esto en pantalla

ejemplo2.-

for x=20,30,2 do

 Line(x,10,x,20,_azul)

end

lo que hace el programa es trazar una linea de x,10 a x,20 de color azul, si tomamos en cuenta de que X empieza en 20, y termina en 30 contando de 2 en 2,..obtendriamos...

5 lineas azules verticales de 10puntos de alto desde la pocicion Y10 hala pocicion Y20, comenzando en la pocicion X22 y en la ,X24,X26,X28,X30

ejmeplo3.- este ejemplo nos permitira colocar el numero 4 en su pocicion correcta.

Miscore=4

scores={}

scores[0] =5

scores[1] =6

scores[2] =5

scores[3] =3

scores[4] =2

scores[5] =1

scores[6] = nil <---basurero

 ---modo tradicional,nada optimo------- porque reasigna dos veces siempre, talvez no paresca nada, pero de uno en uno se va juntando.

for check=scores[0],1,-1 do

 if scores[check]<Miscore then

   scores[check+1]=scores[check] <--aqui bajamos este a la basura

   scores[check]=Miscore <--le asignamos uno nuevo  

 end

end

 --------------------------------------

---- Tecnologia simple en WinShell ---- este segundo metodo es mas complejo o mas largo, pero es mas optimo, ya quecompara una vez, y reasigna una vez

for check=scores[0],1,-1 do

 if scores[check]<Miscore then

   scores[check+1]=scores[check] <--aqui bajamos este a la basura

 else <---aqui estaria bien un elseif, pero no siempre es adecuado...

  if scores[check]>Miscore then

   scores[check+1]=Miscore

   break

  end

 end

end

------como veran...

en el ejemplo anterior se mostro dos metodos, depende de la situacion es el modo en que se deve emplear....

asi el programa en este caso, revisa des de la ultima posicion hasta la primera, buscando en que momento miscore es menor al checado, y asi asignar en esa pocicion miscore ,habiendo movio al mismo tiempo todos los que son mas bajo que miscore.

notese el comodin o basura, este nos permite al empezar saber que ese es un valor que no nos sirve, pues indicamos en la pocicion 0, el limite de nuestros scores...

 

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

METODO FILLING.-

Cambiar el color de una pieza de color, ya sea cuadrado, estrella o mas complejo....

la mayoria de las cosas que hago, funciones y procedimientos, los hago en vb, para probarlos mas rapido, y luego los paso a LUA.

este ejemplo esta en vb, ya pase la idea original a lua, que fue para un juego, lo cual trabaja bien, pero me di cuenta que podia aplicar este juego de funciones para hacer algo que ni vb, ni lua hacen, y es rellenar objetos dibujados a mano, o eso creo., si me tuvuco, me ayudarian mucho, pero lo dudo que la aya, sino esos programas por ahi circulando de dibujo que NO tienen esa fucnion, ya la huvieran implementado.

Function todo(nx, ny, c)
P1.PSet (nx, ny), pintarde
If nx - 1 > 0 Then
If P1.Point(nx - 1, ny) = c Then
Call todo(nx - 1, ny, c)
End If
End If

If ny + 1 < P1.ScaleHeight + 1 Then
If P1.Point(nx, ny + 1) = c Then
Call todo(nx, ny + 1, c)
End If
End If

If nx + 1 < P1.ScaleWidth + 1 Then
If P1.Point(nx + 1, ny) = c Then
Call todo(nx + 1, ny, c)
End If
End If

If ny - 1 > 0 Then
If P1.Point(nx, ny - 1) = c Then
Call todo(nx, ny - 1, c)
End If
End If
End Function

esto lo hace perfectamente, salvo por una razon, al llamarce mucas veces, diria yo demaciadas, me saca error de bufer de pila , algo asi.

sabeis como corregir mi problema?, yo ya tengo en mente una solucion, me falta programarla, mientras, pueden usar esta para juegos que seleccionen cosas en una tabla circular no mayor a un radio de 30, que es donde no falla.

 

cabe mencionar que este metodo es utilizado por el programa JawBreaker, para seleccionar.

--------------------------------------

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

LOS MP3 .-

 

Como reproducir un MP3 en LuaPlayer HM .

 

--Asi como se ve, asi como se oye--

--si usas LuaHM, usa Mp3me, falla menos.
--este es el metodo que use para resolver mis problemas con archivos mp3

azul = Color.new(0,140,255)
--como no le puedes dar la direccion de la rola directamente, usa lo siguiente
directorioactual=System.currentDirectory() .. "/"
directoriodemp3="ms0:/music/" --<< -- esto se hace cada que le des a Mp3me.load

function playmp3(rola) --funcion que carga una rola x, o la repite
System.currentDirectory(directoriodemp3)
--Mp3me.load("Super Trouper.mp3") --  <<---usa stop/load, solo cuando vayas a cambiar de cancion, como en un mp3player.....
Mp3me.stop() --< hay que ponerlo, sino, el play no jala. y habria un bucle infinito de cargo cargo y cargo, porque el estado siempre es tur para eos
Mp3me.load(rola)
Mp3me.play()
System.currentDirectory(directorioactual) --<< pero solo si necesitas cargar mas cosas, y no se puede dar la direccion directamnete
Mp3Playing=true --<---esot te hace saber que estas tocando un mp3
end
Mp3Playing=false --<--esto que no hay ninguno
tiempo = 0
while true do
screen:clear()
pad = Controls.read()
--if pad:select() then System.Quit() end --<---solo para terminar el programa
if pad:triangle() then
 Mp3me.stop()
 break
end --<--- para salir del bucle
--si estaba tocando y se acabo, o no hay nada tocando
 if Mp3me.eos() == "true"  or Mp3Playing==false then --<< por alguna razon es "true" y no true, alo igual que "false" y false
  playmp3("4.mp3") --<--obiamente 4.mp3 esta en dicho directorio
  screen:print(200,100,"repitiendo",azul)
 end
 --mientras haya algo tocando
 if Mp3me.eos() == "false" and Mp3Playing==true then --<--aqui pues tu sabras que pones
   screen:print(100,100,Mp3me.gettime() ,azul)
  else
  screen:print(100,100,"Stop",azul)
  end

screen.waitVblankStart()
screen.flip()
end

-----------------------------------------------------


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de P22

Yo esto de los bucles for

Yo esto de los bucles for no acabo de entender para que esta.Si alguien me lo explicase se lo agradeceria mucho

Saludos

Imagen de Tanos

Te contesté

Te contesté en el otro post :)

Tambien va para yoan

Imagen de yoan03

eso

es lo unico k tengo k aprender el jodio bucle "for" con mas ejemplo k ponga no logro entenderlo :-/

Imagen de trom_us

a pos,

no me di cuenta, mira que te lo acabo de comentar en tu hilo...jeje... no vi que eras tu...saludos.

Imagen de ZYX3D

Muy aparatoso

Mucho más simple:

for i=10,1,-1

screen:print(1,1,i)

end 

O sea, el paso del bucle es el tercer parámetro (el inicio el primero, el final el segundo: lo típico). La verdad, no veo qué cambios ocasionaría dentro del programa un while descendente respecto a un for descendente, si ambos son el mismo tipo de bucle... Igual que lo de arriba, es hacer:

local i=10

while i>0 do

i=i-1 

screen:print(1,1,i)

end 

Y conste que yo de Lua, ni papa (puede haber algún error ahí en cuanto al ámbito de las variables), pero es que esto ya es de estructuras básicas de programación... :)


Strength is irrelevant. Resistance is future. We wish to improve ourselves.

La fuerza es irrelevante. La resistencia es futuro. Queremos mejorarnos.

Imagen de trom_us

vez que tonto soy

en efecto.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.