Hola.
Debido al gran interés que existe por hacer diálogos basados en iconos en WME, he decidido crear un sencillo objeto universal que puedas usar y adaptar a tus necesaidades.
Aquí tienes un ejemplo de cómo implementarlo rápidamente:
1. Crea el archivo scripts\dialogueObject.script con el siguiente contenido:
#include "scripts\base.inc" // Define las dimensiones de los iconos de tu diálogo var ICON_WIDTH = 57; var ICON_HEIGHT = 57; // script es el nombre donde manejarás las respuestas del ociono seleccionado por el jugador method initializeDialogue(script) { this.script = script; this.iconCount = 0; this.window = Game.LoadWindow("windows\dialogueWindow.window"); var tmpwin = this.window; tmpwin.Visible = true; tmpwin.AttachScript(script); } // Esto terminará el diálogo y liberará los recursos method endDialogue() { var tmpwindow = this.window; tmpwindow.DetachScript(this.script); tmpwindow.Close(); } // Esto añadirá un icono a la ventana de diálogo method insertIcon(name, sprite, hoversprite) { var tmpwin = this.window; var tmpButton = tmpwin.CreateButton(name); tmpButton.X = this.iconCount * ICON_WIDTH; tmpButton.SetImage(sprite); tmpButton.SetHoverImage(hoversprite); tmpButton.Visible = true; tmpButton.Interactive = true; tmpButton.ParentNotify = true; tmpButton.Disabled = false; tmpButton.PixelPerfect = false; tmpButton.Width = ICON_WIDTH; tmpButton.Height = ICON_HEIGHT; this[this.iconCount] = name; // Guardamos el nombre para borrar rápidamente la referencia más adelante this.iconCount = this.iconCount + 1; } // Esto elimina el icono (normalmente, después de agotar todos los temas) method removeIcon(name) { var tmpwin = this.window; var reorder = -1; // a salvo de llamadas sin sentido for (var a = 0; a<this.iconCount; a= a+1) if (this[a] == name) reorder = a; if (reorder == -1) return; tmpwin.DeleteButton(name); for (a = reorder; a<this.iconCount; a = a +1) { this[a] = this[a+1]; var button = tmpwin.GetControl(this[a+1]); button.X = a* ICON_WIDTH; } }
2. Crea un archivo llamado scripts\reactions.script
on "first" { Game.Msg("Haz algo después de la primera elección."); } on "second" { Game.Msg("Haz algo después de la segunda elección."); } on "third" { Game.Msg("Haz algo después de la tercera elección."); dlgObject.removeIcon("second"); }
3. Escribe en scripts\base.inc
global dlgObject;
y en scripts\game.script
dlgObject = new Object("scripts\dialogueObject.script");<code> Entonces, en tu escena de prueba introduce el siguiente código: <code script>dlgObject.initializeDialogue("scripts\reactions.script"); dlgObject.insertIcon("first","icon.png","icon.png"); // mete alguna imagen real en lugar de icon.png dlgObject.insertIcon("second","icon.png","icon.png"); // mete alguna imagen real en lugar de icon.png dlgObject.insertIcon("third","icon.png","icon.png"); // mete alguna imagen real en lugar de icon.png
El esqueleto básico ha sido completado. Después de que acabe el diálogo, llama a
dlgObject.endDialogue(); y probablemente tendrás que poner la variable set Game.Interactive a True (si anteriormente era False)
Espero que te ayude. ¡Los comentarios son bienvenidos!