¡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 Scripting y Más Scripting el Vie Sep 07, 2018 7:22 am

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

kyonides

avatar
Opalo Hola ¿Qué tal? Su amigo Ópalo está de vuelta para guiarlos un poco en este extraño mundo del scripting...
Opalo Triste O al menos los representaré a la hora de tener dudas de importancia con respecto a cualquier tema.

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.

Opalo Sorprendido ¿Será que podré salir con ella algún día?

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

Opalo Hola Claro que ustedes ya lo sabían... ¿o no lo sabían? Opalo Sorprendido 

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. ¡Que no!

Bueno será mejor que no lo olviden... Ópalo Aturdido 


Ó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...

Opalo Sorprendido Ahora que lo pienso bien ¡siempre he trabajado con clones!

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)

Opalo Sorprendido Se me olvidó que no les he dicho qué quiere decir todo eso...

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.

Ópalo Carcajada me encanta saltarme las palabras innecesarias al hacer scripts.

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.

¡Que no! ¡No, no lo intenten!

¿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.  Ópalo Pensador Siempre empiecen pensando en la esquina superior izquierda de su pantalla o de la ventana principal del maker al jugar. ¡De ahí partimos siempre!

width o ancho, height o altura -  Ópalo Llanto Sí, ya sé que subí algo de peso y que no soy muy alto que digamos, pero eso ejemplifica a la perfección lo que hacemos ahí, engordamos o adelgazamos a la ventana, la hacemos crecer verticalmente o la hacemos enana.

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...  Ópalo Llanto

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. Ópalo Carcajada

La verdad es que sí lo hacemos al final de cuentas como a regañadientes.  Opalo Triste  Se los explicaré más adelante...

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. ¡Que no!

¿Dónde la encontramos?

Pues es en $game_system.  Ópalo Pensador

¿Qué es eso?  Opalo Sorprendido

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.  Ópalo Troll

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

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. Ópalo Excusa

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.  Ópalo Carcajada  Sí, me gusta robar cámara, ¡lo admito!

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.

Ópalo Memo Err, ¿se acuerdan de que dije que la madre Window igual nos iba a exigir cuatro cosas? Pues esas son las cuatro siguientes líneas...

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...  Ópalo Llanto Nos dejó sin nada de eso...

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

Ópalo Aturdido ¿Saben qué es lo peor? ¡Que nos quita una quinta cosa! Opalo Sorprendido

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. Opalo Triste

z ahí es igual a una tercera coordenada y se utiliza para la profundidad o la cercanía a nosotros los jugadores. Ópalo Pensador ¡Recuerden esto!

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

Ópalo Excusa ¡Qué queda! A sacar la basura...

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. Ópalo Carcajada

Ahí no necesitamos los paréntesis () porque damos por un hecho que ella sabe de nuestra basura ya empaquetada. Ópalo Party ¡Ya es hora de rumbear para desentendernos del resto!

Cerramos ambos métodos con su propio end o fin o final.

¡Tranquilos, muchachos! Ópalo Hachimaki Aquí nadie muere...

Ó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. Ópalo Aturdido

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

#2 Re: Scripting y Más Scripting el Sáb Sep 08, 2018 9:58 pm

xXIsrael0499Xx

avatar
Excelente, para alguien que no tiene ni idea, le servira de mucho.

Material asi es porque se creo la scene hispana, todo ese ingles esta consumiendo al mundo. Asi que se te agradece el aporte zorro, quizas mucha gente no lo valore, pero yo se cuan dificil es ponerse a escribir una guia.

A mi me da mas pereza que otra cosa xD

Saludos y que orochii te guie.

#3 Re: Scripting y Más Scripting el Dom Sep 09, 2018 3:17 am

Bleuw

avatar
Muy buena guía, espero que a muchos les sirva, a mi seguro que sí porque soy un asno para lo que se refiere a códigos. Por lo que la voy a tener a mano y repasar a la hora de makear. De hecho puse la página a favoritos por si luego me olvido donde estaba.
Seguro otros además de mi le van a sacar provecho, espero que quien quiera aprender un poco, se tome el tiempo y la dedicación de leer atentamente. Que la gente se asusta cuando ve un poco de texto. Mas está explicado muy bien por lo que puedo apreciar. Así que gracias por el aporte. Al menos a mi me sirve...a ver cuales detalles quedan para la próxima ocasión.

En fin, saludos.

#4 Re: Scripting y Más Scripting el Dom Sep 09, 2018 6:41 am

Reputación del mensaje :100% (1 voto)

kyonides

avatar
Otra cosa que podemos meter en el initalize o la inicialización de nuestra ventana es el color de la letra o tipo o fuente o font en inglés.

Empecemos por lo más fácil, con el color. Aprenderemos a definir un color.

Es muy sencillo, solo debemos recordar que hay que crear una copia o instancia o clon de Color, la clase que le da más vida a los textos de nuestras ventanas.

Ópalo Aplaudiendo ¡Qué bien! Ahora podré pintarme de rojo sin problemas.

Código:
Color.new(255, 255, 255, 255)

Eso es le damos color nuevo y 3 o 4 argumentos o parámetros o valores para definir dicho colorcito. Por tradición son Rojo o Red, Verde o Green, Azul o Blue, todos mejor conocidos como RGB en muchos editores como Paint, Kolourpaint, Gimp o incluso Photoshop.

Ópalo Carcajada A GraphicGale o como se llame lo dejamos fuera por caerse a cada rato, ¡ja, ja!

Ópalo Memo Aunque creo que dije que podía haber un cuarto argumento...

Opalo Sorprendido ¡Es cierto! Me olvidé de que era el alfa o Alpha y que por eso también existe el RGBA.

Ópalo Pensador Si les cuesta entenderlo así, véanlo como un control de nivel de opacidad, 0 para invisible y 255 para 100% visible y no traslúcido. Para traslúcidos pueden dejarlo en algún valor intermedio.

Ópalo Memo ¿Y ahora cómo hacemos un blanco?

Bueno solo debemos definirlo como 255 para rojo, 255, para verde y 255 para azul. Esta combinación nos dará blanco. Cualquier artista digital se los confirmará.

Ópalo Memo ¿Y si lo que quiero es un gris?

Puedes hacerlo como un color, o simplemente cambiar el cuarto argumento de 255 a no sé, 180 o 160 o 120. Con menos opacidad, el blanco se ve grisáceo.

Ópalo Pensador Recuerden que el cuarto argumento de opacidad es opcional si su valor fuera de 255.

Ópalo Memo No, lo que yo en realidad quería era un negro como el de mis manchitas...

Entonces sería especificar ahí un 0, 0, 0 y ¡listo!

Opalo Sorprendido Lo haces sonar como algo muy fácil.

