Aravid

Tutoriales, Gamer Sense, opinión y más

Scaleform: Integración en UDK

Después de los dos tutoriales anteriores, ya tenemos una película de Flash preparada para que pueda ser importada en UDK. Para ello, debemos de hacer una clase que se encargue de la película en sí y de implementar los métodos que llamamos desde Actionscript.

El primer paso es importar a nuestro paquete de assets la película siguiendo los pasos a continuación:

  1. Lanzamos el Unreal Editor y nos vamos al Content Browser.
  2. Seleccionamos nuestro paquete de assets (en mi caso, DCleanerAssets) y pulsamos el botón Import.
  3. Seleccionamos la película que se encuentra en UDK\UDKGame\Flash\DCleanerAssets (Recordar que no podemos especificar a qué paquete de assets se añadirá la película. Lo hará en uno con el nombre de la carpeta, por eso mi carpeta se llama igual que el paquete de assets).
Ahora en nuestro paquete de assets tendremos un SwfMovie que es la película que hemos importado y una Texture2D que es el puntero del ratón.
Nota: Lo que importamos no es el fichero .fla, lo que importamos en el fichero .fla una vez publicado, que su extensión es .swf

A continuación, nos vamos a nuestra carpeta donde se encuentran todos los ficheros de UnrealScript, en mi caso y siguiendo las convenciones habituales, se encuentra en Development\Src\DCleaner\Classes siendo DCleaner vuestra carpeta para código propio. Como recordatorio, esta carpeta se definió en el primer artículo de UDK: Estructura de carpetas, y en dicha carpeta creamos un nuevo fichero que yo llamaré DCleanerPauseMenu.uc

Recomendación: Ya dije en el artículo de UDK: Herramientas que lo mejor para trabajar con UnrealScript es tener nFringe instalado, y para crear un fichero desde nFringe, nos vamos a la carpeta donde debería de estar el fichero, y con botón derecho -> Add -> New Item y seleccionando un fichero de UnrealScript, nFringe ya se encarga de crearlo y además el autocompletado de código funcionará mejor que si importamos el fichero.

Ya tenemos el fichero, y debemos especificar el nombre de la clase y de qué clase vamos a heredar. Yo llamaré a la clase igual que al fichero, es decir DCleanerPauseMenu y toda película de Flash debe de heredar de GFxMoviePlayer, así que sabiendo esto, podemos poner la primera línea:

class DCleanerPauseMenu extends GFxMoviePlayer;

A continuación, rellenamos el bloque de defaultProperties con el nombre de la película que vamos a reproducir, y activamos el boolean bPauseGameWhileActive que se encargará de pausar el juego mientras mostramos la película, que es exactamente lo que queremos para nuestro menú de pausa. También necesitamos capturar la entrada del juego, así que también activamos el boolean bCaptureInput. El bloque quedará así:

defaultProperties
{
	MovieInfo = SwfMovie'DCleanerAssets.PauseMenu'
	bCaptureInput=true
	bPauseGameWhileActive=true
}

Nota: Para obtener el nombre completo de la película, nos vamos al Content Browser y con botón derecho sobre el item del que queremos obtener el nombre completo, seleccionamos la opción de Copy fullname to clipboard.

Ahora tenemos que implementar el método Init(), que lo llamaremos para inicializar la película.

function Init(optional LocalPlayer LocPlay)
{
	super.Init(LocPlay); // Llamamos al método de la clase padre
	Start(); // Inicializamos la película

	/* Los siguientes métodos especifican el escalado de la película, al igual 
	que su alineación en la pantalla, los posibles valores de cada uno están 
	definidos en GFxMoviePlayer.uc pero como no me cuesta nada, os los copio 
	aquí para que conozcáis las posibilidades de cada método

	enum GFxScaleMode
	{
		SM_NoScale,
		SM_ShowAll,
		SM_ExactFit,
		SM_NoBorder
	};

	enum GFxAlign
	{
		Align_Center,
		Align_TopCenter,
		Align_BottomCenter,
		Align_CenterLeft,
		Align_CenterRight,
		Align_TopLeft,
		Align_TopRight,
		Align_BottomLeft,
		Align_BottomRight
	}; */

	SetViewScaleMode(SM_NoScale);
	SetAlignment(Align_Center);
	Advance(0.f); // Especificamos que vaya al frame 0 de la película
}

