fdns / Terasology

Terasology is an open source project started by Benjamin "begla" Glatzel to research procedural terrain generation and efficient rendering techniques in Java using the LWJGL. The engine uses a block-based voxel-like approach as seen in Minecraft. After proving itself as a solid tech demo begla was joined at first by Anton "small-jeeper" Kireev and Rasmus "Cervator" Praestholm and a full-fledged game concept was born. Our goal is a game that pays ample tribute to Minecraft in initial look and origin, but stakes out its own niche by adopting the NPC-helper and caretaker feel from such games as Dwarf Fortress and Dungeon Keeper, while striving for added depth and sophistication in the foundation systems akin to DF.
http://terasology.org/
Apache License 2.0
0 stars 4 forks source link

RS11 - Agregar submenú de análisis/coloreo al menú de pausa #39

Closed elarielcl closed 9 years ago

elarielcl commented 9 years ago

El submenú debe ofrecer :

FrancoPinoC commented 9 years ago

Concept Location: En Terasology, uno de los botones dice “Return to Menu” así que buscamos por este texto en la opción File Search de Eclipse.

FrancoPinoC commented 9 years ago

"Concept Location parte 2, la venganza":

Se quiere buscar dónde se definen los comportamientos de los botones del menú de pausa, el archivo pauseMenu.ui no es una clase de Java, no podemos usar opciones de jerarquía/declaración, entonces para esto, en Java Search de Eclipse se buscó “pauseMenu”

FrancoPinoC commented 9 years ago

Concept Location 3: Ya sabiendo donde se definen los comportamientos, queda saber cómo definir un nuevo menú de botones al que se pueda acceder a través de un botón en el menú de pausa.

emoreno-94 commented 9 years ago

Apoyándose en lo anterior se encontraron los archivos necesarios para editar el menú de pausa, con lo cual se pudo añadir el botón de coloreo.

emoreno-94 commented 9 years ago

Se agrego el sub-menu de coloreo el cual posee los botones de las distintas opciones para colorear. Por defecto se dejo que todos los botones realizaran la acción "full screen"

emoreno-94 commented 9 years ago

Para agregar la funcionalidad a cada botón se debe modificar el archivo /engine/src/main/java/org/terasology/rendering/nui/layers/mainMenu/ColoringMenuScreen.java, donde se tendran metodos del tipo:

 WidgetUtil.trySubscribe(this, ***NOMBRE_COLOREO***, new ActivateEventListener() {
            @Override
            public void onActivated(UIWidget widget) {
                /* AQUÍ VAN LOS COMANDOS */
                CoreCommands c = new CoreCommands();
                c.fullscreen();
            }
        }); 
FrancoPinoC commented 9 years ago

Por el momento los submenús y los botones de cada coloreo están definidos en el engine, mientras que los comandos de cada tipo de coloreo están definidos en su propio module. Los modules están hechos para extender Terasology, de modo que, en principio, los modules pueden conocer el código base, pero el código base de Terasology no debería conocer explícitamente a los modules, así que cabe preguntarse:

Cómo recuperar y ejecutar los comandos de los modules sin tener que acceder a ellos:

. . .
@In 
private Console console; // variable de instancia
. . .
ConsoleCommand ca = console.getCommand(new Name("CoberturaAnalysis"));
List<String> params = new ArrayList<String>(); // Lista de parametros
[Rellenar lista]
EntityRef e = null;
try {
    ca.execute(params, e);
} catch (CommandExecutionException e1) {
    [Manejar error]
}

Cuando se añade un comando por medio del sistema de anotaciones, Terasology permite acceder a un objeto ConsoleCommand con la lógica de ese comando por medio de una "Console" (es como el comando "help" obtiene los nombres y descripciones de todos los comandos, incluyendo los que se encuentran fuera del engine, en modules).

Entonces, se usa el método getCommand([Nombre del comando]) en la variable console, el parámetro que se le da es un "Name", que representa el nombre del comando (basta instanciar un Name usando un String con el nombre del comando como parámetro).

Una vez se un obtiene el objeto que representa el comando deseado, basta aplicar execute en este para ejecutarlo. execute recibe dos parámetros: Una List con los valores de los argumentos para el comando (los que se le dan al usarlo en la consola de Terasology) y un "EntityRef" (basta que sea null para nuestros propósitos).

(ejemplo de implementación aquí )

elarielcl commented 9 years ago

Dado que el submenú fue creado por cada coloreo por separado, el submenú de coloreo se redujo a un menú con botones con un link a cada uno de los subsubmenús implementados por cada grupo de coloreo