Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3819 miembros registrados.
El último usuario registrado es MaikelNox.

Nuestros miembros han publicado un total de 86273 mensajes en 12298 argumentos.

Lo que NO recomiendo que hagan en un script

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP Lo que NO recomiendo que hagan en un script

Mensaje por kyonides-arkanthos el Vie 23 Oct - 12:37

He aquí una lista de cosas que a los novatos en el scripting les recomiendo que no hagan para que sus modificaciones o scripts originales se vean un poco más profesionales, con un poco más de calidad de la que hayan demostrado tener hasta ahora.

Voy al grano ahora mismo.

CASO #1: El problema de los iteradores anidados alias nested loops o nested iterators

En este ejemplo supongamos que ya creamos un Array o arreglo con un listado de números de teléfono para cada héroe en el equipo y que lo llamamos @numeros_de_telefonos. Como en la vida real se supone que uno puede interconectarse con todas las compañías de telefonía de su respectivo país, imaginemos que el código de abajo debe buscar a qué compañía le pertenece el número telefónico de Alexis y compañía. Al final veríamos que se imprime el número con todo y los códigos que el sistema utilizaría para realizar la conexión.

Código:
codigo_proveedor_numero_telefono = ''
for i in $game_party.actors.size
  numero_telefono = @numeros_de_telefonos[i].to_s
  for i in @telefonicas
    next unless i.numeros_en_servicio.include?(numero_telefono)
    codigo_proveedor_numero_telefono += i.codigo_proveedor.to_s + numero_telefono
  end
end
p codigo_proveedor_numero_telefono

Lo malo es que hay un problema con lo que se hizo anteriormente, se utilizó una misma variable local o de bloque, en este caso la llamamos "i". Aunque Ruby y por ende también RGSS(cualquier versión) permiten reutilizar variables, es una mala práctica cuando el primer valor de dicha variable todavía podría sernos útil en el futuro.

Uds. dirán que el ejemplo funciona y que poco importa si se reutiliza la variable, pero están muy equivocados. Imagínense que les piden agregar código para mostrar el ID de la persona que llama, digamos que sería Alexis o Alexis (Hogar) o Alexis (Oficina). Con el código actual reutilizando la variable i ya no nos sería posible acceder a dicha información en el caso de que el número no esté a su nombre sino al de... ¡la madre o la abuela de Alexis!

Se preguntarán por qué les afectaría eso, pues, se debe a que hubiéramos necesitado el valor de índice de la primera variable i para acceder a la posición en la que se encuentra Alexis en el equipo (que por lo general se encuentra en el 0). Como ya ese 0 se perdió, ya no podemos utilizar el nombre en la Base de Datos para buscarlo así $game_party.actors[indice].name

No importa si le podemos un código de proveedor (un dato ficticio para el usuario común) o un código de área, el valor de la i al final se convierte en cada una de las compañías de telefonía enlistadas. Por ello nos daría error al querer mostrar el ID del que llama porque i ya no es un valor numérico sino un objeto que representa a una compañía.

La situación habría sido distinta si a la segunda i le hubiéramos nombrado j, company o cualquier otra cosa. En ese caso habríamos obtenido la información del ID sin muchos contratiempos.


CASO #2: La novatada de colocar variable == true o variable == false

Cuando en una condición Uds. necesitan cerciorarse de que el valor de una variable es igual a true o que el objeto en ese variable existe, lo normal es preguntar si su valor equivale a true (verdadero). Como ahí se trabaja con valores de tipo boolean donde algo solo puede ser verdad o falso o no existir, cosas como un objeto o un valor numérico no nos ayudarían mucho. De ahí surge nuestra necesidad de aprender a definir dichas condiciones de la manera más conveniente.

En este caso les recomiendo entender lo siguiente cuanto antes. La legibilidad de su código en este único caso sí es sacrificable.

Una vez que tienen eso en cuenta, pasemos a revisar un ejemplo.

Código:
if @sell_window.active == true
   @sell_window.visible = true
end

Allí preguntamos si la ventana para vender objetos y otras cosas está activa y si se cumple dicha condición, entonces se hará visible la ventana.  @sell_window.active o @sell_window.active=(boolean) por sí mismo es un método que guarda o asigna un valor boolean (true, false o nil) a la variable de actividad (procesamiento) de la ventana de ventas. Cuando el nombre del método es de fácil comprensión es mejor dejar la condición de la siguiente manera.

Código:
if @sell_window.active
   @sell_window.visible = true
end

O incluso más corto...

Código:
@sell_window.visible = true if @sell_window.active

Y conseguiríamos el mismo resultado de mostrar nuestra ventana de ventas al detalle y con mucho menos relleno. Para obtener el efecto contrario de hacerla invisible si está inactiva en lugar de colocar == false, lo reemplazaríamos por anteponer un signo de exclamación (el de cierre).

Código:
@sell_window.visible = false if !@sell_window.active

O si prefieren utilizar algo más legible...

Código:
@sell_window.visible = false unless @sell_window.active

Colocar if !@variable es lo mismo que digitar unless @variable.

Si necesitan otra razón o motivación para eliminar el == true de sus condiciones, vean el siguiente ejemplo en el que el lugar de saber si una variable es igual a true o verdadero, queremos saber si existe o no existe en nuestra bolsa.

Código:
if @item_window.item
  $game_system.se_play($data_system.decision_se)
  $game_party.lose_item(@item_window.item.id, 1)
end

En ese código el == true lejos de aclarar su uso, más bien nos confundiría porque parecería que buscamos el valor true específicamente y no que haya un objeto en nuestra bolsa en esa posición. Si el valor real de esa variable fuera true, nos lanzaríamos desde un precipicio porque necesitamos que sea un objeto con un ID para buscarlo en el array del equipo de héroes para poder restarle una unidad por cada vez que lo consumamos.

Espero que con estos casos puedan empezar a hacer que su código se vea más limpio de cosas innecesarias o confusas.
avatar
kyonides-arkanthos
Principiante
Principiante

0/3

Créditos 477

Gracias : 70

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


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