En realidad si lo piensas bien, no es difícil, solo recuerda Ópalo Memo que esto se va a los extremos. Si todos los 3 dan blanco con 255, lo mismo será negro si les damos 0 a todos esos.

Para un celeste pueden utilizar...

Código:
Color.new(192, 224, 255, 255) o solo Color.new(192, 224, 255)

Para un amarillo puede servirles esto...

Código:
Color.new(255, 255, 64)

Para un rojo sería...

Código:
Color.new(255, 64, 0)

Para un café o castaño...

Código:
Color.new(90, 45, 0)

Opalo Enojado Sí, muy bonito que podamos escoger el color, pero ¿cómo rayos se supone que se lo doy a un texto?

Opalo Triste Bueno, lo siento, ¡no me mates por olvidarlo!

Eso se puede hacer con asignarle ese bonito color a la fuente, como Arial se usa por defecto, no debemos hacer nada por definirla antes.

Código:
self.contents.font.color = Color.new(192, 224, 255)

Y tendríamos un texto en celeste.

Ópalo Memo ¿Será que se me olvidó algo más en esta sección?

Opalo Sorprendido ¡Caray! No les dije algo importante para evitar un crash fatal...

Antes de asignar colores a font o la letra para nuestros textos, necesitamos un lienzo electrónico y a esto le llamaremos Bitmap o "mapeo" de bits o conjuntos de bits que muestran uno o más colores cuando se juntan. Eso lo meteremos en self.contents donde la clase representada por self mete sus contenidos o contents en inglés.

Lo creamos así:

Código:
self.contents = Bitmap.new(ancho, alto)

Con eso creamos una imagen vacía de relleno con el tamaño que consideremos útil para mostrar todos nuestros textos y quizá otras cosas más por ahí.

Ópalo Memo ¿Dónde nos conviene colocar todo eso de self.contents?

Eso sería en uno de varios lugares.


  • En el método initialize
  • En el método refresh
  • Opcionalmente en un método draw_algun_nombre

Este último puede ser un método que ya exista en Window_Base o incluso uno que nosotros creemos a voluntad. Todo dependerá de si luego de crearlo necesitaremos recrear el Bitmap o no lo ocuparemos. Por lo general se lo suele dejar en initialize en una clase hija de Window_Base, algo así como la nieta de Window.

Ópalo Emocionado ¡Ya se nos hace grande la familia!

Ópalo Pensador Recuerden que NO conviene hacerle muchos cambios a Window_Base, no la toquen si no saben MUY bien lo que están haciendo. Si se van a embarcar en un viaje desconocido, háganlo en su propia clase. Sería algo como esto:

Código:
class Window_MiVentana < Window_Base

Luego ahí le pueden meter todo el relleno que gusten, siguiendo los consejos de su amigo Ópalo o los de cualquiera otra guía.

Ópalo Pensador También les recuerdo que no olviden definir ahí self.contents = Bitmap.new(ancho, alto) SIEMPRE con el self, o sea la misma clase, para que el script no les dé error.

Ópalo Memo ¿Por qué lo dices?

Bueno es que si no me hacen caso, el script pensara que es una variable local o un objeto momentáneo que puede tirar a la basura cuando termine de inicializar su ventana.

Ópalo Party ¡Y ahí los veré cómo les suena el cornetazo por hacerlo mal!

self.metodo es una forma de decirle a la clase que busque un método dentro de su lista de métodos y no una variable o nombre descartable ahí mismo.

Les dejo un ejemplo por si acaso más de uno no captó aún a qué me refiero. ¡Así que paren esas antenas!  Opalo Hola

Código:
class Window_TempWindow < Window_Base
  def initialize(x, y, w, h)
    super
    self.contents = Bitmap.new(w - 32, h - 32)
    self.contents.font.name = "Times New Roman"
    self.contents.font.color = Color.new(192, 224, 255)
  end
end

Opalo Sorprendido Pero ahí veo que también hay una fuente que reconozco, la Times New no sé qué.

Es cierto, antes puedo definirle el tipo de letra de esa manera con self.contents.font.name. Como no ocupamos toda la font no terminamos justo en font sino que llamamos a su método name o nombre en español. Pudo ser "Verdana" o "Trebuchet" o cualquier otra, preferiblemente de tipo TrueType Font o TTF.

Opalo Sorprendido ¡Momento! Ahí tampoco le dimos nada a la madre, Window_Base, como nos lo dijiste...

Ópalo Pensador Piénsalo mejor, ahí hay un super que automáticamente le pasa todo a la madre.

Ópalo Excusa No era malo preguntar para evitarse congojas después...

Ahora me les adelantaré y les diré cómo hacer que su mensaje salga en pantalla con el texto que Uds. deseen.

Para eso requieren de la ayuda de otro método de Window_Base llamado draw_text.

Ópalo Troll ¡Ya me voy a convertir en artista!

¡Que no! No tan rápido, que solo vamos a mostrar texto, mi amigo grafitero.

Lo haremos así:

Código:
self.contents.draw_text(x, y, ancho, alto, texto, opcional es la alineación)

Esos serían los datos o parámetros o argumentos que debemos pasarle para que funcione. Esto debe servir tanto para XP como VX y VX Ace. Lo que sucede es que estos otros pueden tener métodos más específicos para cosas muy concretas como datos del personaje o stats.

Código:
self.contents.draw_text(0, 0, width - 32, 24, "Olakeaze")

Ópalo Carcajada Ese soy yo hablando después de pasarme de tragos o de niveles recomendados de azúcar en la sangre.

Eso imprimiría un texto muy mal redactado del lado izquierdo de su ventana, no de la pantalla. Deben saber que la ventana puede ser colocada en cualquier parte del espacio disponible en su juego.

En XP sería de 0 a 640 de ancho y de 0 a 480 de alto, pero en los otros dos sería hasta 544 de ancho y 416 de alto. Incluso si lo hacen de lo peor, pueden colocarla total o parcialmente fuera de foco o fuera de la parte visible del juego como un -640 para x solo por dar un ejemplo.

¡Que no! Nunca hagan eso a menos que sepan BIEN lo que están haciendo, chicos.

Si suponemos que le dimos un tamaño como el de la ventana de diálogo del Maker, eso se vería así...


O eso nos mostraría F2 si lo presionamos mientras digitamos el contenido textual. Solo tengan en cuenta que ahí no le dijimos que usara colores que normalmente podemos encontrar en la ventana de diálogo y por eso sale todo en blanco.

Opalo Sorprendido ¿No me creen todavía?

Opalo Hola Bueno aquí les va la prueba de que lo que les digo ahora es totalmente verídico.


¿Lo ven ahora? Incluso les probé cómo Alexis es su propio némesis, ni con dos de ellos hacemos un medio. Ópalo Carcajada

Aquí les dejo el código.

