Este es un pequeño análisis del motor del juego Defold usando un ejemplo práctico (bajo Andoid), así como un poco de crítica subjetiva y elogios, bueno, una revisión general. A quién le importa saber más sobre este motor, hay una entrevista,
lea . Hay poca información sobre Defold en la red, por lo que será una contribución a una alcancía muy pequeña.
Un poco de juego previo
Entonces, Defold es un motor multiplataforma relativamente joven (desde 2011) con un editor visual similar a Gobot, Construct o Cocos Creater. Está destinado principalmente a 2D (todavía no hay suficientes herramientas para trabajar con 3D), el lenguaje de programación es Lua. Se diferencia de motores similares en rendimiento estable en dispositivos móviles (incluso 60 fps sin retrasos con sonido), tamaño de construcción pequeño (2-4 mb dependiendo de la plataforma), conveniente sistema gui and go, configuraciones de animación geniales (curvas clave) y también completamente subordinado editor (te diré a continuación, intriga). En el sitio, bajo la cuenta, es posible almacenar archivos de proyecto. Cualquier miembro autorizado del equipo puede realizar cambios en el proyecto, lo que generalmente es conveniente, aunque yo no siempre podría usarlo, porque Nuestro proxy de trabajo no le da acceso al editor. Defold tiene características para escribir código, aunque las llevaría a menos (detalles a continuación). Y sí, casi lo olvido, el equipo de Defold es muy receptivo, merece respeto. Le pedí ayuda al foro varias veces; de inmediato, en 10 minutos respondieron y me ayudaron. Una vez que hubo un problema al iniciar el editor en Ubuntu, los chicos no pudieron ayudar al principio, pero después de un par de horas su líder me contactó y resolvió la situación. Resultó que en Linux hay un error con leña estándar en el video, por lo que debe instalar los nativos. También en el sitio hay activos, donde sin ellos. Bueno, terminemos el preludio, ¡vamos!
¡Empecemos!
Registramos y descargamos
el editor Defold versión 2 en el
sitio web (1 ya no es compatible), creamos su propio proyecto allí y lo descargamos. El proyecto se almacena en el sitio, o localmente (si tenemos miedo de que el astuto Defold se asuste). Luego, abra su proyecto a través del editor (habrá el mío en las imágenes), mire:

A la izquierda están los archivos, a la derecha están las entrañas del nodo seleccionado, en el medio está el editor. No te molestaré con el análisis de la interfaz, puedes estudiarlo tú mismo. ¿Ves la carpeta integrada? Hay un conjunto estándar de scripts, fuentes y otras cosas para el motor, puede aprender. Todo lo demás son tus propios archivos. En la configuración del proyecto (en la imagen central) hay una línea (resaltada) de la colección Principal, hay un enlace al archivo de la colección principal desde el cual se inicia su aplicación, ábralo:

Sí, sí, este es exactamente el desorden que tendrá en el editor, porque no hay forma de ocultar lo innecesario (lo acreditaremos en las desventajas). Primero entendamos qué es una colección. Cuando escribí sobre el editor subordinado anterior, se entendió que cada archivo de proyecto, sin importar de qué extensión sea, es un archivo de texto, y puede editarse independientemente. Entonces, una colección también es un archivo de texto con una descripción de objetos internos.

Una colección puede contener cualquier objeto (scripts, sprites, sonidos, etc.), así como otras colecciones incrustadas en ella. Se crearán todos sus contenidos durante la ejecución, se inicializarán los scripts. Las colecciones se pueden envolver en Proxy. Proxy es una gran cosa, por lo general, envuelven diferentes niveles de su juego, por ejemplo. Se pueden enviar, cargar (se crea una colección anidada durante la carga), pausar, ralentizar y acelerar los procesos.
Además, una cosa muy conveniente: Factory y Collection Factory. Estos son shells para objetos que son indispensables si necesita crear y eliminar objetos dinámicamente durante la ejecución.

