¡Bienvenido a Universo Maker!
¿Es esta la primera vez que visitas el foro? Si es así te recomendamos que te registres para tener completo acceso a todas las áreas y secciones del foro, así también podrás participar activamente en la comunidad. Si ya tienes una cuenta, conectate cuanto antes.
Iniciar Sesión Registrarme

No estás conectado. Conéctate o registrate

Ver el tema anterior Ver el tema siguiente Ir abajo Mensaje [Página 1 de 1.]

#1 RGSS3 Para principiantes - Parte VI el Vie Jul 10, 2015 7:45 pm

Reputación del mensaje :100% (2 votos)

XSerozY

avatar
RGSS3 Para principiantes - Parte VI
Por XSerozY

Puedes ver la parte anterior del tutorial aquí , o si deseas empezarlo desde cero, puedes ver la primera parte aquí.

OJO: RGSS3 es el lenguaje usado en RPG Maker Ace, en XP, VX, etc, no funcionará! Aunque algunas cosas si son compatibles, pero el tutorial lo he hecho basándome en RGSS3. Puedes probar esto en otras versiones del Maker, pero no prometo que todo te funcione. Sin embargo, si sabes solucionar algún problema de compatibilidad, dímelo porfa n.n

Definición de las Clases

Definición de Wikipedia:
En informática, una clase es una plantilla para la creación de objetos de datos según un modelo predefinido. Las clases se utilizan para representar entidades o conceptos, como los sustantivos en el lenguaje. Cada clase es un modelo que define un conjunto de variables -el estado, y métodos apropiados para operar con dichos datos -el comportamiento. Cada objeto creado a partir de la clase se denomina instancia de la clase.

Una clase vendría siendo como una plantilla o molde de algo. Por ejemplo, si queremos mostrar una ventana en tu juego, tendríamos que crear vaaarios métodos para lograrlo, si luego queremos crear otra, nuevamente debemos crear los miiiismos métodos. Pero las clases nos facilitan el trabajo. Si queremos crear una ventana, usamos como molde o plantilla la clase Window_Base, si queremos crear una escena, usamos Scene_Base.

Creo que no está de más decir que una clase es un conjunto de métodos y variables que cumplen una función determinada. Por ejemplo, los métodos y variable de la clase Scene_Base crean una escena en tu juego.

NOTA: Por ahora programo por hobby, y puede que en las definiciones me equivoque. Cualquier corrección me avisan porfa Opalo Hola


Clases

Crear una clase es bien simple:

class [Nombre de la clase]
#...
end

El nombre puede ser el que quieras, pero toma en cuenta que si repites un nombre de clase, ambas se fusionarán. Un ejemplo:



Esta clase se llama Clase_A. Ahora, que es el método initialize ? Es el método que se ejecuta automáticamente al usar esta clase como plantilla. ¿Y como hacemos eso? La guardamos en una variable así:

Código:
var = Clase_A.new

Ahí estamos guardando una copia de todo lo que hay dentro de Clase_A en la variable llamada var. Podemos crear múltiples instancias (o sea, copias) de la misma clase, así:


Código:
var = Clase_A.new
var2 = Clase_A.new
claselol = Clase_A.new

En este caso, las variables(objetos) 'var', 'var2' y 'claselol' son instancias de Clase_A.

Métodos en las clases

Dentro de una clase podemos crear métodos a parte de initialize. Un ejemplo:



Creamos dos métodos más dentro de la clase: metodo_1 y metodo_2.
Cuando escribimos var = Clase_A.new también ejecutamos el método initialize, que a su vez, llama al método metodo_2, de manera que al crear una instancia de esta clase, se muestra el mensaje "Metodo 2 activado".

Ahora, ¿que hacemos con var.metodo_1 ? Ahí estamos llamando a metodo_1 que está dentro de Clase_A.

Ahora bien, tanto estos métodos como initialize pueden tener argumentos. Ejemplo:



A métodos como metodo_2 le damos valor a los argumentos cuando los ejecutamos, y a initialize le damos valor a sus argumentos cuando creamos la instancia, es decir, en var = Clase_A.new(argumentos).

Variables de instancia

Las variables de instancia comienzan con el símbolo @ y solo pueden ser usadas dentro de la clase donde se crean. Da igual si la creamos en metodo_1, metodo_2 o initialize, aquella variable puede ser usada en cualquier otro método de esta clase. Ejemplo:



A las variables @numero1 y @numero2 le damos valor en initialize para luego usarlas cuando llamemos al metodo metodo_1.

Dato adicional sobre las variables de instancia. Créditos a @kyonides-arkanthos:

Es cierto que por sí solas las @variables de instancia no se pueden llamar fuera de su clase con ese símbolo antepuesto, PERO sí podrían ser utilizadas fuera de su propia clase si Uds. le permiten ser accedidas por otras clases o módulos.

Eso lo harían de la siguiente manera

class MiClase
def mi_metodo
@mi_metodo
end
end


clase = MiClase.new
msgbox clase.mi_metodo

Si no me equivoco, el resultado de esa impresión de su valor sería nil.

¿Por qué pudimos acceder a esa variable?

Fue porque creamos un método que pudiera ser llamado desde cualquier otra parte donde exista la clase a la que pertenece. Una variante de eso sería

class MiClase
attr_reader :mi_metodo
end
clase = MiClase.new
msgbox clase.mi_metodo

Y de nuevo el resultado debería ser nil.