Código:
class Window_TempWindow < Window_Base
  def initialize(x, y, w, h)
    super(x, y, w, h)
    self.contents = Bitmap.new(w - 32, h - 32)
    self.contents.font.name = "Times New Roman"
    self.contents.font.color = Color.new(192, 224, 255)
    self.contents.draw_text(0, 0, width - 32, 24, "Olakeaze")
  end
end

Peguen esto en un llamado a script desde algún evento activable mediante el botón Aceptar.

Código:
$win = Window_TempWindow.new(240, 80, 180, 64)

Creen un diálogo como el del ejemplo de la manera tradicional ahí mismo y se terminarán muriendo de la risa como yo. Ópalo Carcajada Es que me encanta serrucharle el piso a ese pusilánime de Alexis.

Ópalo Pensador Solo recuerden que el Bitmap debe tener 32 pixeles de ancho menos de ancho y de alto que la propia ventana o les saldrán cosas raras.




Opalo Hola A petición de un usuario les agrego que para ir corriendo un texto a imprimir en pantalla deben de hacer lo siguiente:

Código:
self.contents.text_size(texto_a_medir)

Eso les "proveerá" o retornará un valor, un rectángulo o clase Rect.

Ópalo Pensador Como en todo rectángulo hay un punto de partida x más otro y, además del ancho o width y la altura o height. El de RGSS no es la excepción.

Para convertirlo en el ancho necesitan esto otro:

Código:
self.contents.text_size(texto_a_medir).width

Y obtendrán el ancho o width de ese rectángulo.

Para poder aplicarlo a algún texto predefinido o escogido ahí, es mejor que lo asignen a una variable. Es decir, vayan a igualarlo a una palabra escogida al gusto como aquí:

Código:
ancho = self.contents.text_size(texto_a_medir).width
self.contents.draw_text(ancho, 0, width - ancho, 24, otro_texto)

Ópalo Carcajada A que soy un genio escogiendo nombres.

Para ir agregando cosas solo deben sumarle el ancho del siguiente texto a la variable local, que aquí es llamada ancho.

Código:
ancho += self.contents.text_size(otro_texto).width

variable += valor numérico es igual a variable = variable + valor numérico

En palabras simples, es una manera rápida de decirle a RGSS o Ruby según el caso, que vaya y al valor original de nuestra variable se le sume un nuevo valor, o sea, pasamos de 20 a 20 + 16 para que quede en 36 para la próxima vez que la utilicemos.

Opalo Triste Pero solo puedo usarlo una vez...

¡Que no! No hay problema con repetirlo las veces que sea necesario, eso bien podría llegar a cientos de repeticiones si es de su gusto.




Yo me despido... ¡Hasta la próxima! Ópalo Chao

#5 Re: Scripting y Más Scripting el Jue Sep 13, 2018 6:58 am

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

kyonides

avatar
En la lección de hoy veremos cómo insertar un ícono en las ventanas que creamos.

Ópalo Memo ¿Cómo cuál sería? No me queda claro...

Pues, se trata de íconos o pequeños dibujos de los objetos que los héroes pueden ir acumulando durante el juego, uno de los más comunes es poción. Para los amantes de Pokemon serían cosas como Baya Ciruela o Caramelo Raro o Super Repelente.

Ópalo Troll Me haré pasar por un pokemon para hacerme con todo eso.

Sí, qué buen plan, amigo Ópalo...

Para eso iremos al script Window_Base y buscaremos el siguiente método en XP:

Código:
def draw_item_name(item, x, y)
    if item == nil
      return
    end
    bitmap = RPG::Cache.icon(item.icon_name)
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
    self.contents.font.color = normal_color
    self.contents.draw_text(x + 28, y, 212, 32, item.name)
  end

...o este otro en VX:

Código:
def draw_icon(icon_index, x, y, enabled = true)
    bitmap = Cache.system("Iconset")
    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
    self.contents.blt(x, y, bitmap, rect, enabled ? 255 : 128)
  end

En el primero, XP recibe el objeto a utilizar, digamos que es la poción, y las coordenadas x y. Si por error no hubiera ninguna poción ni nada más ( == nil), terminará ahí el llamado sin dibujarnos nada.

Ópalo Buscapleitos ¡Esa condenada ventana tan vagabunda!

Presten atención aquí, en bitmap vemos que se le asigna un valor de la memoria, RPG::Cache, muy específico, un ícono o gráfico pequeño, sería como de 24px por 24px. Todos los objetos, las armas y las armaduras tienen un método llamado icon_name o nombre del ícono, un simple texto.

Opalo Enojado Nada hago yo con eso.

¡Que no! Te equivocas, lo ocuparas muy pronto. De hecho así es como busca el archivo de ese ícono en Icons.

Como ya lo aclaró él, lo busca ahí y lo convierte en un Bitmap, que tiene x, y, ancho y alto.

Si lo recuerdan, sabrán que en self.contents veníamos guardando los textos a desplegar. Ahora le vamos a añadir el ícono utilizando un método especial, blt. Es como una abreviatura de un nombre técnico para describir la transferencia de una imagen a otra en blanco. Como era de esperar, debemos darle un punto de partida x y, además de pasar el nuevo bitmap entero y como último dato obligatorio le damos las dimensiones del rectángulo Rect que deseamos que muestre. Ahí pueden confirmar que es de 24 px.

En casos como estos no hay problema con luego agregar un texto como ya lo veníamos haciendo. Allá arriba pueden ver como le asignamos un color y un texto, item.name o nombre del objeto, la poción. normal_color no es otra cosa más que el color blanco.

¡Que no! No es más complicado que eso en XP.

Ópalo Excusa Pero VX es otra historia...

Allí en draw_icon, dibujar ícono, le pasamos un quinto argumento enabled que define si el ícono se verá normal 255 o algo traslúcido 128.

Ópalo Emocionado ¡Ay! Mi ventana bebita es glotona como yo.

Los otros parámetros son icon_index, x, y. icon_index simplemente es la posición del ícono.

Ópalo Excusa Siento que sigo en el aire.

Err, se trata de lo siguiente, en VX ya habrán notado que hay no una serie de archivos de íconos como en XP sino uno único, donde se colocaron todos ellos, uno tras otro.

Ópalo Troll Están tan bien coordinados los pobres que ya quiero ir a sembrar la semilla del caos con una protesta sindical para provocar tumultos.

Buena suerte con eso, mi rojizo amigo...

Como en Ruby y por ende también en RGSS toda posición empieza con 0, como decir el 0 centímetros en una regla, debemos contar cada cuadro desde cero hasta llegar al que deseamos.

Opalo Enojado Mejor sería dejar que lo hiciera el maker por uno que cansarse haciendo eso.

Y tienes toda la razón, el maker lo hará por nosotros de todas formas. Lo malo es que antes de eso nos hicieron algunos cambios en VX. Ahí el bitmap ya no es igual a RPG::Cache, lo renombraron y se le conoce ahí como Cache.

