Es:Scripted levels
Contents
- 1 Introducción
- 2 Funciones llamadas por el X-Moto
- 3 Funciones del X-Moto
- 3.1 GetTime()
- 3.2 Message(msgs)
- 3.3 ClearMessages()
- 3.4 SetGravity(x, y)
- 3.5 GetGravity()
- 3.6 IsPlayerInZone(zone)
- 3.7 SetPlayerPosition(x, y, bRight)
- 3.8 GetPlayerPosition()
- 3.9 SetEntityPos(entity, x, y)
- 3.10 GetEntityPos(entity)
- 3.11 SetKeyHook(key, function)
- 3.12 GetKeyByAction(function)
- 3.13 Log(msgs)
- 3.14 MoveBlock(block, x, y)
- 3.15 SetBlockCenter(block, x, y)
- 3.16 SetBlockPos(block, x, y)
- 3.17 GetBlockPos(block)
- 3.18 SetBlockRotation(block, angle)
Introducción
Los Scripts hacen que un nivel sea dinámico. Puedes cambiar algunas propiedades físicas, mover objetos, modificar la lógica del juego, etc. Un script está hecho con el lenguaje Lua y se puede añadir al archivo del nivel.
La documentación sobre el lenguaje Lua la puedes encontrar aquí: http://www.lua.org/manual/5.1/
Para hacer un script, has de saber al menos un poco sobre el archivo de nivel. Es un archivo XML. Incluye propiedades como el nombre del nivel, su descripción ... Además, incluye las definiciones de los bloques y las figuras. Un bloque se compone por vértices que son puntos unidos para formar un polígono.
Para presentar la forma de escribir un script, lo siguiente es un nivel básico que utilizaremos de ejemplo:
<?xml version="1.0" encoding="utf-8"?> <level id="tutscript"> <info> <name>tutscript</name> <description></description> <author></author> <date></date> <sky>sky1</sky> </info> <script> </script> <limits left="0" right="50" top="30" bottom="0"/> <block id="Block0"> <position x="0" y="0"/> <usetexture id="default"/> <vertex x="5" y="5"/> <vertex x="5" y="10"/> <vertex x="10" y="10"/> <vertex x="10" y="5"/> </block> <entity id="MyPlayerStart0" typeid="PlayerStart"> <size r="0.4"/> <position x="7.5" y="10"/> </entity> <entity id="Strawberry0" typeid="Strawberry"> <size r="0.4"/> <position x="20" y="0.5"/> </entity> <entity id="SnowMan0" typeid="Sprite"> <param name="name" value="SnowMan"/> <position x="19" y="0.2"/> <param name="z" value="-1"/> </entity> <zone id="Zone0"> <box left="40" right="50" top="5" bottom="0"/> </zone> </level>
Este nivel se puede hacer fácilmente con el xmoto-edit. Incluye un bloque llamado Block0 que es un cuadrado, una fresa llamada Strawberry0 y una zona llamada Zone0. Una zona es una parte invisible del nivel que hará que se ejecuten acciones cuando el jugador esté a dentro.
Algunas funciones requieren una mínima versión del xmoto para funcionar. Si haces servir alguna de estas funciones, por favor, pon esta información en le archivo del nivel. Por ejemplo, para hacer que tu nivel requiera el X-Moto 0.2.0, añade esta linea al código de tu nivel:
<level id="tutscript" rversion="0.2.0">
Todo el código del script es lenguaje Lua. Puedes encontrar la sintaxis aquí. De todas maneras, si escoges incluir el script dentro de un archivo XML, los símbolos < y > se han de reemplazar con < y >. El código del script se puede añadir entre <script> y </script> dentro de archivo de nivel.
Funciones llamadas por el X-Moto
OnLoad()
Explicación
Est función es llamada una vez al inicio del nivel. Has de retornar true si nada malo sucede.
Ejemplo de Script
El ejemplo muestra un mensaje al inicio del nivel.
function OnLoad() Game.Message("This level is scripted") return true end
Tick()
Explicación
Funcinó llamada una vez cada centésima de segundo. Has de retornar true si nada malo sucede.
Ejemplo de Script
Este ejemplo se iniciara con gravedad 0 ; después, irá incremendose con el tiempo. Como la gravedad de la tierra es 9.81, no habrá gravedad terrestre hasta alcanzar los 9.81 segundos. Fijate que en el X-Moto la gravedad vertical se ha de multiplicar por -1 porqué las coordenadas de la pantalla están invertidas.
function Tick() if Game.GetTime() < 9.81 then Game.SetGravity(0, Game.GetTime() * -1) end return true end function Load() Game.SetGravity(0, 0) return true end
Entity.Touch()
Explicación
Esta función es llamada cuadno una figura (una fresa por ejemplo) es tocada. La figura se ha de declarar en el script. Fijate que el parámetro <size r> permite escoger el margen de la distancia que se considera para que una figura sea tocada.
Ejemplo de Script
El ejemplo muestra un mensaje cuando se toca una fresa.
Strawberry0 = {} function Strawberry0.Touch() Game.Message("Nice strawberry !") end
Zone.OnEnter()
Explicación
Esta función es llamada cuando el jugador entra en una zona.
Ejemplo de Script
El ejemplo muestra un mensaje cuando el jugador entra en la zona llamada Zone0.
Zone0 = {} function Zone0.OnEnter() Game.Message("Entering in the zone") end
Zone.OnLeave()
Explicació
Esta función es llamada cuando el jugador sale de una zona.
Ejemplo de Script
El ejemplo muestra un mensaje cuando el jugador sale de la zona llamada Zone0.
Zone0 = {} function Zone0.OnLeave() Game.Message("Leaving the zone") end
OnSomersault(bClockWise)
[require Xmoto >= 0.2.1]
Explicación
Esta función se llamada cada vez que el jugador hace una voltereta. Si bClockWise es 1 la voltereta sigue las agujas del reloj, si es 0 es al reves.
Ejemplo de Script
El ejemplo muestra un mensaje cuando el jugador have una voltereta.
function OnSomersault(bClockWise) if(bClockWise == 1) then Game.Message("ClockWise Somersault") else Game.Message("CounterClockWise Somersault") end end
OnWheel1Touchs(status), OnWheel2Touchs(status)
[require Xmoto >= 0.2.1]
Explicación
Esta función es llamada cada vez que la rueda 1 toca la tierra o se detiene para tocarla. (el estatus es 1 si la rueda no estaba tocando la tierra y ahora si lo toca, y 0 para las demás situaciones)
Ejemplo dr Script
El ejemplo muestra la nueva máxima durada de un salto cada vez que es hace uno nuevo.
max_jump_time = 1.0 -- start at 1 to not count smaller jumps jump_begin = 0.0 touch_1 = false touch_2 = false function OnWheel1Touchs(bStatus) if(bStatus == 1) then updateMax() touch_1 = true else touch_1 = false jump_begin = Game.GetTime() end end function OnWheel2Touchs(bStatus) if(bStatus == 1) then updateMax() touch_2 = true else touch_2 = false jump_begin = Game.GetTime() end end function updateMax() if(touch_1 == false and touch_2 == false) then if(Game.GetTime() - jump_begin > max_jump_time) then max_jump_time = Game.GetTime() - jump_begin Game.Message("New high jump: "..max_jump_time) end end end
Funciones del X-Moto
GetTime()
Explicación
Retorna el tiempo transcurrido desde el inicio del nivel.
Ejemplo de Script
El ejemplo muestra un mensaje si el jugador tarda mas de 10 segundos en entrar en una zona.
Zone0 = {} function Zone0.OnEnter() if Game.GetTime() > 10.0 then Game.Message("10 seconds to come there, that's a lot !") end end
Message(msgs)
Explicación
Muestra un mensaje en la pantalla. El mensaje se eliminara automáticamente después de 5 segundos. Puedes llamar a esta función unas cuantas vezes : los mensajes se mostraran todos.
Ejemplo de Script
El ejemplo muestra algunos mensajes al inicio del nivel.
function OnLoad() Game.Message("This level is scripted") Game.Message("GO GO GO !!!") return true end
ClearMessages()
Explicació
Elimina los mensajes de la pantalla.
Ejemplo de Script
El ejemplo muestra como eliminar los mensajes de la pantalla y mostrar uno nuevo en algunas circunstancias.
Zone0 = {} function Zone0.OnEnter() Game.ClearMessages() Game.Message("OnEnter") end function Zone0.OnLeave() Game.ClearMessages() Game.Message("OnLeave") end
SetGravity(x, y)
Explicación
Cambia la gravedad en el juego (horizontal y vertical).
Ejemplo de Script
El ejemplo muestra como invertir la gravedad. Fijate que en el X-Moto, la gravedad se ha de multiplicar por -1, porque las coordinadas de la pantalla estan invertidas en la dirección y.
function OnLoad() Game.SetGravity(0, 9.81) return true end
GetGravity()
Explicación
Retorna el par (gravedad horitzontal, y gravedad vertical).
Ejemplo de Script
El ejemplo muestra el viento y la gravedad al inicio del nivel.
function OnLoad() x, y = Game.GetGravity() Game.Message("Wind : "..x) Game.Message("Gravity : "..(y*-1)) return true end
IsPlayerInZone(zone)
Explicación
Retorna treu si el jugador esta en la zona especificada.
Ejemplo de Scrpit
Este ejemplo es un poco mas complicado. Cuando el jugador entra en una zona, la gravedad baja poco a poco. Una vez el jugador sale de la zona, la gravedad vuelve a ser 9.81 gradualmente.
Zone0 = {} x = -9.81 function Tick() if Game.IsPlayerInZone("Zone0") then Game.SetGravity(0, x) x = x + 0.1 end return true end function Zone0.OnLeave() x = -9.81 Game.SetGravity(0, x) end
SetPlayerPosition(x, y, bRight)
Explicación
Especifica la posición y la dirección del jugador en el juego. bRight puede ser 0 o 1.
Ejemplo de Script
El ejemplo tele-transporta al jugador cada vez que entra en la zona.
Zone0 = {} function Zone0.OnEnter() Game.SetPlayerPosition(5, 0, 1) end
GetPlayerPosition()
Explicación
Retorna el trio (x, y, bRight) que da la posición del jugador en el juego.
Ejemplo de Script
Este ejemplo hace que el jugador no sea capaz de coger una fresa ;-)
function Tick() x, y, bright = Game.GetPlayerPosition() if x > 18 then Game.SetPlayerPosition(5, 0, 1) end return true end
SetEntityPos(entity, x, y)
Explicación
Especifica la posición de una figura en las coordenadas (x, y) dentro del juego.
Ejemplo de Script
El ejemplo cambia la posición de una fresa cada segundo.
function Tick() i,f = math.mod(math.ceil(Game.GetTime()), 2) if i == 1 then Game.SetEntityPos("Strawberry0", 10, 0.5) else Game.SetEntityPos("Strawberry0", 30, 0.5) end return true end
GetEntityPos(entity)
Explicación
Retorna la posición de una figura dentro del juego.
Ejemplo de Script
El ejemplo muestra otra manera para mover una fresa.
last_update = 0 function Tick() sec = math.ceil(Game.GetTime()) if last_update < sec then x, y = Game.GetEntityPos("Strawberry0") if(x == 20) then x_new = 25 else x_new = 20 end if(y == 0.5) then y_new = 2 else y_new = 0.5 end Game.SetEntityPos("Strawberry0", x_new, y_new) last_update = sec end return true end
SetKeyHook(key, function)
Explicación
Cuando el jugadpr aprete la "tecla" especificada, una funcion sera llamada.
Ejemplo de Script
El ejemplo muestra como cambiar la gravedad simplemente apretando una tecla.
g = -9.81 function OnLoad() Game.SetKeyHook("G", "GravityChange") return true end function GravityChange() g = g * -1 Game.SetGravity(0, g) end
GetKeyByAction(function)
Explicación
Retorna la tecla asociada a una acción. Las posibles acciones son Drive, Brake, PullBack, PushForward, ChangeDirection.
Ejemplo de Script
El ejemplo muestra por pantalla como conducir al principio del nivel.
function OnLoad() Game.Message("To drive, press "..Game.GetKeyByAction("Drive")) return true end
Log(msgs)
Explicación
Registra un mensaje en el xmoto.log.
Ejemplo de Script
El ejemplo registra el mensaje "An error occured" al inicio del nivel.
function OnLoad() Game.Log("An error occured") return true end
MoveBlock(block, x, y)
[require Xmoto >= 0.2.0]
Explicación
Esta función permite al X-Moto mover un bloque dentro de un nivel. El bloque ha de ser dinamico (modifica el nivel para conseguir <position x="0" y="0" dynamic="true" />). Fijate que mover un bloque puede ser peligroso: comprueba que el jugador no quede dentro del bloque una vez lo hayas movido.
Ejemplo de Script
En el ejemplo, cuando el jugador pulsa la tecla M, el bloque se mueve hacia la derecha.
function OnLoad() Game.SetKeyHook("M", "MoveTheBlock") return true end function MoveTheBlock() Game.MoveBlock("Block0", 1, 0) end
SetBlockCenter(block, x, y)
[require Xmoto >= 0.2.0]
Explicación
Esta función da el centro de un bloque relativo al nivel. El centro se utiliza para las funciones SetBlockPos(), GetBlockPos() y SetBlockRotation(). Esta función se utiliza generalmente en la función Load() porque no es logico volver a cambiar el centro (aun así puedes cambiarlo si quieres).
Ejemplo de Script
En el ejemplo, se especifica el centro de un bloque en el centro de un cuadrado. Entonces, cuando el jugador pulse M, el bloque se pondrá debajo del jugador.
function OnLoad() Game.SetKeyHook("M", "PutTheBlock") Game.SetBlockCenter("Block0", 7.5, 7.5) return true end function PutTheBlock() x, y = Game.GetPlayerPosition() Game.SetBlockPos("Block0", x, y -2.5 -1) end
SetBlockPos(block, x, y)
[require Xmoto >= 0.2.0]
Explicación
Esta función permite al X-Moto mover un bloque segun su centro dentro de un nivel. El bloque ha de ser dinàmico (modifica el nivel para conseguir <position x="0" y="0" dynamic="true" />). Fijate que mover un bloque puede ser peligroso: comprueba que el jugador no quede dentro del bloque una vez lo hayas movido.
Ejemplo de Script
En el ejemplo, se especifica el centro de un bloque en el centro de un cuadrado. Entonces, cuando el jugador pulse M, el bloque se pondrá debajo del jugador.
function OnLoad() Game.SetKeyHook("M", "PutTheBlock") Game.SetBlockCenter("Block0", 7.5, 7.5) return true end function PutTheBlock() x, y = Game.GetPlayerPosition() Game.SetBlockPos("Block0", x, y -2.5 -1) end
GetBlockPos(block)
[require Xmoto >= 0.2.0]
Explicación
Esta funcion da la posición de un bloque dado. El bloque ha de ser dinamico (modifica el nivel para conseguir <position x="0" y="0" dynamic="true" />).
Ejemplo de Script
El ejemplo muestra como utilizar esta función como una condición. Ahora, puedes mover el bloque debajo de la moto tan solo si juegas hacia la derecha.
function OnLoad() Game.SetKeyHook("M", "PutTheBlock") Game.SetBlockCenter("Block0", 7.5, 7.5) return true end function PutTheBlock() x, y = Game.GetPlayerPosition() bx, by = Game.GetBlockPos("Block0") if(x > bx) then Game.SetBlockPos("Block0", x, y -2.5 -1) end end
SetBlockRotation(block, angle)
[require Xmoto >= 0.2.0]
Explicación
Esta función hace rotar los bloques. El bloque ha de ser dinamico (modifica el nivel para conseguir <position x="0" y="0" dynamic="true" />).
Ejemplo de Script
En el ejemplo, si el jugador deja apretada la tecla M, el bloque rotara.
a = 0 function OnLoad() Game.SetKeyHook("M", "PutTheBlock") Game.SetBlockCenter("Block0", 7.5, 7.5) return true end function PutTheBlock() a = a + math.pi / 256.0 Game.SetBlockRotation("Block0", a) end