Aquí hay un buen ejemplo de una colección dinámica. Este es un pico, se carga con un algoritmo aleatorio en el nivel y se elimina, le cuesta abandonar la vista de la cámara para no desperdiciar recursos.

Esta es una secuencia de comandos dentro de la espiga, en el método de actualización comprueba si su propia posición es menor que la posición del personaje (jugador en el centro de la cámara) más un pequeño margen, luego se elimina. Por cierto, puede colgar propiedades en scripts. Por ejemplo, tengo un objeto de colección de fábrica dentro del cual hay una oveja npc.

Aquí está nuestro npc, tiene propiedades en el script como velocidad de carrera, zancada, fuerza de salto y resistencia. Al crear una instancia, le asigno aleatoriamente estas propiedades.
Crear npc:

La instancia interna del script cambia sus propiedades (unicidad a través de self):

Y ahora nuestros corderos corren a diferentes velocidades:

Hablando del editor de código, es primitivo. Los métodos no pueden minimizarse (como en Sublime, por ejemplo), y cuando hay muchas líneas, debes girar la rueda durante un tiempo largo y doloroso, buscando la correcta. Tampoco hay aumento en la escala, pero estos son pequeños. Los recursos de Defold tienen instrucciones sobre cómo enseñar a Sublime a rellenar métodos desde el editor.
En cuanto a las partículas, es conveniente: si selecciona un emisor en la ventana del editor y presiona la barra espaciadora, puede ver inmediatamente el resultado.
Bueno, ahora sobre cómo funciona el motor
Defold acepta dos ramas separadas para la representación, estas son GUI y GO.
GUI: como su nombre lo indica, esta es una interfaz de usuario. Existe por separado, se configura en la pantalla y siempre se representa sobre todo lo demás. La GUI tiene sus propios métodos que no están relacionados con GO, aunque son similares. Esta también es una colección, pero con limitaciones. Se acepta un script por GUI, con la extensión .gui_script. Una cosa excelente y conveniente, aunque hay un matiz: no puedes acceder directamente a ningún objeto del juego desde la GUI, solo a través de variables globales o mediante mensajes (te lo diré más adelante).
GO es un objeto de juego (algo así como un nodo de transformación), contiene información sobre movimiento, rotación, escala, etc. En el interior, lleva todo, incluidos otros GO. Utilizado para colecciones, este es un shell requerido para cualquier número de objetos (como un grupo).
A continuación, comienza la diversión. Me mudé a Defold desde un amigable Android Studio con Libgdx, y esto es lo que me sorprendió: no se puede acceder a los objetos directamente, solo a través de métodos de muleta o mensajes que todavía no dan libertad creativa, existen serias limitaciones. Si se compara con el mismo Libgdx, allí podría incluso reescribir tranquilamente la clase existente de la biblioteca de Lieb y referirme a ella. En Defold, desafortunadamente, usa lo que tiene, y si falta algo, solicite a los desarrolladores que agreguen la función necesaria, o está buscando una solución. Por ejemplo, cuando trabajas con sonido, ¡no puedes saber si la reproducción ha terminado! Tuve que agregar una muleta que reconoce la duración del sonido del archivo de reproducción. En cuanto al Box2D simplificado (las críticas comenzaron de repente), ¡los métodos gloriosos para detectar y procesar antes, durante y después de la colisión desaparecieron de allí! En cambio, llega un mensaje en el guión, que se encuentra en el mismo GO con el cuerpo físico (no siempre cada fotograma, especialmente en el móvil) con información sobre la colisión, y eso es todo. Además, no se puede mover un cuerpo si es físico, solo puede ser cinemático y esta propiedad no se puede cambiar durante la ejecución. GO no se puede escalar junto con el cuerpo físico, en el editor cambiará la escala para ti, pero no en el juego (como prometieron arreglarlo). GO no se puede escalar a menos (por ejemplo, espejo por X), todo funcionará en el editor, pero en ejecución volverá al original. En general, me rebelé un poco sobre este tema y (habiendo resuelto estos problemas con muletas) me tranquilicé, aún así la velocidad de Defold y su editor superó el freno Libgdx (¡los lectores me perdonarán mi subjetividad!) Y la falta de un editor normal (recuerdo que de alguna manera lo hice para Lieb editor de mapas en Autodesk Maya, pero esa es otra historia ...).
El método msg.post () y cómo relacionarse con él
En general, cada objeto tiene una url (por ejemplo, "main: / main_pers # spine_anim"), mediante la cual puede enviar un mensaje e incluso adjuntarle variables. Los mensajes vuelan directamente al destinatario sin esperar en línea para su procesamiento. Es conveniente y también crea confusión a veces. A menudo se necesitan mensajes para enviar información de GO a la GUI (por ejemplo, su oveja atrapó una burbuja con fruta, actualizamos la puntuación en la GUI).

