Differences

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


es:wmebook:ch4 2013/05/26 12:39 es:wmebook:ch4 2013/05/26 12:56 current
Line 262: Line 262:
} }
</code> </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.1369564743.txt.gz · Last modified: 2013/05/26 12:39 by dongo
Recent changes RSS feed Creative Commons License Driven by DokuWiki