Tutorial como hacer un explorador sin utilizar la función for.
Mas abajo están los diferentes efectos que podemos darle a los textos.
---------_Colores_-------------------- blanco=color.new(255,255,255) ---_así se crea un color , el color varia dependiendo de su valor. negro=color.new(0,0,0) verde=color.new(0,200,0) carpeta=files.list("ms0:/") ------_variable que contiene una tabla, la tabla contiene una lista de los archivos de la ruta. archivo=1 max=#carpeta ------------------_para calcular el máximo contenido de la tabla. cache="ms0:/" ----------_variable que por el momento contiene la ruta ms0/, la usaremos para regresar. x=10 -----------_variable que contiene el valor 20, modificar para cambiar la posición (X) del texto. y=130 ---------_variable que contiene el valor 130, modificar para cambiar la posición (y) del texto. tamano=1 -----_variable que contiene el valor 1, modificar para cambiar el tamaño de texto. ---------_función para imprimir el texto_------------- function Print(x,y,archivo,tamano,color_carpeta_texto,color_carpeta_sombra,color_archivo_texto,color_archivo_sombra) if archivo>0 and max>0 and archivo<=max then if carpeta[archivo].directory==true then screen.print(x,y,files.nopath(carpeta[archivo].name),tamano,color_carpeta_texto,color_carpeta_sombra) else screen.print(x,y,files.nopath(carpeta[archivo].name),tamano,color_archivo_texto,color_archivo_sombra) end end end -------------------------------------- while true do -------------_bucle infinito sirve para repetir el código, indispensable para hacer un programa._----------- controls.read() --------_para poder usar los controles. --------_para mostrar la ruta en la que estamos_.--- if max>0 then screen.print(10,2,files.nofile(carpeta[archivo].name),0.5,blanco,blanco) end ---------_esto es lo que funcionara como un for_.--- Print(x,y-100,archivo-5,tamano,verde,blanco,blanco,blanco) Print(x,y-80,archivo-4,tamano,verde,blanco,blanco,blanco) Print(x,y-60,archivo-3,tamano,verde,blanco,blanco,blanco) Print(x,y-40,archivo-2,tamano,verde,blanco,blanco,blanco) Print(x,y-20,archivo-1,tamano,verde,blanco,blanco,blanco) Print(x,y,archivo,tamano,negro,verde,negro,blanco) Print(x,y+20,archivo+1,tamano,verde,blanco,blanco,blanco) Print(x,y+40,archivo+2,tamano,verde,blanco,blanco,blanco) Print(x,y+60,archivo+3,tamano,verde,blanco,blanco,blanco) Print(x,y+80,archivo+4,tamano,verde,blanco,blanco,blanco) Print(x,y+100,archivo+5,tamano,verde,blanco,blanco,blanco) ------------------------------------------------------ ---------_para navegar por las carpetas y archivos_--------- if controls.press("up") and archivo>1 then ----_sentencia:"si pulsamos el botón up y archivo mayor a uno entonces" archivo=archivo-1 --------------------------_archivo menos uno. end -------------------------------------------------_fin de la sentencia. if controls.press("down") and archivo<max then archivo=archivo+1 end --------------------------------------------- ----------par ver imagenes reproducir musica, ect_----------------- if controls.press("cross") and max>0 then ---------------_sentencia:"si pulsamos el boton equis y max es mayor a cero entonces" if files.ext(carpeta[archivo].name)=="png" then ----_sentencia:"si la extencion del archivo es igual a png entonces" imagen=image.load(carpeta[archivo].name) ----_cargamos la imagen. image.blit(imagen,0,0) ----------------------------_para que se pueda mostrar en pantalla,la ponemos en la posicion 0 y 0. screen.flip() ----------------------------------------_para mostrar todo en pantalla. controls.waitforkey() ---------------------------------_esperamos hasta pulsar un boton para dejar de ver la imagen. imagen=nil -------------------------------------------_para eliminar la imagen, para que no ocupe memoria. collectgarbage() --------------------------------------_limpiamos la memoria. end -----------------------------------------------------_fin de la sentencia:"si la extencion del archivo es igual a png entonces" ------------------------------------------------------------- if files.ext(carpeta[archivo].name)=="jpg" then imagen=image.load(carpeta[archivo].name) image.blit(imagen,0,0) screen.flip() controls.waitforkey() imagen=nil collectgarbage() end -------------------------------------------- if files.ext(carpeta[archivo].name)=="mp3" then ---_sentencia:"si la extencion del archivo es igual a mp3 entonces" sonido=sound.load(carpeta[archivo].name) ------_cargamos el sonido. sound.play(sonido) ------------------------------_reproduce el sonido. end ----------------------------------------------_fin de la sentencia:"si la extencion del archivo es igual a mp3 entonces" --------------------------------------------------------- ----_para entrar a una carpeta_---- if carpeta[archivo].directory then ----------------------_sentencia:"si el archivo es una carpeta entonces" cache=carpeta[archivo].name -------------------------_guardamos la ruta para regresar. carpeta=files.list(carpeta[archivo].name) -----------_listamos la carpeta en una variable. archivo=1 max=#carpeta -------------------------------------_checamos el numero de contenido de la carpeta. end ------------------------------------------------------_fin de la sentencia if carpeta[archivo].directory then. end ------------------------------------------------------------_fin de la sentencia if controls.press("cross") and max>0 then. ----------------_para regresa_r------------------------------------------ if controls.press("triangle") then -----------------------------_sentencia:"si pulsamos el boton triangulo entonces" if max>0 then -------------------------------------------_si max es mayor a cero entonces. carpeta=files.list(files.nofile(files.nofile(carpeta[archivo].name))) ---_regresamos ala carpeta anterior. else ------------------------------------------------------ y si max no es mayor a cero. carpeta=files.list(files.nofile(cache)) -----------------_regresamos ala carpeta anterior utilizando la ruta guardada en la variable cache. end ------------------------------------------------------_fin de la sentencia"si max es mayor a cero entonces". archivo=1 max=#carpeta end --------------------------------------------------------------_fin de la sentencia:"si pulsamos el botón triangulo entonces" screen.flip() -----------------------------------------------------_mostramos todo en pantalla, sino pusiéramos esto no se vería nada. end -----------------------------------------------------------_fin del bucle while true do
una ventaja de hacer un explorador de esta forma es que podemos editarlo a nuestro antojo, me refiero a que podemos darle distintos efectos a los textos, algo que me imagino seria mas difícil lograr con la función for.
este efecto se logra con solo restarle 0.1 para cada Print, si quieren un efecto mas exagerado pueden restarle un poco mas por ejemplo 0.2 para cada Print.
Print(x,y-100,archivo-5,tamano-0.5,verde,blanco,blanco,blanco) Print(x,y-80,archivo-4,tamano-0.4,verde,blanco,blanco,blanco) Print(x,y-60,archivo-3,tamano-0.3,verde,blanco,blanco,blanco) Print(x,y-40,archivo-2,tamano-0.2,verde,blanco,blanco,blanco) Print(x,y-20,archivo-1,tamano-0.1,verde,blanco,blanco,blanco) Print(x,y,archivo,tamano,negro,verde,negro,blanco) Print(x,y+20,archivo+1,tamano-0.1,verde,blanco,blanco,blanco) Print(x,y+40,archivo+2,tamano-0.2,verde,blanco,blanco,blanco) Print(x,y+60,archivo+3,tamano-0.3,verde,blancoblanco,blanco) Print(x,y+80,archivo+4,tamano-0.4,verde,blanco,blanco,blanco) Print(x,y+100,archivo+5,tamano-0.5,verde,blanco,blanco,blanco)
este efecto se logra modificando la posición del texto y el tamaño y un poco los colores.
--_nuevo color_-- gris=color.new(200,200,200) -------------_esta es la cola de abajo_------------------------------------------ Print(x-20,y+10,archivo+5,tamano-0.5,verde,gris,gris,gris) Print(x-15,y+20,archivo+4,tamano-0.4,verde,gris,gris,gris) Print(x-10,y+30,archivo+3,tamano-0.3,verde,gris,gris,gris) ---------------------_esta es la cola de arriba_------------------------------------------ Print(x-20,y-10,archivo-5,tamano-0.5,verde,gris,gris,gris) Print(x-15,y-20,archivo-4,tamano-0.4,verde,gris,gris,gris) Print(x-10,y-30,archivo-3,tamano-0.3,verde,gris,gris,gris) --------------------------_esto es el centro_----------------------------------- Print(x,y-40,archivo-2,tamano-0.2,verde,blanco,blanco,blanco) Print(x+10,y-20,archivo-1,tamano-0.1,verde,blanco,blanco,blanco) Print(x+15,y,archivo,tamano,negro,verde,negro,blanco) Print(x+10,y+20,archivo+1,tamano-0.1,verde,blanco,blanco,blanco) Print(x,y+40,archivo+2,tamano-0.2,verde,blanco,blanco,blanco)
este efecto se logra jugando con una variable que se utiliza en el color..
--_definimos las variables. b_color=true e_color=100 ---_este codigo va dentro de while true do. if e_color<50 then b_color=true end if e_color>200 then b_color=false end if b_color==true then e_color=e_color+2 end if b_color==false then e_color=e_color-2 end ---_ahora creamos un color.new(e_color,e_color,e_color), en el print que corresponde a nuestra posicion. --_en este. Print(x,y,archivo,tamano,negro,color.new(e_color,50+e_color,e_color),negro,color.new(e_color,e_color,e_color)) --_si quieren que sea de otro color ponemos un valor junto al e_color. --_ejemplo. --_rojo color.new(50+e_color,e_color,e_color) --_verde color.new(e_color,50+e_color,e_color) --_azul color.new(e_color,e_color,50+e_color)
cuenta_up=0 cuenta_down=0 ---------------_UP_------------------- if controls.up() and archivo>1 then cuenta_up=cuenta_up+1 if cuenta_up>30 then archivo=archivo-1 cuenta_up=25 end else cuenta_up=0 end -------------_DOWN_------------------- if controls.down() and archivo<max then cuenta_down=cuenta_down+1 if cuenta_down>30 then archivo=archivo+1 cuenta_down=25 end else cuenta_down=0 end
no entiendo
se ve muy complicado
PerezRE
Eh! jepte, de nuevo yo XD
Tengo una duda, quiero imprimir *todos* los archivos y carpeta que hay dentro de una ruta.
El código que tengo sólo me imprime un archivo o carpeta.
Y si me pueden explicar brevemente un poco sobre el bucle for, por favor. Gracias de antemano.
Saludos.
--[NO EXISTEN LOS LIMITES =D]--
creo que lo unico que te
creo que lo unico que te falta es meter la ( Y ) dentro del for y sumar : y=y+separacion etre texto y texto
ejemplo.
te explico sobre el for.
el for trabaja de esta forma, recorre el código asta alcanzar el limite puesto el recorrido puede ser de 1 en 1 o de 2 en 2 ect, dependiendo del valor que se le de al segundo argumento que es opcional, ejemplo: for i=1,2,max do , este for recorrerá el valor de 2 en 2, creo que un valor negativo hace una cuenta regresiva -1, pero la verdadera magia del for según mi experiencia es que al recorrer el código si hay cosas que se muestran en pantalla las mostrara todas, a pesar de que ya las recorre y que en teoría solo se debería de mostrar la ultima imagen o texto, es como si se guardaran en el bufer o lo que sea y al llegar al screen.flip() ojo que este screen.flip() no esta dentro del for, muestra todo lo que recorrió, (por que el for primero recorre lo que tiene que recorrer y después sale y continua el código que esta fuera del bucle, igual que el while), cosa que con un while nunca optendriamos ese resultado cuando mucho solo veríamos el ultimo recorrido.
for con un while
Me llamó la atención esto: "cosa que con un while nunca obtendríamos", así que decidí llevarte la contraria jajaj
En realidad, sí se puede, sólo es de pensarlo de una forma distinta:
La condición del if lo que hace es verificar si el límite es alcanzable, en caso de no serlo, no ejecutará nada.
La condición del while es una expresión booleana que hará que se detenga justo antes de pasarse del límite (o cuando esté en el mismo). El math.abs es por si el límite y/o el paso son negativos.
Saludos!
PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]
07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD
Recuerda: Sé el intérprete -_-
PerezRE
Cuánto argumentos lleva el for?
A lo que sé lua es "sacado" de C, no?, entonces se puede decir que el for en C, tiene tres argumentos; el valor inicial, la condición, y el incremento en que va
for (i=0, i<5,i++) {
}
Pero en lua, son los mismo argumentos?
Con respecto al código, no me imprime todo lo que hay dentro de la ruta. Si imprime las demas, en la misma línea, siendo reemplazadas las letras (Nombre de la carpeta/Archivo) por el otro nombre.
--[NO EXISTEN LOS LIMITES =D]--
Sí, son los mismos
La equivalencia es esta:
C:
Lua:
Si vas a leer tablas con el bucle for, acuerdate que en Lua los índices empiezan en 1, no 0.
Salu2!
PerezRE
El código funciona perfectamente, pero tengo un problema. Y es que me imprime lo que hay dentro de la ruta pero en la misma línea (Se ve amontonado), ¿Cómo podría hacer que se imprima en una línea distinta o hacerlo como una tabulación?. Trate con arrays pero siengo honesto, trate de hacerlo y no pude.
Código:
--[NO EXISTEN LOS LIMITES =D]--
No estas
No estas sumando o aumentando la coord Y.
PerezRE
De hecho si, se suma a la coordenada. Seguramente estoy haciendo algo mal.
Se ve como el efecto matrix (Que "cae" texto) pero más rápido. Si disminuyo el valor de Archivo solo se ve una carpeta y cae mas lento. (Aunque se ve genial XD)
--[NO EXISTEN LOS LIMITES =D]--
tal vez sea por que estas
tal vez sea por que estas utilizando tres argumentos quita el ultimo el "Archivo"
for i = Archivo, max, Archivo doEso es porque debes reiniciar
Eso es porque debes reiniciar el valor de Y antes de empezar a blitear la lista
PerezRE
Dentro de la funcion los argumentos tienen que ser existentes?, es decir, las variables.
no , pueden no existir pero
no , pueden no existir pero al llamar ala funcion sera nesesario poner el argumento ya que no tendra nada por defaul, normalmente alas variables que se utilizan en las funciones se les declara como variables locales esto se hace simplemente ponendo la palabra reservada local antes de asicnar el valor, ejemplo local archivo=1 , despues aunque cambies el valor ala variable ya no es nesesario la palabra local, la palabra local sirve para no causar una incompativilidad esdecir si existe una variable que se llame igual ala variable local no le afecta al programa.
PerezRE
Gracias Jepte.
Te recomendaría estructurar mejor el código
Para que se entienda mejor, un pequeño ejemplo de dos codes que hacen lo mismo pero uno bien estructurado y otro no:
Ahora bien hecho:
Notas la diferencia? Los dos funcionan igual pero a la hora de leerlos se entienden mejor, o incluso puedes hacer esto:
Salu2 y gracias por el tutorial! §
.
pues si haci lo tengo, no?, o a que te refieres.? ha te refieres a darle espacio alas lines , meter las lineas hacia dentro?
Sep, se refiere a "meter las
Sep, se refiere a "meter las lineas hacia dentro", a IDENTAR el code, vamos (resulta más fácil leerlo así).
muy bien el tutorial, pero
muy bien el tutorial, pero veo que usas demaciado codigo repetitivo, que si bien no quieres usar el bucle for, podrias evitartelo usando funciones (para no tener que estar usando tantos ifs y no tener un codigo tan largo) es solo un consejo
Saludos¡¡
..
:D , claro que tonto, como no se me ocurrio, creo que no me lo tome muy encerio, que buena idea hare una funcion, gracias por el consejo o mas bien la idea.saludos
PerezRE
Execelente tutorial jepte, me ha caido como "anillo al dedo". Aun me cuesta aprender mejor el for.
Cuando lo aprendo, por ciertas razones extrañas lo olvido XD. No sé si sea por falta de practica o algo así.
--[NO EXISTEN LOS LIMITES =D]--
que bueno que te sirva, y yo
que bueno que te sirva, y yo que pense que no servia de mucho.xd , la verdad a mi la funcion for no me cae muy bien, y hay aveses que hace mas lento el programa, de esta forma se tiene mas controlodo todo.xd . saludos
En los exploradores el for
En los exploradores el for alenta el programa porque si entran a una carpeta con muchos elementos, los blitea todos aunque ya no estén dentro de la pantalla... si le ponen un límite superior se ahorran tiempo y muchísimo code ;)
La solución es usar un if
Para que bliteé solo unos pocos si esta carpeta contiene demasiados archivos.
Salu2! §
Pero si sigues usando esto
Pero si sigues usando esto para imprimir...
Se te va seguir alentando aunque pongas condiciones, porque el for sigue recorriendo toda la lista entera. No, la solución verdadera es usar algo como...
Y así no importa que tengas 1000 archivos en una carpeta, sólo se imprimen 15 máximo y el code va rapidísimo. Claro, hay que mover 3 variables para lograr el scroll (init, lim y la que te indica el elemento seleccionado), pero un bajo precio por ganar rapidez de ejecución.
el for trabaja igual que el
el for trabaja igual que el while, nose si traira un while adentro pero en todo caso la ejecusion es igual de rapida.
edito: me refiero con for y sin for.xd
De hecho en LuaDEV hay un
De hecho en LuaDEV hay un pequeño lag con el for (hay un hilo sobre eso aquí mismo). Como sea, qué es más rápido? Revisar 1000 habitaciones, o revisar 15? De eso trata mi code ;)
si me equiboque cuando
si me equiboque cuando pusiste "un precio muy bajo pero se ejecuta mas rapido", pense que lo estabas conparando con el codigo del explorador.xd
Vaya que si
el famoso scroll y te ahorras miles de ifs... Pero cierto también que hay quien se les complica el for.