y viceversa (se acabó la energía, informamos a las ovejas que es hora de dormir).

Los problemas surgen cuando las variables calculadas en uno de los scripts en el método de actualización no tienen tiempo para actualizar, porque los mensajes están fuera de turno. Pero esto no es nada, lo principal es acostumbrarse.
Otro matiz son las direcciones de los objetos. En esencia, estas son cadenas, sin embargo, en las plataformas móviles, las cadenas están deshabilitadas para ahorrar recursos (¿dónde, maldición, está escrito?), En lugar de ellos hay un hash. No parece nada, sí, pero si la lógica de su juego envía mensajes a través de las líneas editadas, espere el problema, el servicio postal no entregará una carta al destinatario. Por lo tanto, reserve direcciones en variables a través del método msg.url () y no toque. En realidad, estos son pequeños, pero al principio quita terriblemente un tiempo precioso. Por ejemplo, para saber si una oveja está en el suelo, debe agregar un cuerpo cinemático adicional justo debajo de las patas y preguntarle si hay una entrada en el suelo.
Huesos de dragón en lugar de columna vertebral
No hay problema, usamos un dragón, porque la columna está muy pagada. Pero, como siempre, hay un pero. La columna tiene una función: la piel, el dragón no la tiene. ¿Cómo resolverlo? Manos Abre json desde la columna vertebral y mira donde hay piel, analiza, copia, pega en nuestro json desde el dragón y edita como debería, eso es todo. Un script de Python te ahorra una cantidad decente. En cuanto a los guiones, generalmente es un cuento de hadas. Como todos los archivos son texto, la edición puede ser automatizada. Por ejemplo, recolecté un nivel en el editor usando un atlas general con una gran cantidad de texturas (más de 300), pero no usé todo, solo alrededor de 100. Para no usar mis manos, "optimicé" el optimizador de atlas: todo lo que se usa en la colección permanece, el resto tira a la basura. Es muy conveniente cuando puedes automatizar algo.
Compartir y Admob
El botón Compartir se puede encontrar en activos y adjuntar en un par de minutos. Precaución con los activos! Asmo Admob, por ejemplo, ralentiza significativamente la compilación y tampoco se proporciona cuando no hay conexión de red. En el caso de Admob (no escribiré cómo incrustarlo, todo está en la documentación en el github), aún debe hacer una verificación en la plataforma, de lo contrario, la compilación en las ventanas dará un error. Por lo tanto, al desarrollar, posponga la publicidad y otros activos por última vez, como La construcción de Defold sin ellos es muy rápida. En cuanto a la localización, puede crear un diccionario de este tipo:
dict["ru"]["lang"]=" " dict["en"]["lang"]="Ya ne russkiy"
y cambie el texto durante la inicialización, haciendo referencia a lo siguiente:
language=sys.get_sys_info().language label.set_text("game:/go#label",dict[language]["lang"]
Eso es básicamente todo, de acuerdo con el resultado, Defold es muy bueno (cuando lo descubrí), así que les aconsejo a todos. A quién le importa lo que obtuve, mira el
trailer aquí (no para relaciones públicas, mi público objetivo son los niños).