Anuncios Google

Programa modular

Tutoriales Avanzados Homebrewes

Programa modular

He aquí nuestras queridas apps, que cada vez que añadimos algo se va haciendo el código más y más largo, más y más ILEGIBLE. Falla algo y te vuelves loco buscándolo. Solución, intentar "modular" nuestra app. Un ejemplo así sencillo sería por ejemplo... enga va, un shell.

Antes de comenzar, como siempre, PENSAMOS.
¿Qué queremos? un escritorio, un cursor, algún widget tipo relojito, oh, sólo con esto el código será inhumano; pues nop, no os desesperéis...

Como Jack el destripador, vayamos por partes, o mejor dicho, MODULEMOS el programa.

Escritorio:

Quiero que sea un wallpaper y mmm... de momento nada más.

escritorio = {
    img = image.load("rutafondo.png"),
    blit = function (yomismo) yomismo.img:blit(0,0); end,
}

¿Por qué la variable "yomismo" dentro de la función? Lo veremos más adelante...

Cursor:

Enga, el cursor, quiero que sea con el analógico... pues vamos:

cursor = {
   img = image.load("rutacursor.png"),
   x = 240,
   y = 136,
   procesa = function (yomismo)
      if controls.analogx > 40 then yomismo.x = yomismo.x + 3; end
      if controls.analogx < 40 then yomismo.x = yomismo.x - 3; end
   end,
   blit = function (yomismo) 
      yomismo:procesa();
      yomismo.img:blit(yomismo.x,yomismo.y);
   end
}

Eiii, este se complica... nada, son dos variables más, X e Y, y una función para leer los controles. Mismo truco de yomismo.

Relojito:

Amos con un relojito!

relojito = {
   blit = function (yomismo)
     screen.print(10,10,os.date());
   end
}

Ehh, este es sencillo! xD No pasa nada, es a método de ejemplo.

Técnica "yomismo" o self :

Recordar que una tabla, si se llama una función con DOS PUNTOS, el PRIMER argumento de la función será esa misma tabla. Es decir, al hacer cursor:blit(); estamos haciendo en realidad: cursor.blit(cursor); (o algo así).

Ahora, ¿cómo quedaría el programa principal?

Si hemos guardado esos tres codigos en tres archivos .lua distintos, wall.lua, cur.lua y rel.lua, pues el code sería tal que así:

dofile("wall.lua");
dofile("cur.lua");
dofile("rel.lua");
 
while true do
   controls.read();
 
   escritorio:blit();
   relojito:blit();
   cursor:blit();
 
   screen.flip();
end

Eii, como cambia la cosa! Pues hale, tomároslo como recomendación para que estructuréis mejor vuestras aplicaciones, y encontréis rápidamente los errores. Más adelante ya postearé más "How to" o tutos de este tipo.

Un saludo.

4.236365
Tu voto: Ninguno Votos totales: 4.2 (55 votos)

Anuncios Google

Comentarios

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 Falconal

No es posible?

No se puede hacer algo parecido en C?

Imagen de fran98

Error

Al ejecutarlo me sale este error:

cur.lua:6: attempt to compare number with function

Este es mi codigo:

cursor = {
   img = image.load("rutacursor.png"),
   x = 240,
   y = 136,
   procesa = function (fran)
      if controls.analogx > 40 then fran.x = fran.x + 3; end
      if controls.analogx < 40 then fran.x = fran.x - 3; end
   end,
   blit = function (fran)
      fran:procesa();
      fran.img:blit(fran.x,fran.y);
   end
}


Imagen de User170294

un buen metodo que voy a

un buen metodo que voy a utilizar a partir de ahora ;)

saludos

Imagen de Arbër

Ahi, ahi, enseñando a

Ahi, ahi, enseñando a programar "bonito" que sino, dejas el codigo apartado un par de semanas y te tocará descifrar geroglíficos xD


-----[[7 años en Scenebeta, con la misma ilusión que la del primer día]]----

Un metodo similar a las

Un metodo similar a las librerias :P Ya lo había utilizado alguna vez, pero es muy muy útil.

Muy interesante.

Muy interesante. Gran tuto.

Un saludo, dev.

Imagen de NauTiluS1

No había visto esto. Muy

No había visto esto.

Muy buena forma deviante.

Saludos

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.