¿Por qué sucede eso? Pues, se debe a que Module nos permite utilizar uno de sus métodos de creación de métodos que solo serán leídos, su valor no cambiará con eso. No les explicaré más de Module por su nivel de complejidad y porque de momento no lo necesitan. Les bastará con saber que para algo sencillo como eso hay dos formas de hacerlo. La diferencia entre ellos es que attr_reader permite recibir la cantidad de argumentos que Uds. le quieran pasar, mientras que el def o lo que define ese método solo lo hará con ese método que se defina en esa momento, solo uno a la vez.



Superclase

Si tenemos 2 clases Clase_A y Clase_B, y queremos usar los métodos de Clase_A en Clase_B, lo hacemos así:



Ese < Clase_A que escribimos a la derecha del nombre de la clase, copia todo lo que hay en Clase_A dentro de Clase_B, de manera que, como puedes ver en el ejemplo, llamamos a metodo_1 en el initialize de Clase_B, estando este método creado en Clase_A.

Y... ¿si en Clase_B queremos agregarles cosas a metodo_1 pero sin sobrescribir las que ya estén hechas en Clase_A ? Para eso usamos la palabra super:



Nota que si metodo_1 en Clase_A ya pedía argumentos, en super debemos entre paréntesis darle valor a estos argumentos. Si en caso contrario metodo_1 en Clase_A no pide argumentos, basta colocar solo la palabra super sin nada entre paréntesis.

En este ejemplo, al llamar a metodo_1 mediante una instancia de Clase_B, primero se suman los numeros, y luego se multiplican.

Dato adicional sobre 'super'. Créditos a @kyonides-arkanthos:

Hay una curiosidad sobre super, no sé si la mencionaron ya. Si utilizan super, así sin argumentos ni paréntesis, super tomará los argumentos del método donde fue invocado y se los pasará al método al que llama. Si no hay argumentos qué pasar, no hay problema. Lo malo es cuando sí hay argumentos pero no se busca que se los pase al método que llama (al de la clase madre o superclase). En ese caso es indispensable solo pasar los argumentos necesarios o escribir super() para que no le pase ninguna a la superclase.

Alias

Si tenemos dos métodos del mismo nombre:



Como podrás imaginar, el segundo MiMetodo sobrescribirá al primero, y el mensaje será "lol" y no "jaja".
¿Como evitamos eso? Creamos un alias de este método. Un alias se crea así:

alias [nombre del alias] [nombre del metodo]

O así:

alias :[nombre del alias] :[nombre del metodo]

¿La diferencia? En el segundo caso anteponemos dos puntos al nombre del alias y al nombre del método. El efecto en sí es el mismo.

El nombre del alias lo usaremos para llamar al método. Ten cuidado de no repetir ningun nombre de alias.
El nombre del metodo es el metodo que no queremos sobreescribir. en este caso, MiMetodo.
Muy bien, en marcha:



Ahora, al ejecutar el alias alias_de_ejemplo, estamos ejecutando el primer MiMetodo, por lo que no lo sobrescribimos.

Ten en cuenta también que si el primer MiMetodo pide argumentos, en el alias debemos indicarlos:



Fin

Puedes ver la siguiente parte del tutorial aquí.

Ya está, espero que les sirva. Dudas o errores míos haganmelos saber Ópalo Contento
En el proximo tutorial, crearemos un script simple que se puede usar en nuestros juegos.

Buen scripteo! Saludos!



Última edición por XSerozY el Miér Jul 15, 2015 4:10 am, editado 3 veces

#2 Re: RGSS3 Para principiantes - Parte VI el Sáb Jul 11, 2015 7:06 am

Wigan

avatar
Muy lindos tus tutoriales, pero a modo de sugerencia (no quiero interrumpir tus tutos SOLO ES UNA SUGERENCIA) estaría bueno tener un objetivo concreto. Por ejemplo sería excelente que todos estos tutoriales que creaste desembocaran en la creación de un script que permita abrir una ventana en el que podamos incrustar opciones, como por ejemplo: crear un warper (aunque sé bien que esto es posible hacerlo sin script), es decir un npc a quien hablamos y se abre una ventana con la lista de lugares a los que queremos ir.

Tomalo o dejalo, pero en general la mayoría de profesionales en Ciencias de la Educación entendemos que el aprendizaje se produce gracias al conflicto del alumno frente a un problema, el objetivo será la iniciativa para que ocurra ese conflicto.

#3 Re: RGSS3 Para principiantes - Parte VI el Sáb Jul 11, 2015 8:11 pm

XSerozY

avatar
Buena sugerencia, la tendré en cuenta Opalo Hola gracias !

A partir del próximo tutorial estaremos creando scripts. Por ahora, me he centrado en conceptos básicos de Ruby.

Saludos!

#4 Re: RGSS3 Para principiantes - Parte VI el Dom Jul 12, 2015 12:43 am

XSerozY

avatar
Son detalles no esenciales(a excepción de :attr_reader que pensaba agregarlo más adelante junto a attr_accessor y :attr_writer) pero que no están de mas saber. Agrego tus datos al post como nota adicional y Ópalo Reputación para ti kyo y gracias por aportar al tema, entre todos podemos animar a la comunidad a iniciarse en el mundo del scripting Ópalo Contento

Ahh y lo mismo hago con el dato sobre return que nos diste en la parte III del tuto.

Gracias y Saludos!! Opalo Hola

Contenido patrocinado


Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 1.]

Permisos de este foro:
No puedes responder a temas en este foro.