¿Cómo implementar sonido de pasos dependiendo de la superficie?

Implementar el sonido de pasos es fácil, consiste en añadir un sonido a ciertos fotogramas de las animaciones de andar o correr. Pero algunas veces, puede ser necesario que el sonido de los pasos sea distinto dependiendo de la superficie por la que se camine.

Lo primero que hay que hacer, es definir las distintas áreas correspondientes a las distintas superficies, tales como tierra, metal, hierba, suelo, etc. En WME, se pueden añadir variales a cualquier objeto (llamdas custom properties), incluyendo las regiones definidas en las escenas (scene regions). Vamos a suponer que en la escena tenemos una superficie de hierba, entonces en el Scene Edit crearíamos una región con la forma de la superficie que es de hierba, en las propiedades de la región, dentro del Scene Edit, seleccionaríamos el botón "Custom…". Ahí añadiremos una nueva propiedad (variable) y su valor correspondiente, en este ejemplo de la hierba:

Nombre: superficie
Valor: hierba

Ahora ya tenemos una zona definida en la escena y accediendo a esta variable, sabremos que es hierba lo que el actor pisa cuando anda por esta región.

Bien, lo siguiente que debemos hacer es la comprobación de qué está pisando el personaje cuando anda, para eso WME permite lanzar eventos para ejecutar un código en un fotograma de una animación, lo que pretendemos es que cuando el personaje pise en el suelo, ejecutar un programa que compruebe donde esta pisando y reproduzca el sonido de un paso dependiendo de la superficie. Dependiendo de si estamos haciendo un juego 2D o 2.5D, la programación del evento la tendremos que hacer en un sitio o en otro.

En el caso de 2D.

Abrimos la animación en el Sprite Edit? y editamos los fotogramas donde el actor pone el pie en el suelo, que es cuando suena el paso, normalmente hay dos fotogramas en una animación de andar, uno cuando pisa con el pie izquierdo y otro cuando pisa con el pie derecho. En las propiedades del fotograma "Frame properties" hay un campo para indicar el evento que se va a lanzar cuando ese fotograma se reproduzca, este campo está indicado como "Event". Ahí introduciremos el nombre del evento, en nuestro ejemplo le llamaremos "paso".

En el caso de 2.5D

Si estamos utilizando un actor 3D, el evento se lo tenemos que indicar en el fichero nombre_del_actor.act3d, ahí estan definidas las animaciones y sus características, en el ejemplo siguiente suponemos que tenemos una animación que se llama andar, de 20 fotogramas y que en el Nº 10 y el 20 es cuando el actor pone cada uno de los pies en el suelo.

ANIMATION 
  { 
    NAME="andar" 
    LOOPING=TRUE 
 
    EVENT 
    { 
      FRAME = 10 
      NAME = "paso" 
    } 
    EVENT 
    { 
      FRAME = 20 
      NAME = "paso" 
    } 
}

El código, como véis, no tiene misterio, simplemente le dice que en la animación andar, cuando se reproduzca el fotograma 10 o el 20, lance el evento "paso".

Ahora, lo que hay que hacer, es programar el evento, el evento lo lanza el actor cuando se reproduce su animación, por lo que hay que programar el código en el script del actor, lo que vamos a hacer es que cuando se produzca el evento "paso" vamos a comprobar qué está pisando el actor y reproducir un sonido de paso en hierba o en suelo.

on "paso"  //Cuando se produzca el evento "paso", es decir en los fotogramas 10 y 20. 
{ 
 // Cogemos la región en la que está el actor 
 var Reg = Scene.GetRegionAt(this.X, this.Y); 
 // Si la región no es nula, es decir, si esta pisando en una región que hayamos definido en el Scene Edit 
 if (Reg!=null) 
 { 
   // Vamos a hacer las comprobaciones de la región 
   // "superficie" es la variable que habíamos definbido para la región en el Scene Edit 
   switch(Reg.superficie) 
   { 
     case "hierba": // Si la región que esta pìsando tiene el valor "hierba" 
       this.PlaySound("paso_hierba.ogg"); 
     break; 
 
     case "madera": // Si la región que esta pìsando tiene el valor "madera", suponiendo que tengamos varias regiones con varios tipos de superficie 
       this.PlaySound("paso_madera.ogg"); 
     break; 
 
     default: 
       this.PlaySound("paso_normal.ogg"); // este sería el sonido en el caso de que la región no tuviera la superficie definida 
     break; 
   } 
 } 
}

Lógicamente, podemos definir las regiones que queramos y poner un bloque case …. break; para comprobar cada superficie y reproducir cada sonido.