Ópalo Excusa Al menos es más corto que el anterior.

Otro detalle es que en VX no existe la carpeta Icons. Debemos buscarlo en Systems así Cache.system(nombre_del_unico_archivo_de_iconos), en ese caso simplemente es "Icon Set".

¿Recuerdan toda ese discurso sobre el Rect?

Opalo Enojado Claro, la parte en la que casi me haces caer dormido.

Perdón... Lo que pasa es que allí se define rect como un Rect nuevo con new.

(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)

Allí el maker automáticamente recuerda la posición del ícono y la divide entre 16 para sacar el cociente, si no es 0 porque sobro algo entre 0 y el ancho máximo de íconos menos 1, lo buscará en la siguiente columna hasta llegar a la correcta. Hace lo mismo con el eje pero solo lo divide entre 16 y listo, así saca a qué altura (o fila) está.

Ópalo Memo Se me congeló el cerebro como si hubiera comido un helado muy frío...

Esperemos que se te pase pronto, mi estimado Ópalo.

Una vez que hicimos ese cálculo "sencillo", se lo pasamos a blt en lugar del Rect del XP, ya que la ubicación del rectángulo del ícono en VX es muy variable.

Ópalo Aturdido Estoy confundido, ¿qué obtenemos de todo esto?

Err, bueno, resulta que no necesitaban saberlo realmente...

Opalo Sorprendido ¿Qué cosa has dicho? Nos hiciste perder el tiempo ¡porque sí!

No es del todo cierto, resulta que si les diera algún error, ya pueden tener una mejor idea de cómo es que ocurrió. En especial si no logran ver el ícono y saben que sí es visible en el archivo o sí tiene el tamaño adecuado.




Ópalo Memo Creo que eso era un poco avanzado para mí...

¿Solo un poco? Si tú lo dices, Ópalo.

Ópalo Excusa De todas formas no sé aún qué hacer con eso.

Ah eso se arregla fácil. En XP solo deben agregar un llamado así a su ventana:

Código:
draw_item_name(objeto, x, y)

En VX sería:

Código:
draw_icon(posición_del_ícono, x, y, debe_verse)

Ahí enabled o debe verse es opcional, pueden omitirlo si lo desean y es igual a true o cierto. true es un boolean o valor para verificar la existencia o no existencia de algo, en esos casos los valores deben ser true o false.

Opalo Enojado Creo que todavía me debes algo.

¿Cómo qué sería, Ópalo?

Opalo Sorprendido ¡Ah, es cierto! No me lo has demostrado con una ventana.

Disculpa por olvidar ese pequeñísimo detalle, pero justo ahora podemos pasar a esa parte.

Ópalo Chao Pero apresúrate que no tengo tiempo qué perder.

Esta bién, pero en el caso de XP haremos que se parezca al de VX al hacer nuestra una versión del draw_icon que parece ser tan útil...

Ópalo Carcajada Yo ya sabía que pensamos parecido, mi amigo del alma. No tiene nada de malo que nos apropiemos de algo que sirve, ja, ja.

Es todo un honor, mi querido Ópalo...

Código:
def draw_icon(item, x, y, enabled = true)
    bitmap = RPG::Cache.icon(item.icon_name)
    rect = Rect.new(0, 0, 24, 24)
    self.contents.blt(x, y, bitmap, rect, enabled ? 255 : 128)
  end

Y ahora se ve similar al de XP. Si tienen VX, no hace falta que lo hagan a no ser que deseen crear un nuevo método para íconos más grandes o sueltos / separados como en XP.

aquí les dejo la imagen.


Ópalo Emocionado ¡Pero qué fotogénico soy!

Roba cámaras dirás...

El código correspondiente se los dejo aquí.

Código:
class Window_TempWindow < Window_Base
  def initialize(x, y, w, h)
    super(x, y, w, h)
    self.contents = Bitmap.new(w - 32, h - 32)
    refresh
  end

  def refresh
    self.contents.clear
    self.contents.font.name = "Times New Roman"
    self.contents.font.color = Color.new(192, 224, 255)
    draw_icon('opalo saluda', 0, 0)
    text = "¡Saludos a todos mis amigos foreros!"
    self.contents.draw_text(48, 0, width - 32, 24, text)
  end

  def draw_icon(item, x, y, enabled = true)
    if item.is_a?(String)
      bitmap = RPG::Cache.icon(item)
      rect = bitmap.rect
    else
      bitmap = RPG::Cache.icon(item.icon_name)
      rect = Rect.new(0, 0, 24, 24)
    end
    self.contents.blt(x, y, bitmap, rect, enabled ? 255 : 128)
  end
end

Como podrán notar tuve que correr el texto del saludo para que no le cayera encima a nuestro amigazo de Ópalo.

Ópalo Carcajada Es que todo el mundo tiene derecho a admirar mi gallardía.

#6 Re: Scripting y Más Scripting el Mar Sep 18, 2018 7:17 pm

zamora021

avatar
Ópalo Aplaudiendo Ópalo Aplaudiendo Ópalo Aplaudiendo Ópalo Aplaudiendo Ópalo Aplaudiendo

Vaya, ¡que buen tutorial! Está bien explicado y es fácil de entender para el que no sabe programación, además que la narrativa interactiva con Ópalo lo hace divertido.

Te dejo  Ópalo Reputación Ópalo Reputación

Ópalo Aplaudiendo Ópalo Aplaudiendo Ópalo Aplaudiendo Ópalo Aplaudiendo Ópalo Aplaudiendo


Esperaré con ansias la siguiente lección, por que también quiero aprender programación para juegos.

#7 Re: Scripting y Más Scripting el Vie Sep 21, 2018 3:41 am

Vala

avatar
¡Qué genial!
Ya decía yo que hacía falta un scripter buena onda que se diera la tarea de compartir su sabiduría. Y era cuestión de tiempo para que llegaras vos.
La verdad es que todavía no lo pude leer, por mi falta de tiempo, pero no me cabe duda de que este post merece un Ópalo Reputación
Espero que sigas adelante con este emprendimiento bienaventurado.

Saludos,
Vala.



#8 Re: Scripting y Más Scripting el Sáb Sep 22, 2018 8:20 am

Reputación del mensaje :100% (1 voto)

kyonides

avatar
Alias


Opalo Hola ¡Ah, sí! Yo recuerdo esa serie. Creo que ahí es donde salía la exmujer de Ben Affleck, esa Jennifer Gardner... Ópalo Fan

Hablamos de scripting, no de series ni actrices.

Ópalo Excusa ¡Perdón, mister amargado! Opalo Triste Y yo que pretendía prestar atención a la lección de hoy...

¡Cómo sea! El asunto es que este tema ni siquiera es muy gráfico que digamos.

Opalo Enojado ¿Y qué esperas para hacerlo bien gráfico?

