jueves, 7 de julio de 2011

Articulo: Programacion avanzada 2k3: Listas, bucles y etiquetas

Enginear mejor y mas rapido y potente
Bueno, aprendi a programar en C y otros lenguajes y esto me ha ayudado a potenciar aun mas mis capacidades con el rpgmaker, tanto para los antiguos como el RGSS. Aunque el punto mas importante ha sido tratar de planificar y pensar antes de hacer nada, ya que te puede evitar mucho trabajo. Nota que aqui se habla del 2k3 porque es el unico que posee este tipo de variables relativas(otros ya tenian ciclos claro) entre otras cosas convirtiendolo en el mejor para enginear.

Tambien he ido descubriendo muchas similitudes con la programacion, la verdad, ya que el rpgmaker no deja de ser una pseudo programacion de tipo visual y mas sencilla,  y como ejemplo escribi un tutorial que es sobre dar el paso de los eventos a la programacion: http://analisisvideojuegoswep.blogspot.com.es/2011/07/tutorial-de-los-eventos-la-programacion.html

Estoy haciendo unos cuantos sistemas personalizados, y por ejemplo, el engine que tiene que pasar las variables de los atributos de cada personaje a las intermedias para el combate SBP(como vidas atributos y demas de los personajes), ¡Ha pasado de ocupar la ostia de funciones de variables y condiciones a un simplisimo ciclo de 5 o 6 lineas!

Acerca de las variables relativas, ciclos y etiquetas
Nota que hay que saber manejar los ciclos, etiquetas y las variables relativas y aqui te explico como van tambien. Con variables relativas me refiero a la opcion que aparece en el comando operar variables y esta en la parte de arriba, en concreto has de colocarlo en la tercera opcion en la parte superior y tambien en la inferior. Esto hace que la variable que seleccionas tenga el valor del cual es la variable en el indice y numero de estas.

Osea que si pones un asignar a una variable y pones una de este tipo en el otro lado, si la variable tiene el valor 50, la variable que asignes, tendra el valor que tiene la variable de id 50 en la lista de estas del rpgmaker, que puede ser 75 por ejemplo. Asi en este momento te daria 75, pero si cambias el valor de la variable relativa a otra, entonces te dara su valor al ejecutar el mismo asignar, si le has sumado +1 a esa pues sera la de id 51 y por ejemplo tendra 140 de valor en este caso.

Nota que tambien puedes usar el asignar variables en la zona superior como ya dijimos antes, teniendo aun mas potencial. De esta forma la variable a la que asignas el valor(sumar 50 por ejemplo) es relativa y si la variable tiene la de 1, y la variable de id 1 tiene un valor de 30, entonces se sumara 30 a la variable de id 30. Finalmente tambien puedes combinar las dos en un mismo comando con las misma metodologia.

Los ciclos son bucles que reptien eternamente el contenido que hay dentro de ellos hasta que se ponga el comando de romper ciclo, funcionando de forma parecida a los eventos paralelos o automaticos pero de forma concreta y separada en una pagina de un evento dando asi mas posibilidades y pudiendo poner mas de uno. Su uso junto a las variables relativas es evidente ya que gracias a estos puedes automatizar el cambio de valor de la variable indice relativa, ahorrando trabajo y dando mas opciones aun.

Para acabar toca mencionar las etiquetas, otro comando poco usado y desconocido pero bastante util a veces(aunque no tanto aqui) y relacionado con la programacion. Se trata de poner una marca en el codigo y luego poder regresar a ella en cualquier momento dentro de la misma pagina de evento.

Su utilidad se ve a simple vista si quieres piensas en un sistema de elecciones y respuestas compleja, si pones una etiqueta, la n1 por ejemplo, al principio y luego pones una eleccion, normalmente se acaba tras usarla, pero, si pones ir a la etiqueta n1 en las opciones que no te valgan, al seleccionar esa opcion iras al punto marcado antes. Obviamente este es uno de los tipicos usos pero puedes sacarle mas jugo claro.

En este caso concreto son la tipica programacion mas antigua en la cual se usaba esto para ir a ciertos sitios del codigo pero hoy en dia suelen estar mal vistos si se usan para todo porque desordenan el codigo entre otras cosas pero a veces vienen bien. 

EJEMPLO 1: Traspasar listas de variables
En vez de convertir cada variable en otra segun que personaje este en el grupo, como decia al principio, he hecho esto:

Creas las variables por cada personaje que necesites, sea real o intermedio, pero las creas en orden, es decir, por ejemplo de posicion 20 a 80 (auque sabiendo que no hay casi limite en el maker no te quedes corto).
Luego obviamente haces una pequeña condicion para saber que personaje vamos a traspasar y cual intermedio, y asi pones la variable POS1VV en la posicion 1 de los atributos reales(en el ejemplo es 20) y la de POS1INT en la posicion 1 del personaje de combate intermedio.

POS1VV: Indice maestro de posiciones reales de personajes.
POS1INT: Indice maestro de posiciones de personajes intermedios.

