#1
Scripting y Más Scripting Vie Sep 07, 2018 7:22 am
Reputación del mensaje :100% (5 votos)
kyonides










Empecemos con algo que todo queremos hacer, mostrar una ventana. Será como una de esas de diálogo o de algún menú sencillo que hayan visto ya.
VENTANAS
Lo primero que deben de saber es que window significa ventana en inglés. Si lo recuerdan, esto les ahorrará mucho tiempo.
En el Maker, ya sea XP, VX o Ace, necesitamos ventanas para casi todo que pueda mostrar información. La ventana básica es la clase Window. Como el Maker con RGSS 1, 2 o 3 necesitaba hacer ciertas cosas en C o C++, eso no está disponible para nosotros de forma directa. En su lugar nos dejaron otra, a su hija Window_Base.

Ejem, volviendo al tema, les cuento que toda clase empieza por lo más básico... ¡DEFINIRLA!


Eso se hace de una sencilla manera, llamándola una clase o class. Así como a la gente le llamamos por su título o título nobiliario, así también debemos llamarle al definirla. Como es una hija de Window, debemos mencionarla por igual a la clase madre, porque de esta hereda muchos métodos o elementos para poder funcionar correctamente según nuestras especificaciones y gustos.
Digamos que a la hija la llamamos por su título class, su nombre propio Window_Base y su "apellido" Window. Los términos correctos en inglés son child class, class name y super class.
- Código:
class Window_Base < Window
El símbolo menor que < indica ese parentesco, Window_Base hereda de Window.
Es así de obvio.

Bueno será mejor que no lo olviden...

Ópalo el Scripter escribió:En Ruby una clase se puede abrir y cerrar las veces que queramos, no tiene impedimentos, pero en la práctica jamás se cierra, porque le podemos seguir agregando más y más cosas.
Una vez que llegamos a la siguiente línea, debemos de digitar un medio para despertar a una clon de esa clase hija...

En fin, debemos crear algo así como nuestro despertador o nuestra máquina para hacer helados o copos de nieves o granizados.
- Código:
def initialize(x, y, width, height)

Bueno empecemos con algo que veremos muy seguido, def. El def lo usamos para definir el método o lo que nos permitirá manipular a la clase, en este caso a su despertador o inicialización, en inglés initialization. El verbo en ese idioma sería to initialize así que eliminamos el to y nos quedamos con el resto.

Todo método debe tener un nombre y ese será initialize. Este es el único método al que no le podemos cambiar el nombre en Ruby.

¿Recuerdan que dijimos que Window_Base es hija de Window? Esto tiene ciertas implicaciones. Entre ellas está que si la madre necesita ciertos argumentos o valores para despertarse y mantenerse despierta, como quien se toma un café y se atraganta con un delicioso desayuno. En el caso de ambas clases se comerán 4 cosas, que no huelen a café recién tostado, y son...
x, y - Coordenadas cartesianas, x es horizontal mientras que y es vertical.

width o ancho, height o altura -

Luego viene otra línea que dice...
- Código:
super()
Eso de super significa sobre como que encima de algo. En esta oportunidad es Window quién siempre está encima de Window_Base molestando sin parar...

Cuando se deja así con paréntesis pegados uno al otro, le decimos a Ruby que no le enviaremos NADA a su madre Window.
Me encantaría decir que somos bien malos con ella.

La verdad es que sí lo hacemos al final de cuentas como a regañadientes.

- Código:
@windowskin_name = $game_system.windowskin_name
Ahí podemos leer una cosa importante, cómo se llama el "maquillaje" que la hija va a ponerse antes de salir a la calle. Es su piel, su skin o windowskin. Como todo debe llevar un nombre, la debemos llamar @windowskin_name.
Sin esa piel no podemos hacer nada útil. Nada.

¿Dónde la encontramos?
Pues es en $game_system.

¿Qué es eso?

Digamos que es la parte del sistema del juego que nosotros SÍ podemos manipular. Digamos que nos servirá de esqueleto para mantener armadas varias piezas de nuestro cuerpo makero.
Como no ocupamos a todo nuestro esqueleto $game_system, agarraremos solo una partecita, windowskin_name. Esto quiere decir nombre de la piel del sistema y ahí guardamos el nombre de ese archivo gráfico cuando estamos jugando o probando nuestro juego.
Por cierto, la mía es bien roja con algo de blanco.