Es imposible, mi rebelde amigo, ya que no tiene nada que ver con dibujos ni textos en una ventana del maker.

Ópalo Aturdido Y una vez más me quieren hacer quedar como tonto...

En fin, alias es el método que nos permitirá reescribir un método sin borrar su contenido original. Esto sirve para una cosa...

Opalo Enojado Para aburrirme no más.

Err, no, es para solo agregarle algunas cosillas extras a un método que alguien más haya creado, como pasaría con los scripts por defecto del maker.

Opalo Sorprendido ¡Qué gran revelación! Los scripts del maker son defectuosos.

Bueno, eso no era lo que quería decir, pero sí, de vez en cuando hay algún pequeño fallo como el de evaluar un script o llamado a script que retorna false y nos manda todo al carajo por no hacer lo que se suponía que hiciera en primer lugar.

Ópalo Memo Y me volví a entumecer como si me hubiera emborrachado hasta las...

Sí, es mejor que no termines esa frase, mi bebedor Ópalo.

El asunto es que hay momentos en los que le queremos agregar algo al maker sin quitar lo que ya viene haciendo en esa área. Un ejemplo claro sería algo tan simple como darle una edad a los héroes, cosa que no viene en ninguna de las versiones del maker hasta la fecha.

Ópalo Troll Pondré que tienen 100 años y son todos unos vejestorios, je, je.

No te lo creerán, basta con ver sus caras para descartarlo.

Ópalo Troll Pero hará que no los dejen entrar porque su identificación es falsa.

Bueno, ahora que lo mencionas, podríamos hacer eso con Aluxes alias Alexis...

Ópalo Fan Ya envidio a Alexis, va a conocer a mi ídolo televisivo.

No interrumpas más, Ópalo, que por tu culpa casi no hemos avanzado hasta el momento.

Ópalo Llanto OK, ya me callo...

Como les decía, ahora vamos a usar alias en Alexis para asignarle una edad acorde con sus capacidades actuales.

Ópalo Carcajada Que son prácticamente nulas, ¡ja, ja, ja!

Pues, ahí sí que no tengo argumentos para contradecirte, je, je.

Entonces iremos a la clase Game_Actor para agregarle el dato de la edad a Alexis y por ende a todos los demás actores también.

Ópalo Aturdido ¿No habrá manera de que un actor como Alexis me deje entrar a verla a mi Jenny?

Esa serie ya ni siquiera se graba en un estudio de filmación...

Ópalo Llanto Y ahora te atreves a romperme el corachonchito...

OK... les dejo aquí un extracto del contenido de Game_Actor en XP.

Código:
class Game_Actor < Game_Battler
  attr_reader   :name                     # name
  attr_reader   :character_name           # character file name
  attr_reader   :character_hue            # character hue
  attr_reader   :class_id                 # class ID
  attr_reader   :weapon_id                # weapon ID
  attr_reader   :armor1_id                # shield ID
  attr_reader   :armor2_id                # helmet ID
  attr_reader   :armor3_id                # body armor ID
  attr_reader   :armor4_id                # accessory ID
  attr_reader   :level                    # level
  attr_reader   :exp                      # EXP
  attr_reader   :skills                   # skills
  def initialize(actor_id)
    super()
    setup(actor_id)
  end
# más código aquí
end

Si recuerdan las lecciones anteriores...

Opalo Hola ¡Ay! Cómo no me voy a acordar... Ópalo Memo

Ahí hablamos de la herencia de una clase de otra clase madre o superclase o superclass, además mencionamos el uso de super y super(). También estaba lo de inicializar una clase con initialize. Bueno, aquí vale todo eso que se dijo en aquel entonces.

Ópalo Memo

Continuemos con la parte del código que nos interesa...

Código:
class Game_Actor
  def initialize(actor_id)
    super()
    setup(actor_id)
  end
end

Opalo Enojado ¡Ahora sí te atrapé haciendo las cosas mal!

¿Mal? Pues no, no hay nada malo, es más es lo que debemos hacer para evitarnos errores. Veras, no es bueno volver a decirle cuál es la clase madre o superclase (Game_Battler), en especial si no nos acordamos de cuál es.

Opalo Enojado ¡Ay sí tú, mister sabiondo! Ahora también me vas a decir que se le pueden meter cosas a Game_Actor incluso fuera del initialize ese del que tanto hablas.

Ya que lo mencionas... sí, se puede y de hecho lo vamos a hacer dentro de un rato.

Opalo Sorprendido ¡Ahora soy todo un profeta makero!

No es para tanto, Ópalo... Seguimos con incrustar nuestro alias en ese script modificado. Lo haremos justo así:

Código:
class Game_Actor
  alias mi_alias_de_game_actor_initial initialize
  def initialize(actor_id)
    mi_alias_de_game_actor_initial(actor_id)
  end
end

Ópalo Memo

¿Te ocurre algo, Ópalo? Es como si anduvieras perdido...

Nah, estoy bien... Ópalo Memo

Como pueden ver allí, usé alias con un nombre de método que recién me inventé seguido del nombre original del método, que ahí es initialize.

Ópalo Carcajada Y se nota que se te fundió el foco, ¡ja, ja!

Gracias, mi amigo risueño...

El verdadero punto es que no importa cómo lo llamen, casi cualquier nombre es válido para sustituir el contenido original del script Game_Actor.

Ópalo Troll Y aquí viene la parte en la que le dejo todo el grafiti que yo desee.

No exactamente, mi rojizo amigo. No puedes usar ni un número ni una raya abajo _ al inicio de ese nombre de método. Tampoco puedes repetir nombres con 100% de exactitud, pero si le agregas una letra o un número en alguna parte del nombre, eso también será válido, pero no sería apropiado.

Opalo Enojado ¿No te han dicho que eres un aguafiestas?

Ya perdí la cuenta... Vayamos a lo importante, dentro del método con el nombre de initialize hemos borrado super() y setup(actor_id) a propósito.

Ópalo Carcajada ¡Y tú me llamas delincuente a mí!

Err, no, eso lo hice para evitar que se repitan partes viejas del código sin necesidad alguna. Sería como ir a darle el número de identificación y la experiencia a una persona pero dos veces seguidas.

Ópalo Carcajada En el caso de Alexis ni dos veces bastarían para que lo recordara, ¡ja, ja, ja!

En todo caso lo evitaremos para no atrasarnos y ver por más rato la ventana con un simplón fondo negro al arrancar el juego. ¿Notaron que también le pasé un argumento a mi nuevo método?

Ópalo Memo ¿Lo hiciste? Opalo Hola ¡Ah sí, porsupuesto que lo hiciste con (actor_id)!

¡Qué bueno que lo mencionaste! Sucede que si el método original recibía uno o más argumentos, debemos pasarle la misma cantidad de argumentos al alias de ese método.

