Differences

This shows you the differences between the selected revision and the current
version of the page.


es:wmebook:ch4 2013/05/26 12:32 es:wmebook:ch4 2013/05/26 12:56 current
Line 183: Line 183:
Para entender mejor estos últimos métodos, veamos un ejemplo aplicado a la puerta que vimos en el capitulo anterior: Para entender mejor estos últimos métodos, veamos un ejemplo aplicado a la puerta que vimos en el capitulo anterior:
 +
 +<code script>
 +var door = Scene.GetNode("Door");
 +door.ApplyEvent("LeftClick");
 +</code>
 +
 +Con esto lo que haríamos sera hacer un evento LeftClick sobre la puerta, sin que el jugador físicamente tenga que pulsar, esto a veces es útil en momentos de animación, por ejemplo cuando un jugador entra en una escena y el personaje automáticamente se va hacia un punto de la escena, y hace algo, pues estos eventos son útiles para eso.
 +
 +Antes de seguir, veamos si tu fichero game.script es como el mio.
 +
 +<code script>
 +#include "scripts\base.inc"
 +#include "scripts\keys.inc"
 + 
 +// almacena algunos atributos del juego en variables globales
 +Keyboard = Game.Keyboard;
 +Scene = Game.Scene;
 + 
 +// load the "caption" window
 +var win = Game.LoadWindow("interface\system\caption.window");
 +global WinCaption = win.GetControl("caption");
 + 
 +// carga el actor principal
 +actor = Game.LoadActor("actors\molly\molly.actor");
 +Game.MainObject = actor;
 + 
 +// ejecuta el script de demonios
 +Game.AttachScript("scripts\game_daemon.script");
 + 
 +// carga la escena inicial
 +Game.ChangeScene("scenes\Room\Room.scene");
 + 
 + 
 + 
 +on "LeftClick"
 +{
 +  var ActObj = Game.ActiveObject;
 +  if(ActObj!=null)
 +  {
 +    ActObj.ApplyEvent("LeftClick");
 +  }
 +  else
 +  {
 +    Scene.ApplyEvent("LeftClick");
 +  }
 +}
 + 
 +on "Keypress"
 +{
 +  // on Esc or F1 key
 +  if(Keyboard.KeyCode==VK_ESCAPE || Keyboard.KeyCode==VK_F1)
 +  {
 +    // carga y muestra la ventana del menu principal
 +    WinCaption.Visible = false;
 +    var WinMainMenu = Game.LoadWindow("interface\system\mainmenu.window");
 +    WinMainMenu.Center();
 +    WinMainMenu.GoSystemExclusive();
 +    Game.UnloadObject(WinMainMenu);
 +  }
 +}
 + 
 +on "QuitGame"
 +{
 +  // on Alt+F4 (window close)
 +  // carga y muestra la ventana de salir del juego
 +  WinCaption.Visible = false;
 +  var WinQuit = Game.LoadWindow("interface\system\quit.window");
 +  WinQuit.Center();
 +  WinQuit.GoSystemExclusive();
 +  // and if the user selected Yes
 +  if(WinQuit.xResult)
 +  {
 +    // sale del juego
 +    Game.QuitGame();
 +  }
 +  // en otro caso descarga la ventana de la memoria y del juego
 +  else Game.UnloadObject(WinQuit);
 +}
 +</code>
 +
 +Bien, ahora probemos el juego, y vemos, que aun funciona, solo hemos hecho unos pequeños cambios sobre el.
 +
 +Ahora para continuar, veamos el fichero game_loop.script.
 +
 +<code script>
 +#include "scripts\base.inc"
 +
 +global WinCaption;
 +global WinMenu;
 +</code>
 +
 +Podemos eliminar fácilmente la linea global WinMenu; ya que hemos decidido eliminar el menú en el botón derecho.
 +
 +<code script>
 +while(true){
 +</code>
 +
 +Esto siempre será verdadero. Se trata de un bucle infinito. Para finalizar este bucle, debemos llamar la función Game.DetachScript(“scripts\game_loop.scrip”);
 +
 +<code script>
 +var ActObj = Game.ActiveObject;
 +</code>
 +
 +Como vemos, la misma linea que en el fichero game.script, constantemente el juego esta comprobando cual es el objeto bajo el ratón.
 +
 +<code script>
 +if(Game.Interactive && ActObj!=null)
 + {
 +</code>
 +
 +Primero comprueba si el juego esta en modo interactivo, y después si el cursor del ratón esta sobre algún objeto activo. Hagamos esta condición mas simple.
 +
 +En el cuerpo de la condicion borraremos lo que ahi y meteremos lo siguiente:
 +
 +<code script>
 +if(Game.Interactive && ActObj!=null)
 +{
 +      WinCaption.X = Game.MouseX;
 +      WinCaption.Y = Game.MouseY + 20;
 +      WinCaption.TextAlign = TAL_LEFT;
 +      WinCaption.Text = ActObj.Caption;
 + 
 +      WinCaption.SizeToFit();
 +      if(WinCaption.X + WinCaption.Width > Game.ScreenWidth) WinCaption.X = Game.ScreenWidth - WinCaption.Width;
 +      if(WinCaption.Y + WinCaption.Height > Game.ScreenHeight) WinCaption.Y = Game.ScreenHeight - WinCaption.Height;
 + 
 +    WinCaption.Visible = true;
 +    WinCaption.Focus();
 +}
 +else WinCaption.Visible = false;
 +</code>
 +
 +Bien,¿ que pasara ahora si el cursor se encuentra sobre algún objeto?
 +
 +<code script>
 +WinCaption.X = Game.MouseX;
 +WinCaption.Y = Game.MouseY + 20;
 +</code>
 +
 +WinCaption contiene una referencia al campo de texto que se encuentra dentro de la ventana caption cargada en game.scipt. Con estas lineas, establecemos su posicion en las mismas coordenadas que nuestra posición X del ratón y la posición Y + 20 pixeles, de esta manera, el nombre del objeto sobre el que situamos el cursor, aparece cercano a este.
 +
 +<code script>
 +WinCaption.TextAlign = TAL_LEFT;
 +WinCaption.Text = ActObj.Caption;
 +</code>
 +
 +Con estas dos lineas, establecemos el alineamiento del texto de esta ventana a la izquierda, y establecemos que el texto de esta ventana, sea el nombre que le hayamos asignado a ese objeto en nuestra escena.
 +
 +<code script>
 +WinCaption.SizeToFit();
 +</code>
 +
 +Redimensionamos la ventana caption al mismo tamaño que el texto que se muestra.
 +
 +<code script>
 +if(WinCaption.X + WinCaption.Width > Game.ScreenWidth) WinCaption.X = Game.ScreenWidth – WinCaption.Width;
 +</code>
 +
 +Si la anchura del campo excede de el ancho de la pantalla, establecemos la posición X de la ventana caption exactamente hasta el final, esto lo hace basándose en la resolución de la pantalla, se hace para evitar que el texto se pierda por los bordes de la pantalla.
 +
 +<code script>
 +if(WinCaption.Y + WinCaption.Height > Game.ScreenHeight) WinCaption.Y = Game.ScreenHeight – WinCaption.Height;
 +</code>
 +
 +Exactamente hace lo mismo que la linea anterior, pero esta vez aplicado a la coordenada Y.
 +
 +<code script>
 +WinCaption.Visible = true;
 +WinCaption.Focus();
 +</code>
 +
 +Una vez que hemos aplicado todos esos cambios, hacemos la ventana caption visible y nos la activa( WinCaption.Focus() ) pero en nuestro caso no es necesario, ya que no interactuaremos sobre esa ventana, así que simplemente podemos eliminar esa linea.
 +
 +<code script>
 + }
 +else WinCaption.Visible = false;
 +</code>
 +
 +Esto significa que si el juego esta en modo no interactivo o el cursor se mueve fuera de algún punto caliente, mantenga esta venta oculta.
 +
 +<code script>
 + if(Game.Interactive && Game.MouseY < 45 && !Game.ResponsesVisible && !WinMenu.Visible) Game.InventoryVisible = true;
 +
 +  else if(Game.MouseY > 100 || Game.ResponsesVisible || !Game.Interactive) Game.InventoryVisible = false;
 +</code>
 +
 +Estas dos lineas, hacen que se muestre o no el inventario, y simplemente para nuestro ejemplo las eliminaremos.
 +
 +<code script>
 +Sleep(20);
 +</code>
 +
 +Recuerdas lo que comentábamos sobre los bucles infinitos, que era necesario realizar una pequeña pausa para dejar la cpu libre a otros procesos, pues bien aquí hacemos uso de esa técnica.
 +
 +Ahora revisemos como nos tiene que quedar nuestro fichero game_loop.script:
 +
 +<code script>
 +#include "scripts\base.inc"
 + 
 +global WinCaption;
 + 
 +//bucle infinito
 +while(true){
 +  var ActObj = Game.ActiveObject;
 + 
 +  if(Game.Interactive && ActObj!=null)
 +  {
 +      WinCaption.X = Game.MouseX;
 +      WinCaption.Y = Game.MouseY + 20;
 +      WinCaption.TextAlign = TAL_LEFT;
 +      WinCaption.Text = ActObj.Caption;
 +      WinCaption.SizeToFit();
 +      if(WinCaption.X + WinCaption.Width > Game.ScreenWidth) WinCaption.X = Game.ScreenWidth - WinCaption.Width;
 +      if(WinCaption.Y + WinCaption.Height > Game.ScreenHeight) WinCaption.Y = Game.ScreenHeight - WinCaption.Height;
 +    WinCaption.Visible = true;
 +  }
 +  else WinCaption.Visible = false;
 +  Sleep(20);
 +}
 +</code>
 +
 +Como puedes ver, esta es la columna vertebral de un proyecto. Sin inventario, sin menú, simplemente point and click game. Esto es algo que estamos viendo para que os deis cuenta la forma de funcionar de wintermute, si vais teniendo claras las ideas, podréis cambiar la forma en la que salen estas ventanas, el texto que sale, etc etc. poco a poco podréis modificar estos script y hacer cosas bastante potentes.
 +
 +Ahora pasaremos al siguiente elemento de nuestro proyecto, el actor.
 
es/wmebook/ch4.1369564335.txt.gz · Last modified: 2013/05/26 12:32 by dongo
Recent changes RSS feed Creative Commons License Driven by DokuWiki