(Cuando manipulamos la base de datos está en otra parte...)

Para indicar que pertenece a $game_system le agregamos ahí un punto . tal como usaríamos "de" para unir un objeto a quien le pertenece en una oración.
Imaginemos que hablamos inglés o japonés y que por eso el dueño va primero y la posesión después.

Como ya la tenemos guardada para uso futuro en @windowskin_name cuando le pusimos el igual = y dejamos todo ese texto al lado, podemos saltar a la siguiente línea.
- Código:
self.windowskin = RPG::Cache.windowskin(@windowskin_name)
self es mismo, yo, etc.

En este caso nos referimos a la clase hija, Window_Base. Necesitamos darle ya su piel o maquillaje, entonces mencionamos windowskin que la representa y le asignamos un valor, la hacemos igual a algo.
¿De qué se trata ese algo? Pues de lo que nos permitirá llamar al archivo con su piel. Eso es manejado por RPG::Cache.
Digamos que esa es una parte de toda la memoria de nuestro juego, algo así como su memoria fotográfica hecha un cofre o disco imaginario. Es lo que tendrá a buen recaudo nuestras pieles para ventanas y las obtenemos al pedirle su windowskin y especificando cuál de todos queremos, @windowskin_name.

- Código:
self.x = x
self.y = y
self.width = width
self.height = height
No se la dimos desde el inicio, así que nos las fue pidiendo una por una...

Ya le dimos nuestra x, nuestra y, nuestro ancho y nuestra altura. Sí, son las mismas cuatro de antes.



- Código:
self.z = 100
Esos cien que le damos a z se los va a tragar para salir más lejos que al inicio, en lugar de quedarse en el punto en el que estaba.

z ahí es igual a una tercera coordenada y se utiliza para la profundidad o la cercanía a nosotros los jugadores.

Mamá Opalina escribió:¡Ya ve a sacar la basura de una buena vez!

- Código:
def dispose
Ahí dispose quiere decir desechar, tirar (a la basura). ¿Cómo lo hacemos?
- Código:
if self.contents != nil
self.contents.dispose
end
super
if es igual a si condicional y pregunta si su contenido self.contents no es igual != a nada o nil.
Si hay basura o cosas viejas por tirar, entonces vaciamos todo su contenido con self.contents.dispose.
Cuando ya lo terminamos de hacer o lo hace ella a su tiempo, debemos ir a preguntarle a mamá Window si todavía queda más por tirar, de ahí que usemos super para hacer que suceda.
Sí, que se encargue ella del resto.

Ahí no necesitamos los paréntesis () porque damos por un hecho que ella sabe de nuestra basura ya empaquetada.

Cerramos ambos métodos con su propio end o fin o final.
¡Tranquilos, muchachos!

Ópalo el Fiestero escribió:¡Dejaremos los demás detalles para otra ocasión!
Y aquí les dejo el código un poco más completo, aunque en el maker notarán que existen muchas más cosas.

- Código:
class Window_Base < Window
def initialize(x, y, width, height)
super()
@windowskin_name = $game_system.windowskin_name
self.windowskin = RPG::Cache.windowskin(@windowskin_name)
self.x = x
self.y = y
self.width = width
self.height = height
self.z = 100
end
def dispose
# Dispose if window contents bit map is set
if self.contents != nil
self.contents.dispose
end
super
end
def text_color(n)
case n
when 0
return Color.new(255, 255, 255, 255)
when 1
return Color.new(128, 128, 255, 255)
when 2
return Color.new(255, 128, 128, 255)
when 3
return Color.new(128, 255, 128, 255)
when 4
return Color.new(128, 255, 255, 255)
when 5
return Color.new(255, 128, 255, 255)
when 6
return Color.new(255, 255, 128, 255)
when 7
return Color.new(192, 192, 192, 255)
else
normal_color
end
end
def normal_color
return Color.new(255, 255, 255, 255)
end
def disabled_color
return Color.new(255, 255, 255, 128)
end
def system_color
return Color.new(192, 224, 255, 255)
end
def crisis_color
return Color.new(255, 255, 64, 255)
end
def knockout_color
return Color.new(255, 64, 0)
end
def update
super
# Reset if windowskin was changed
if $game_system.windowskin_name != @windowskin_name
@windowskin_name = $game_system.windowskin_name
self.windowskin = RPG::Cache.windowskin(@windowskin_name)
end
end
end
M