Es:Scripted levels

From X-Moto
Revision as of 02:08, 28 October 2006 by Trullo (talk | contribs)
Jump to: navigation, search

English - Català

Contents

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">

Scripted level.jpg

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 &lt; y &gt;. 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