Ópalo Emocionado Ay, es justo como cuando me sueño que le doy de comer a mi bebita con cuchara mientras me mira mi adorada Jennifer...

Pfffft. Mejor no me hubieras contado nada de eso, Ópalo. Ya hasta que me da cosa solo de pensar en eso.

El punto sería que si no le pasamos los argumentos requeridos por el método original, pues, se nos cae el juego.

Ópalo Buscapleitos ¡Te aseguro que no vivirás para contarlo! Ni tu ni nadie me quitará el chance de interactuar con mi Jenny virtual en mi juego.

Se los advertía para que no se sorprendan si les llega a suceder, mi celoso amigo.

El siguiente código incluye ya nuestra variable para la age o edad de Alexis y compañía.

Código:
class Game_Actor
  alias mi_alias_de_game_actor_initial initialize
  def initialize(actor_id)
    mi_alias_de_game_actor_initial(actor_id)
    @age = 16
  end
end

Ópalo Troll ¡Y ahora corro a publicar la edad real o mental de Alexis en mi cuenta de tuitersh!

No tan rápido, mi amigo troll.

¡Que no! Ya sabía que no podía ser tan sencillo...

Puede serlo, pero para eso necesitamos hacer un paso más fuera del método initialize.

Código:
class Game_Actor
  alias mi_alias_de_game_actor_initial initialize
  def initialize(actor_id)
    mi_alias_de_game_actor_initial(actor_id)
    @age = 16
  end
  def age() @age end
end

Ahora así con el método definido como age sí podemos publicar su edad a los cuatro vientos.

Ópalo Memo Lo he estado pensando y creo que no he visto algo así en el maker...

Pues, me alegra que estrenes ese cerebro para variar. Sí, hay otra forma para definir nuestro método age y sería con attr_reader.


attr_reader y su parientes attr_writer y attr_accessor

Esto necesita que hagamos una pausa de tanto alias y entremos de lleno en los attr_ lo que sea para que aprendan a hacer las cosas más rápido (para Uds. no para la máquina, aunque nosotros no notaremos la diferencia).

Opalo Hola Ah bueno, porque ya estaba considerando que te habías ganado una paliza cortesía de tu amigo del alma Ópalo.

O_O Bueno... attr_reader nos sirve para reemplazar la creación de un método como def age. El resultado será este:

Código:
class Game_Actor
  alias mi_alias_de_game_actor_initial initialize
  def initialize(actor_id)
    mi_alias_de_game_actor_initial(actor_id)
    @age = 16
  end
  attr_reader :age
end

Con solo esa línea hacemos lo mismo sin buscar arrobas ni digitar un end específico para el método.

Opalo Sorprendido ¡Me lo hubieras mostrado antes!

Bueno eso sucede porque automáticamente viene incluido en todas las clases, llámese Game_Actor, Sprite o la que sea.

Ópalo Excusa Aunque eso igual me deja la duda sobre el uso de los otros dos...

Cierto, en el caso de attr_writer sucede esto:

Código:
attr_writer :age
def age=(age) @age = age end

Ambos son idénticos, sirven para asignarle un valor a @age. En otras palabras creamos el mismo método dos veces seguidas...

Ópalo Pensador ¿Y cuándo piensas tú que vas a usar la cabeza?

Era un simple ejemplo... En fin, nos queda aclarar el uso de attr_accessor...

Opalo Hola ¡Yo me la sé! Es para utilizar accesorios, ¿No es verdad?

Para nada, mi ignorante amigo marino. En realidad viene de access o acceso, o sea, nos permite acceder al valor de @age y también darle un valor n cuando gustemos.

Ópalo Troll Entonces aprovecharé para poner que Alexis tiene solo un año.

¡TE AYUDO CON ESO! Solo mira el siguiente código.

Código:
$game_actors[1].age = 1

Con solo eso ya lo habrías conseguido. Eso sí, para que funcione deberás incluir el attr_accessor para ahorrarte una línea de código. Así debe verse el script.

Código:
class Game_Actor
  alias mi_alias_de_game_actor_initial initialize
  def initialize(actor_id)
    mi_alias_de_game_actor_initial(actor_id)
    @age = 16
  end
  attr_accessor :age
end

Ya con eso y $game_actors[1].age = 1 ya tienes lo que se necesita para pedirle la edad y cambiársela por la que gustes, como el 1 que mencionaste.

Ópalo Aplaudiendo ¡Genial! Ahora sí que me siento bien respaldado.

Solo recuerda que debes pegar lo de su nueva edad hasta después de haber ingresado en la opción de Nuevo Juego, si utilizas el script Scene_Title por defecto o alguna variante de la comunidad makera.

Opalo Triste Pero ni sé dónde ir a buscarlo...

Eso lo puedes encontrar en el editor de scripts, justo en esa clase Scene_Title en el método llamado command_new_game. No olvides usar el alias que vimos el día de hoy y de preferencia coloca la edad debajo de tu nombre de alias del método.

Opalo Sorprendido ¿Tengo que hacerlo yo solito?

OK, te ayudaré un poco con eso...

Código:
class Scene_Title
  alias mi_alias_de_title_nuevo_juego command_new_game
  def command_new_game
    mi_alias_de_title_nuevo_juego
    $game_actors[1].age = 1
  end
end

Ópalo Hachimaki ¡De la que me has salvado, mi amigo scripter! Ópalo Memo Eh, y ¿a dónde lo pego?

Pues, podrías dejarlo en una nueva sección del editor DEBAJO de la sección de Scene_Title, no importa qué tan abajo esté la nueva sección.

Opalo Hola Entonces ya me puedo despreocupar de cometer errores y ver bugs raros.

Este, eso todavía no es 100% cierto, mi amigo de rojo. Sucede que aún puede aparecerte un bug...

Opalo Sorprendido ¿Cómo? ¿Pero de qué me estás hablando? ¿Cuál bug es ese?

En realidad ya lo debes de conocer si has jugado algún demo o juego completo hecho con el maker. ¡Es el temidísimo bug del F12!

Ópalo Pensador Ya olvidé la cantidad de veces que he querido meterle una patada al maker por culpa de eso. Si tan solo hubiera una forma de arreglarlo, el mundo sería más feliz.

Bueno digamos que la hay, o al menos es lo segundo mejor que puedes hallar por estos lares makeros. Se trata del $@.

¡Que no! Te seré sincero, NO sé qué esperas que haga con eso.

Código:
class Scene_Title
  alias mi_alias_de_title_nuevo_juego command_new_game unless $@
  def command_new_game
    mi_alias_de_title_nuevo_juego
    $game_actors[1].age = 1
  end
end

Nota cómo lo coloqué en nuestro más reciente alias en forma de una condición gracias a unless. Si lo recuerdan, unless en inglés significa "si no" o "a no ser" y $@ está ahí para que RGSS o incluso el propio Ruby verifiquen si ya creamos un alias con ese mismo nombre.