Solo nos falta implementar los métodos que son llamados desde ActionScript, los nombres que le dimos a estos métodos eran ExitMenu() y ExitGame(), así que los declaramos y los rellenamos.

function ExitMenu()
{
	ConsoleCommand("TogglePauseMenu");
}

function ExitGame()
{
	ConsoleCommand("exit");
}

Nota: El método ConsoleCommand lo que invoca es el método que se le pasa por parámetro como si lo hubieramos introducido en la consola.

El comando de consola exit ya existe, por lo que no tenemos que hacer nada con él, pero TogglePauseMenu no existe, y debemos de declararlo de forma que pueda ser invocado por consola para que todo funcione correctamente. El lugar más adecuado para este método es la clase personalizada para mostrar el HUD que ya debería de existir. Yo abro mi fichero DCleanerHUD.uc y al final, declaramos el método TogglePauseMenu que abrirá la película si está abierta, y en el caso de estar abierta, la cerrará.

/* Al comienzo del fichero, declaramos una variable de tipo DCleanerPauseMenu */
var DCleanerPauseMenu PauseMenu;

exec function TogglePauseMenu()
{
	/* Si el fichero no es igual a none y el flag de que la película está 
	abierta es true, lo que hacemos es cerrar la película. */
	if(PauseMenu != None && PauseMenu.bMovieIsOpen)
	{
		/* Cerramos la película. El parámetro de la función es si deseamos 
		eliminar de la memoria la película. En nuestro caso, como es un
		menú de pausa que será invocado en más de una ocasión, mejor no 
		eliminarlo porque la siguiente vez que fuera invocado, tendría que
		copiarlo a memoria de nuevo. */
		PauseMenu.Close(false);
	}
	/* Si por otro lado, la película no es igual a None o no se encuentra 
	abierta */
	else
	{
		/* Comprobamos si la película es igual a none, para inicializar la 
		variable. Lo realizamos así, porque al no descargar la película, 
		podría ocurrir que la película estuviera cerrada, pero que PauseMenu 
		no fuera none */
		if(PauseMenu == None)
		{
			/* Sabiendo que la película no está inicializada, la 
			inicializamos haciendo un new en nuestra variable */
			PauseMenu = new class'DCleanerPauseMenu';
		}
		/* Llegados a este punto, estando ya la película creada, o recién 
		creada, debemos llamar a este método para que muestre la película. 
		Recuerdo que este método lo hemos escrito en nuestra clase*/
		PauseMenu.Init();
	}
}

Nota: la palabra reservada exec se utiliza para especificar que un método puede ser invocado por consola. Lo que nos permite invocarlo con el método ConsoleCommand.

Ya hemos terminado con la integración de un fichero de Flash en UDK. Como habéis podido ver, es realmente fácil y una vez realizado uno, todos son iguales. Un pequeño resumen de los pasos es:

  1. Realizamos la película con los widgets específicos de Scaleform.
  2. Importamos la película a nuestro paquete de assets.
  3. Declaramos el fichero que hereda de GFxMoviePlayer.
  4. En el bloque de defaultProperties, especificamos la película y todos los parámetros por defecto, como bCaptureInput o bPauseGameWhileActive.
  5. Reescribimos el método Init() y modificamos la alineación o escalado al gusto.
  6. Y Voilá. Tenemos que buscar un sitio en nuestro código donde llamaremos a la película para mostrarla, y acordarnos de disponer de una manera de cerrar la película, o no podremos volver al juego.
Anuncios

Una respuesta a “Scaleform: Integración en UDK

  1. Nelson diciembre 19, 2013 en 4:53 am

    Hola, estuve realizando el tutorial paso por paso, pero me salio un error, abro un mapa por defecto de udk y al presionar esc (que creo es la tecla que activa el menú) no ocurre nada.

    Mi pregunta es si debo agregar algo a kismet para hacerlo funcionar,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: