Hasta este punto de la serie, solo hemos creado juegos de una sola escena. En cualquier aplicación no trivial, a menudo querrás tener varias escenas para formar tu juego. Por ejemplo, puede tener una escena para su pantalla de título/introducción, luego un menú principal, luego un juego y finalmente una escena de fin del juego. Hoy vamos a ver cómo hacer exactamente esto. También vamos a ver cómo compartir información entre esas escenas.
esta escena es disponible como video HD aquí.
Creación de varias escenas
En primer lugar, siempre debe tener al menos una escena para comenzar. Avancemos y creemos uno, la pantalla de título parece bastante lógica. Cree una escena que dibuje un gráfico simple, llámela «title_scene.scn» y configúrela como su escena de inicio. Si no está familiarizado con este paso, consulte las secciones anteriores del tutorial. Una vez completado, debería verse algo como esto:
A continuación, queremos crear una escena a la que hacer la transición. Llamé al mío game.scn. Puede que no sea completamente obvio, pero en realidad cierras tu escena para crear la nueva escena. Seleccione Escena->Nueva Escena:
Luego diga sí al cuadro de diálogo aterrador que aparece (por supuesto, asumimos que ha guardado su escena y ya la ha configurado como la escena de inicio):
Ahora, en la segunda escena, acabo de crear un Panel simple, con un par de controles de etiquetas, así:
Realmente no importa lo que hagas. Las etiquetas son solo para mostrar que la información se puede compartir entre escenas. Nuestro juego en realidad no va a hacer nada.
Bien… ahora tenemos nuestras dos escenas… ¿cómo las conectaremos todas juntas? Bueno, eso requiere un guión. Vuelva a abrir la escena title_scene.scn. Hay una práctica opción de menú Abrir escena anterior, o puede usar Abrir escena…
Adición de un guión para controlar el cambio de escena
Ahora que tenemos nuestra escena original seleccionada, necesitamos agregarle un guión. Para hacer esto, cambie a la pestaña Recursos y seleccione el icono Nuevo recurso:
Para tipo seleccione GDScript:
Llamé al mío ‘global.gd’.
Ahora escribimos nuestro script. Vamos a cargar esto automáticamente como un nodo en nuestro juego cuando se inicie nuestra aplicación, por lo que debemos heredar de Node o una clase derivada de Node. En mi caso usé node. Puede heredar una clase usando la palabra clave extends.
Aquí está el código para nuestro sencillo script Node. Creamos una función para que las escenas puedan cambiar entre escenas y demostramos obtener una variable de sesión, así como establecer una variable global.
extends Node #The currently active scene var currentScene = null #just some data for our game. It could be HPs, Alignment, Direction, etc... var PlayerName = "Mike" func _ready(): #On load set the current scene to the last scene available currentScene = get_tree().get_root().get_child(get_tree().get_root().get_child_count() -1) #Demonstrate setting a global variable. Globals.set("MAX_POWER_LEVEL",9000) # create a function to switch between scenes func setScene(scene): #clean up the current scene currentScene.queue_free() #load the file passed in as the param "scene" var s = ResourceLoader.load(scene) #create an instance of our scene currentScene = s.instance() # add scene to root get_tree().get_root().add_child(currentScene) #simple accessor function to retrieve playerName func getPlayerName(): return PlayerName
Script de carga automática al inicio
Asegúrese de guardar su script recién creado. Ahora queremos configurarlo para que esta pantalla se ejecute automáticamente cuando se inicia nuestro juego.
Para ello, vaya a Escena->Configuración del proyecto.
En el cuadro de diálogo resultante, desea seleccionar la pestaña Carga automática. Ahora especifica el script que desea cargar automáticamente y el nombre con el que desea que se conozca el nodo. Por cierto, esto distingue entre mayúsculas y minúsculas.
En la ruta, seleccione su global.gd recién creado. En Nombre de nodo, llámelo global y luego haga clic en Agregar:
¡Ahora este script se ejecutará automáticamente cuando se inicie su juego o aplicación!
Ahora que podemos cambiar de escena, hagámonos de esta habilidad. En su proyecto title_scene.scn, adjunte un script a la imagen que utilizó. Personalmente, utilicé un TextureFrame para mantener mi pantalla de título. Simplemente vamos a verificar si el usuario presiona el botón izquierdo del mouse y, si lo hace, vamos a cambiar de escena.
extends TextureFrame func _ready(): set_process(true) func _process(delta): if(Input.is_mouse_button_pressed(BUTTON_LEFT)): get_node("/root/globals").setScene("res://game.scn")
Como puede ver, puede acceder al script al obtenerlo como un nodo usando el nombre que proporcionó en el cuadro de diálogo AutoLoad. Una vez más, este valor distingue entre mayúsculas y minúsculas y debe incluir la parte /root/.
Entonces, una vez que hagamos clic en nuestra imagen de título, debería cargar nuestra otra escena. Vamos a añadirle un poco de lógica. Cargue el archivo game.scn (sí, desearía que hubiera un modo de proyecto que evitara este cambio entre escenas), adjunte un script y agregue el siguiente código:
extends Panel func _ready(): var name = get_node("/root/globals").getPlayerName() get_node("Label").set_text(str(name, " is the greatest player ever!")) var powerLevel = Globals.get("MAX_POWER_LEVEL") get_node("Label2").set_text(str("Maximum power level is ", powerLevel))
Este código ilustra conceptos demasiado simples… llamando a una instancia global (Singleton en el lenguaje de Godot por cierto), como setScene() o getPlayerName() o llamando a una variable global. Ambos métodos hacen que sea muy fácil compartir datos entre varias escenas, lo que constituye esencialmente la columna vertebral de su aplicación.