Ópalo Pensador ¿Qué tal si me aclaras por qué lo ocupo si me funcionó antes sin eso?

Es que la primera vez que corres el juego sin presionar el F12, todo sale bien. Incluso puedes guardar la partida y cerrar el juego sin inconvenientes. Lo malo viene si apretas el condenado F12 mientras ya estabas jugando, sin embargo, una vez que colocaste ese unless $@ al final de la línea, ya no debes preocuparte porque salte un error ahí. Para evitarlo en los demás lugares donde exista un alias, deberás verificar que también lo tengan o se lo tendrás que añadir.

¡Que no! No, me da pereza y requiere de mucho esfuerzo.

Bueno, entonces solo te queda sufrir por ese condenado botoncillo...

Opalo Sorprendido ¡NOOO! Te digo que sí me tomaré mi tiempo para agregarles eso a los molestos alias.

Bien dicho, mi querido amigo.

#9 Re: Scripting y Más Scripting el Sáb Sep 22, 2018 5:17 pm

Cuervoso

avatar
Comencé leyendo sin darme cuenta que en realidad era un tutorial para hacerlo uno mismo. Antes de hablar del scripting, debo decir que me parece ingeniosa y divertida la forma en la que vas hablando con Ópalo en el trascurso del post, me sacó más de una sonrisa dentro de todo lo tedioso que parecía para una mente como la mía (que poco sabe de programación).

¿Se puede realizar el mismo procedimiento, agregando un "alias" que no tenga un valor numérico, sino texto? No sé, quizás algo con el estado de ánimo que esté relacionado con las respuestas que vas dando en el transcurso del juego (esto último, claro, nos pediría agregar condiciones para que dicho valor aparezca, pero yo solo quiero referirme a que aparezca texto y no números xD)

En cuanto a lo del F12 (mi favorito en su época), no sabía que la solución era simple. ¿Cómo demonios Enterbrain no se dio cuenta de eso? Ópalo Pensador

#10 Re: Scripting y Más Scripting el Sáb Sep 22, 2018 9:58 pm

kyonides

avatar
Bueno su pregunta es algo ambigua.  Ópalo Memo
¡Que no! No deja claro por qué dice que lo quiere para texto y no para un valor numérico.

Alias no es específico ni para una cosa ni para la otra ni para una tercera, etc. Simplemente es para todo lo que se le ocurra, puede agregar cuantas cosas desee. Ópalo Pensador

Las condiciones es un tema por aparte, también dependerá de lo que realmente necesite configurar para su juego según las variables que requiera agregar y modificar. Vea el alias como una sustitución de método y no meramente de valores o no comprenderá su verdadero uso y su alcance.

Debo agregar que alias es una vía que se inventaron para no tener que pegar todo el código del método original cada vez que uno deseara solo agregar cosas y no quitarle. Lo que pasa es que hay varios motivos por el que se lo puede emplear en uno u en otro método. Sólo les presenté un caso para no atiborrarlos con toda esa información.

Ópalo Carcajada Pero te pemiso de atiborrarte de comida, ja, ja!

Ópalo Excusa Es Enterbrain después de todo. ¡Que no! No se podía esperar más de ellos.

#11 Re: Scripting y Más Scripting el Dom Sep 23, 2018 6:35 pm

kyonides

avatar
Constantes y Variables


¿Qué son las Constantes?
Opalo Hola ¡Pues que yo voy a aparecer en tus tutoriales!

Bueno eso podría ser cierto, pero me refería a cosas como que todos los días debemos respirar para seguir con vida.

En Ruby y RGSS eso se refiere a las palabras escritas con mayúsculas, al menos la inicial.

Las clases y módulos (class + module) siempre tienen como mínimo una constante.
Opalo Sorprendido¿La tienen? ¿Acaso respiran como nosotros?

Eh no, no lo hacen, pero no existirían sin una constante en especial, su propio nombre. Este nombre propio debe iniciar con una mayúscula.
Opalo Hola Ah, pero si yo no me enojo porque me escriban el nombre como ópalo.

Bueno tú no te molestas, pero Ruby sí lo hace.
Opalo Enojado ¡Condenado gruñón que es Ruby!

Debe serlo por obligación, no por gusto. Es la manera que tiene de verificar que no se trata de una variable o de un método. Es por eso que Window, Window_Base, Window_Help, Window_Item, Sprite, Sprite_Character, Scene_Map, Scene_Menu, entre muchas otras, comienzan con mayúscula.

Así como nosotros necesitamos respirar, Ruby y RGSS necesitan un orden rígido para la nomenclatura de las Constantes que permita distinguir clases y módulos de todo lo demás.
Ópalo Excusa ¿Y eso qué importa?

Importa más de lo que crees, es gracias a esa constante que podemos llamar a nuestra clase o nuestro módulo desde donde nos dé la gana.
Opalo Sorprendido ¡O sea que los podemos llamar a medianoche para molestarlos!

Eh, pues, hazlo a la hora que gustes si te soy sincero. En todo caso también tienen otro uso algo parecido al anterior.
Ópalo Pensador ¿Con qué nos vendrás esta vez?

Es sencillo en realidad, las Constantes también sirven para almacenar valores específicos, invariables, inmutables durante el desarrollo de sus juegos. Se mantendrán tan sólidos como una roca.
Opalo Sorprendido ¿Acaso Ruby piensa filmar una de esas patéticas películas de acción con la Roca?

Ni creo que sepa nada de ese tal Dwayne... Mejor les dejo un ejemplo.

Código:
module MiJuego
  MAX_DE_HEROES_POR_EQUIPO = 4
  NOTA_MINIMIA_PARA_PASAR_EXAMEN = 70
end

En nuestro juego fijaríamos el máximo de héroes a conformar un equipo en 4 héroes. De usar dicha constante en Game_Party, podríamos exigirle al juego que cumpla esa regla cada vez que agreguemos a un héroe via comando de evento.
Opalo Enojado Sí, muy bonito, pero me enoja que me hicieras recordar mi triste infancia en la escuela con la otra constante.

Ah, lo dices por el 70... Bueno es que hay lugares donde exigen una nota mínima de 70 de 100 posibles. Eso también sería un buen ejemplo de una constante en esos centros educativos.

De hecho, los nombres de las clases y módulos hacen justamente lo mismo pero con todo su contenido, es decir, con sus Constantes, sus variables, sus métodos.

¿Qué son las variables?

Opalo Triste Eso me suena a los días en que llueva a cántaros y no puedo salir a divertirme con mis amigos porque salen huyendo del agua

Ahora que lo mencionas, no los culparía por usar la cabeza para no mojarse. Ópalo Sonrisa Grande