--CICLO--
Fijar Variable POS1VV segun POS1INT, las dos de forma relativa (Es decir, contienen un numero que es la variable que el programa buscara para ponerle o sacarle el valor).
POS1VV +1
POS1INT +1
--CONDICION-- Si POS1VV y POS1INT son iguales a 60(o lo que sea)
Parar ciclo
-FIN CONDICION--
--FIN CICLO--

Con esto consigues ahorro de trabajo, simpleza y ademas muchisima flexibiliadad, ya que obviamente para canviar qualquier cosa no debes modificarlo todo sino las variables base o la condicion de fin del ciclo, puediendo reutilizar todo el sistema para lo que quieras.


Tambien he estado creando un sistema que muestra ventanas personalizadas de forma relativa y flexible, de forma que podre crearlas y modificarlas casi a placer, o reutilizarlo para qualquier subsistema que surja o otro juego.

EJEMPLO 2: Mostrar imagenes, ventanas y objetos
Variables Maestras(PMX i PMY): Contienen el indice para todas las ventanas, objetos o elementos que quieras crear. Tendras que crear de forma ordenada dos valores X e Y para cada objeto, seran su posicion. De la misma forma que la anterior, reserva un monton de variables en orden...

Variables Intermedias (PMX i PMY): Para mostrar en cada caso.

--CICLO--
POSX= PMX-relativa.
POSY= PMY-relativa.
Llamar evento de mostrar imagen con condiciones(aqui el maker no ofrece mas posibilidades) que mostrara segun la posicion POSX y POSY, siendo los ejes de la imagen.
1 PMX +1
1 PMY +1
--CONDICION-- Si POS1VV y POS1INT son iguales a 40(o lo que sea)
Parar ciclo
-FIN CONDICION--
--FIN CICLO--

Si a esto le sumas que creas todas las imagenes de tu juego de forma ordenada y les pones nombres genericos accesibles, puedes substituir casi todo el sistema en cada caso, ademas, mayormente tendras que usar un solo engine para mostrar el sistema personalizado. Aunque en este aspecto el maker es mucho menos flexible, las principales limitaciones son que no se pueda definir por variable el archivo de origen, numero de imagen, la transparencia, rotacion, etc... pero puedes copiar y pegar los comandos o tenerlas mas ordenados, poner nombres facilmente identificables a las imagenes y usar eventos comunes para ahorrar mas trabajo aun.

EJEMPLO 3: Orden automatico de listas
Hacer que un menu ordene automaticamente los objetos o habilidades. Creas un sistema de ID's por tipos de objetos o prioridades. Luego le das las opciones al usuario, ejemplo, recuperacion-ataque-apoyo, yo que se. Despues de esto, con alguna funcion das un valor a cada tipo de ID segun la correlacion con las demas. En el ejemplo, recuperacion obtiene valor 3, ataque 2 y apoyo 1.

Usas el mismo sistema relativo para el menu. Es decir, posiciones de items por pagina y por tipos de objetos.

MenuPM: Indice de posiciones del menu con variables ordenadas reservadas.
ItemIDM: De los items.
MPI: Posicion menu intermedio
ItemI: Posicion item intermedio
IDM: Indice de ID's maestro.
IDI: Valor intermedio ID

--CICLO--
IPI= ItemPM-relativo
IDI= IDM-relativo
--Condicion-- Si IPI es igual a IDI
MenuPM-relativo= IPI
Menu PM+1
--Fin condicion--
ItemPM+1
--Condicion-- Si ItemPM es igual a 100(numero maximo de items, representa que los ha escaneado todos respecto a una ID ya)
IDM+1
--Fin Condicion--
--FIN CICLO--

Ten en cuenta que puedes definir cuales objetos de cada ID saldran antes en el menu poniendolos antes en la lista base. Es decir, puedes definir todo el orden igualmente. Se podrian hacer algoritmos especiales, pero no le veo el uso en este caso.

EJEMPLO 4: Otras ideas
Las variables relativas son bastante potentes, vienen a ser los arrays o listas de la programacion en su version rpgmaker. Usandolos junto a los ciclos, ganan mucho potencial. De forma relativa se puede hacer casi todo. Por ejemplo, poder definir todas las teclas del juego, accesos directos, etc, usando un ciclo identico que trabaje con un indice y unas variables ordenadas que puedes modificar para cada caso.

SMP, mostrar habilidades, objetos, etc, so mucho mas faciles. Un menu de objetos, aunque tengas 300.000 distintos, es 1000 veces mas sencillo. Usando el ciclo lo unico que tendras que hacer es crear una condicion para mostrar la imagen por cada objeto, pero nada mas, porque la posicion es relativa en cada caso segun la variable X e Y intermedias, que canvian conforme a la lista de posiciones reservadas. El ciclo calcula en cada caso que posicion ocupa en el menu, reduciendo tu trabajo al minimo.

Conclusion
Pues vamos que, usando ciclos y este tipo de variables se puede reducir la programacion repetitiva y otras cosas al minimo, siendo lo unico complejo planificar el orden de las variables, y crear el "mostrar imagen" por cada imagen pero ya esta. Ademas, sera mucho mas flexible, por lo que podras modificarlo facilmente durante el transcurso del proyecto y usar imagenes o estilos substitutorios sin peligros.

No hay comentarios:

Publicar un comentario