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 4070 miembros registrados.
El último usuario registrado es Rossainz.

Nuestros miembros han publicado un total de 84128 mensajes en 11983 argumentos.

[Tutorial] El sistema de "RPG maker - La historia" (XP) al descubierto

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [Tutorial] El sistema de "RPG maker - La historia" (XP) al descubierto

Mensaje por Eron el 2014-04-28, 13:43

Ha llegado la hora de explicar a fondo cómo funciona el sistema de mi proyecto RPG maker - La historia que podéis descargar aquí:

CONCURSO Tú no eres el héroe - RPG maker - La historia

El sistema que usé en ese proyecto es totalmente libre, todo el mundo puede usarlo. Antes de leer ésto recomiendo probar el proyecto para saber mejor qué hace el sistema.
Hice todo el sistema en una semana aproximadamente, me costó, así que si al usarlo me dáis créditos os estaré muy agradecido...
Por las dimensiones del post además veréis que es el sistema más complejo que he hecho x'DDD

0) Concepto y cosas principales

El sistema usa varios scripts, Engine Basics es el más importante y contiene cosas en general usables en cualquier maker.

Conviene explicar por qué el sistema usa usa tanto los tiles y terrenos, y es que los objetos principales usados en el sistema (cofres y antorchas) no son eventos sino tiles que se colocaran en la segunda capa, y dónde puedes ponerlos y dónde no viene asignado por el terrain_id.

Los cofres se pueden poner en los tiles que tengan terreno 1.
Las antorchas se pueden poner en los tiles que tengan terreno 2.
Si en una capa superior de un tile con terreno 1 o 2 hay un tile con terreno 0, se anula el 1 / 2 y no se pueden poner cofres / antorchas ahí, si por lo contrario hay otro (yo usé 7) no interfiere y sí se pueden colocar.

Spoiler:

Terrain tags en el tileset del proyecto.

Que los cofres y las antorchas sean tiles de la segunda capa implica una limitación a la hora de mapear, convendrá usar poco la capa 2 para que no suponga ninguna interferencia con el sistema. En el proyecto simplemente no mapeé con esa capa, en realidad la limitación no es tan exagerada como eso pero por seguridad hay que tenerlo en cuenta.

1) Métodos Generales de Engine Basics

En ésta sección se explica:

- Qué es Coords
- Qué métodos generales tiene el sistema Engine Basics


La clase Coords es solo para poder leer las coordenadas de una forma más amena, no tiene más que eso.

Siguiendo la nomenclatura de la Ayuda, los [ ] significan opcional; por defecto layer vale 0, event vale $game_player y through vale true
Todos los métodos de Engine Basics se pueden usar desde Llamar script directamente.

get_coords(x, y) => Crea una coordenada Coords en la posición x, y
under_coords([event]) => Obtiene la coordenada en la que está el evento
front_coords([event]) => Obtiene la coordenada que el evento tiene delante
get_tile(x, y, [layer]) => Obtiene el tile que está en la posición y capa asignadas
under_tile([layer, event]) => Obtiene el tile de layer en el que se encuentra el evento
front_tile([layer, event]) => Obtiene el tile de layer que el evento tiene delante
get_terrain(x, y, [layer]) => Obtiene el terrain_tag del tile que está en la posición y capa asignadas
under_terrain([layer, event]) => Obtiene el terrain_tag del tile que está debajo del evento a la capa
front_terrain([layer, event]) => Obtiene el terrain_tag del tile que está frente el evento a la capa
get_event(x, y, [through]) => Obtiene el evento* que está en la coordenada asignada
under_event([through, event]) => Obtiene el evento* que está debajo de otro evento
front_event([through, event]) => Obtiene el evento* que está frente a otro evento

* si through vale true no tendrá en cuenta eventos atravesables

2) El Sistema de Cofres

Spoiler:




El sistema de cofres

En ésta sección se explica:

- Diferencia entre cofre y evento de cofre
- Cómo crear / borrar un cofre y un evento de cofre
- Cómo llenar / vaciar un cofre manualmente
- Cómo cambiar el límite de cofres por mapa


El control sobre los cofres se encuentra en Engine Basics

Por defecto party vale true y eso implica que al borrar un cofre lo de dentro pasa a formar parte de la party

get_chest(x, y) => Devuelve el chest que esté en la coordenada x, y
front_chest([event]) => Obtiene el chest que el evento tiene delante
insert_chest(x, y, direction) => Añade un nuevo chest en la posición x, y y la dirección direction
place_chest([event]) => Añade un nuevo chest, justo delante del evento y con la dirección que le corresponde
delete_chest(x, y, [party]) => Borra el cofre de la coordenada x, y
take_chest([event, party]) => Borra el cofre de justo delante del evento
fill_chest(chest, item, [party]) => Llena el cofre con el ítem que le digas
(solo se llena de uno en uno en éste sistema)
void_chest(chest, item, [party]) => Quita el ítem que le digas del cofre
(solo se quita de uno en uno en éste sistema)

Dado ésto ahora se repite el patrón con una diferencia, y es que ahora usa eventos para los cofres (get_event_chest, front_event_chest...) Todo lo demás funciona exactamente igual.
El sistema usa tiles para los cofres pero también permite usar eventos, de ese modo se les puede añadir en caso de que lo precisen las caracterísicas principales de un evento (básicamente movimiento)

Hay un límite de cofres usables en el mapa, y en éste tanto se cuentan los tiles de cofre como los eventos de cofre. Si quieres añadir un nuevo cofre que no intervenga con ese valor máximo tendrás que añadir 1 al valor máximo (por defecto 3).

Para hacerlo, desde llamar script puedes hacer $game_system.max_chests = n antes de teletransportar al héroe al mapa, (n es el nuevo máximo)

Ahora otras posibles cuestiones sobre el tema

- Cómo hacer un evento de cofre que no se pueda cojer

Eso viene definido en el sistema de menú, en el script New Menu - Scenes

Hay dos casos posibles en un evento de cofre. Si el evento de cofre tiene de nombre #CHEST funciona como un cofre normal, es decir se puede cojer como si se tratara de un cofre por tile.
Si por lo contrario tiene cualquier otro nombre, el sistema no lo reconocerá como cofre auténtico, de ese modo el héroe podrá usarlo no podrá llevárselo.

- Cómo mirar si cierto cofre tiene un item concreto dentro

Se usa ésta llamada
get_chest(x,y)[2].include?($data_items[id])

Cambiando x, y por las coordenadas del cofre y id por la id del item
Se puede cambiar ese get_chest(x,y)[2] por front_chest[2], get_event_chest(x,y)[2] o front_event_chest[2] según convenga.
Se puede cambiar $data_items por $data_weapons o $data_armors según el tipo de objeto.

- Cómo mirar si un evento de cofre está activado o no

Si te llevas el evento de cofre lo desactivas (también se puede activar o desactivar manualmente), obviamente si está desactivado no se puede usar.

Para ello puedes usar $game_map.events[id].event_chest = true / false
Para saber si está activado o no se usará eso mismo ($game_map.events[id].event_chest == true / false)
Convendrá que al desactivarlo el evento se vuelva invisible, para ello habrá que usar un evento que compruebe si lo está o no y en el caso de que no cambie su gráfico.

3) El Sistema de Antorchas

Spoiler:




El sistema de antorchas

En ésta sección se explica:

- Diferencia entre antorcha y evento de antorcha
- Cómo crear / borrar una antorcha y un evento de antorcha
- Cómo crear una antorcha con un tono de luz personalizado
- Cómo cambiar el límite de antorchas por mapa
- Cómo funciona la pasabilidad de VX


El control sobre las antorchas se encuentra en Engine Basics

Hay una global llamada DEFAULT_TORCH que corresponde a la luz que corresponde a una antorcha por defecto

Por defecto event es $game_player, tone es DEFAULT_TORCH
El sistema de antorchas y el de cofres en realidad son muy similares a nivel de script. Solo hay algunas diferencias, y es que las antorchas no tienen dirección, no se pueden llenar o vaciar y lo más importante, tienen un sistema de luz asociado a la distancia. Ese sistema de luz no es perfecto y puede no gustar a la gente por un motivo básico y es que afecta a la luz de todo el mapa y no a la de alrededor de la antorcha lo cual sería más óptimo. Pero eso se puede arreglar usando una fog que limite la luz a la parte que interesa haciendo algo así como un sistema de linterna additivo al sistema en sí.

get_torch(x, y) => Devuelve la antorcha que esté en la coordenada x, y
front_torch([event]) => Obtiene la antorcha que el evento tiene delante
insert_torch(x, y, [tone]) => Añade una nueva antocha en la posición x, y
place_torch([event]) => Añade una nueva antorcha, justo delante del evento
delete_torch(x, y) => Borra la antorcha de la coordenada x, y
take_torch([event]) => Borra la antorcha de delante del evento
get_torch_dis(torch, x, y) => Obtiene la distancia que hay entre la antorcha y una coordenada
calculate_torch_light([event]) => Calcula la luz dependiendo de la distancia a la que el evento se encuentra

Dado ésto ahora se repite el patrón con una diferencia, y es que ahora usa eventos para las antorchas (get_event_torch, front_event_torch...) Todo lo demás funciona exactamente igual.
El sistema usa tiles para las antorchas pero también permite usar eventos, de ese modo se les puede añadir en caso de que lo precisen las caracterísicas principales de un evento (básicamente movimiento). Eso se usa en las paredes móviles dónde puedes insertar antorchas.

Hay un límite de antorchas usables en el mapa, y en éste tanto se cuentan los tiles de antorcha como los eventos de antorcha. Si quieres añadir una nueva antorcha que no intervenga con ese valor máximo tendrás que añadir 1 al valor máximo (por defecto 3).

Para hacerlo, desde llamar script puedes hacer $game_system.max_torchs = n antes de teletransportar al héroe al mapa, (n es el nuevo máximo)

VX no puede andar muy lejos de las antorchas porque luego es demasiado oscuro, en concreto tiene un margen de 5 tiles en el que más allá no puede pasar. Esa modificación del sistema de pasabilidad viene definido en el script Engine Support

Ahora otras posibles cuestiones sobre el tema

- Cómo hacer un evento de antorcha que no se pueda cojer

Eso viene definido en el sistema de menú, en el script New Menu - Scenes

Hay dos casos posibles en un evento de antorcha. Si el evento de antorcha tiene de nombre #TORCH funciona como una antorcha normal, es decir se puede cojer como si se tratara de una antorcha por tile.
Si por lo contrario tiene cualquier otro nombre, el sistema no lo reconocerá como antorcha auténtica, de ese modo dará luz e interferirá en la pasabilidad pero el héroe no podrá llevársela.

- Cómo mirar si un evento de antorcha está activado o no

Si te llevas el evento de antorcha lo desactivas (también se puede activar o desactivar manualmente), obviamente si está desactivado no se puede usar.

Para ello puedes usar $game_map.events[id].event_torch = true / false
Para saber si está activado o no se usará eso mismo ($game_map.events[id].event_torch == true / false)
Convendrá que al desactivarlo el evento se vuelva invisible, para ello habrá que usar un evento que compruebe si lo está o no y en el caso de que no cambie su gráfico.

4) XP vs VX

En ésta sección se explica:

- Cómo definir si eres XP o VX

Para poder usar XP y VX independientemente conviene hacer una modificación de Game_Party de modo que cada una tenga un sistema independiente con sus objetos, armamento, protectores y oro particulares.
Esa modificación está en Engine Support y prácticamente lo que hace es dividir esas funciones en dos nuevas según si eres XP o VX.

El sistema mira si eres XP o VX mediante éste código:

Código:
  def xp?
    return !$game_switches[2]
  end


Eso significa que si el interruptor 2 está encendido eres VX y si está apagado eres XP

El nuevo menú tiene las opciones cambiables según la situación, lo único que se hace en el sistema en relación a eso es que si eres XP tengas unas opciones disponibles y eres VX tengas otras.

5) Sistemas de guardado y game over

En ésta sección se explica:

- Cómo funciona el sistema de guardado
- Qué pasa si pulso F9 en el título y estoy en modo $DEBUG
- Cómo va Game Over


Éste sistema está en los scripts Engine File y Title / Game Over (el cual usa Sprite_Timer Mejorado para dibujar el tiempo)

El guardado del es automático, puedes asignar por engine cuando se guarda y cuando pierdas o te rindas desde el menú volverás allí.
Para guardar puedes usar desde un Llamar script directamente save_file
Luego cargar se hace desde el script (aunque también podrías hacerlo desde un Llamar Script si quisieras) con load_file

La escena de título no tiene sistema de cargado, tienes que volver a empezar (lo cual difícilmente sea un problema en una demo de 5 minutos x'D)
Aún así si lo cargas desde el modo $DEBUG y pulsas F9 se llama a load_file y por lo tanto recuperas la partida guardada previamente y que en realidad ya habría sido perdida.

El sistema de Game Over te da un tiempo. Si decides continuar antes de ese tiempo se carga load_file y recuperarás la partida donde la hubieras guardado. Si por lo contrario dejas terminar el tiempo irá al título y ya no podrás recuperarla si no usas F9 desde el $DEBUG.

Spoiler:

Game Over con el contador


Escena de Título en modo $DEBUG

6) Variables, Eventos Comunies y llamadas especiales

En ésta sección se explica:

- Qué hacen los eventos comunes del sistema
- Cómo se abres los cofres
- Cómo se hace el cálculo de luz respecto a la distancia de las antorchas


Cuando pulsas C y tienes un cofre delante se abre la escena de cofres. Eso viene definido en el Evento Común "Cofre". Allí se usa
not front_chest.nil? or not front_event_chest.nil?
que valdrá true si hay algún cofre de cualquier tipo delante del héroe

La variable 1 es la luz actual calculada por la distancia con las antorchas y la variable 2 es la luz más oscura posible de ese mapa en concreto. El cálculo de luz por lo tanto usa la variable 1, la variable 2 y el valor del tono de cada antorcha en concreto. Esa fórmula viene definida en el Evento común "Antorcha"

Entonces a parte de cambiar el tono de pantalla al entrar en una pantalla dónde puede haber antorchas habrá que hacer

$game_variables[2] = [red, green, blue, alpha]

En el ejemplo de usa [-110,-130,-110,120]

[$game_player.x, $game_player.y] == [x, y]
Cambiando esos últimos x, y por coordenadas comprueba si el héroe está en esas coordenadas sin necesidad de crear variables específicas para ello.
Eso se usa para los interruptores del suelo, para saber si el héroe está encima.

[$game_map.events[id].x, $game_map.events[id].y] == [x, y]
Lo mismo para un evento concreto

$game_map.chests.any?{|a| [a[0], a[1]] == [x, y]}
Cambiando esos últimos x, y por coordenadas comprueba si hay algún cofre en esas coordendas. En vez de chests se podría usar torchs, event_chests o event_torchs según la situación.
Eso se usa para los interruptores del suelo, para saber si un cofre está encima.

$game_map.data[x, y, layer] == id + 384
Eso se usa para saber si la id del tile de la coordenada x, y y layer corresponde a la esperada.
Algunos id interesantes:
0 - Cofre (abajo)
1 - Cofre (izquierda)
2 - Cofre (derecha)
3 - Cofre (arriba)
4 - Antorcha


Si hay otras dudas sobre el sistema preguntádmelas y las responderé.
avatar
Eron
Principiante
Principiante

0/3

Créditos 1283

Gracias : 54

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.