Pero sí, el cambio del clima se podría considerar una variable, ya que no podemos asegurar que todos los días serán cálidos o nublados o lluviosos o tendrán rayería extrema.

En Ruby y por ende en RGSS hay 5 tipos de variables:


  • Variable de Bloque - sin símbolo en RGSS, en Ruby 2.x puede ser & en cierto punto del script.
  • Variable Local - sin símbolo
  • Variable de Instancia - @
  • Variable de Clase - @@
  • Variable Global - $


Por alguna extraña razón algunos olvidan varias de estas o nunca las conocieron...
Opalo Hola ¡Déjalos que vivan en su ignorancia! Capaz que son más felices así que tratando de comprender algo que está fuera de su alcance.

(Como podría ser tu caso, mi amigo Ópalo...) En fin, Empecemos por la más común, la variable local. No tiene ninguna cosa que la identifique más que ser una palabra o varias unidas por _. Su alcance o rango de acción, en inglés scope, es del método que la llamó o el lugar donde la creaste. El 99% de las veces esta se desvanece en cuanto se termina de ejecutar el contenido de ese método.
Ópalo Emocionado Pero mi amor por mi Jennifer no se desvanece porque se acabe un episodio de Alias.

Como que nunca lo superarás, mi amigo rojizo... Ahora sigamos con la variable de @instancia. Esta igual tiene un valor dentro de un método que definamos al gusto, pero seguirá existiendo en el siguiente método de la misma clase o mismo módulo. Digamos que se le permite saltar a lo Frogger (el juego de la ranita y los troncos y cocodrilos) para mantenerse con vida. Sin embargo, en cuanto llega al último end que cierra la clase o el módulo, pues, es como que la rana hubiera llegado al otro extremo de la pantalla y se acabara ese escenario.
Ópalo Carcajada ¡Vaya que debes ser viejo como para haber jugado algo que los jóvenes como yo desconocemos! ¿No habrás jugado rayuela también?

Sí, muy chistosito, Ópalo. Pasemos a las variables de @@clase. Como ven solo se diferencian de la anterior, en lo gráfico, en que tienen no una sino dos arrobas.
Ópalo Troll Es que esas glotonas tienen dos estómagos en vez de uno como la gente normal.

Bueno digamos que es algo así, ya que existen no solo dentro de métodos sino que también fuera de ellos.
Opalo Sorprendido¡Entonces llamemos a los cazafantasmas!


Eh, sí, como los fantasmas pueden traspasar las paredes de las definiciones de nuestros métodos, pero eso es porque debemos crearlas no dentro de un método sino dentro de la clase, fuera de los métodos. Es así:


Código:
class Humor
  @@chistoretes_de_opalo = 0
  def sumar_chistorete() @@chistoretes_de_opalo += 1 end
end

Así cada vez que Ópalo le copie el estilo a Wecocio de contar chistoretes bien malos, le sumaremos 1 a esa variable.


Código:
humor_de_opalo = Humor.new # siempre debemos iniciar la clase

Opalo Sorprendido  ¿Qué le dijo un globo a otro globo? Ópalo Hachimaki ¡Cuidado con el cactusssssss! Ópalo Aplaudiendo ¡Pero qué genio soy para contar chistes!

Código:
humor_de_opalo.sumar_chistorete #=> @@chistoretes_de_opalo = 1

Bien merecido se tiene ese punto.

Sigamos con la lección. Ahora hablaremos de la variable $global. De hecho es la más amada por los novatos en el scripting.
Opalo Hola ¡Claro porque es mi amiga del alma!

Pero no debería serlo, esa variable es una verdadera glotona, como 100 veces más que tú, Ópalo.
Opalo Sorprendido ¿Cómo?  ¡Que no! Ella jamás me ganaría en una competencia para ver quién se come más perros calientes.

Qué saludable dieta... Lastimosamente las variables $globales no tienen ninguna consideración porque una vez que aparecen, no te las quitas de encima hasta que terminas de jugar. Es como tener a tu propio acosador personal echándote su aliento en el cuello a lo Psicosis.
Ópalo Chao Disculpa que ya tengo que agarrar un tren que me lleve lejos de aquí...

No hace falta, solo debes de evitar que se acumulen, aunque en el maker ya sobran las $globales... Se los advierto porque a muchos les pasó que se quejaron de lag o de tardanza en cargar el juego o de muchas otras cosas y cuando uno revisa el código nota que sobran las condenadas $globales. Como se las puede usar donde sea, la gente simplemente se abusa.
¡Que no! No les tendré compasión a los abusivos.

Qué bien... Bueno nos queda la más rara de las variables, la variable de bloque. Son muy parecidas a las locales, pero son de uso más restringido.
Opalo Sorprendido ¿Acaso son como los químicos más peligrosos?

No exactamente, lo que pasa es que solo pueden existir dentro de bloques o iteradores como each (o sea "cada (cosa)") o for o times (en español es "veces") o while (en español es "mientras") o until (en español es "hasta"). Fuera de esos bloques "dejan de respirar" y se van al otro mundo.
Ópalo Aturdido Pobrecitas esas variables...

La única manera de hacer que vivan un poco más es que no se use una así sino una variable externa como la local, pero casi siempre terminas creando al menos una variable de bloque.

¿Por qué puede ser que la gente olvida las variables de @@clase?

Pues me imagino que se debe a que no las entienden.
Opalo Triste Son unas incomprendidas, sé bien lo que se siente.

No son muchas las diferencias entre @@clase y Constante, pero las hay sin duda.


  • Las de @@clase son modificables en cualquier momento, las Constantes no deben cambiar nunca.
  • Las Constantes pueden ser llamadas fácilmente desde cualquier parte sin agregar nada, las de @@clase necesitan que les creemos algún método propio para acceder a ellas. No se cuenta con un attr_ lo que sea como sucede con las de @instancia.

La cuestión es que si deseamos sumar los chistoretes contados por Wecocio y por nuestro gran amigo Ópalo, pues, la variable de @@clase nos puede ayudar con eso.  Ópalo Tuerto
Con una constante no podríamos hacer eso sin provocarnos serios dolores de cabeza.
Ópalo Pensador Pero si con una variable de @instancia podríamos hacer lo mismo sin problemas.

Casi lo mismo, pero jamás sería igual. Es que al crear una nueva instancia de la clase Humor para que le llevemos la cuenta a Wecocio, se nos reiniciaría el valor, volveríamos a empezar de 0, literalmente. Con una variable de @@clase no nos ocurriría esto porque le pertenece al esqueleto de la clase, no a cada copia de ella.
Opalo Sorprendido Entonces las clases ya empezaron a celebrar Halloween ¡desde setiembre!

Código:
humor_de_opalo.sumar_chistorete #=> @@chistoretes_de_opalo = 2
¡Que no! No tenías por qué ser tan sarcástico.

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.