Los objetivos (quests)
De CursosGpl
Tabla de contenidos |
[editar] Introducción
Los quests o búsquedas (también llamados objetivos en este tutorial) son pequeños scripts de comportamiento que podemos añadir a nuestras entidades para añadirles comportamientos que no requieran ningún control de alto nivel.
Los quests se basan en diferentes estados y secuencias.
Cada estado puede responder a diferentes sensores (triggers) para ejecutar las recompensas (rewards) especificadas.
Los quests pueden recibir parámetros del exterior, de esta forma pueden diseñarse quests genéricos que valgan para distintas situaciones. Estos se especifican poniendo $nombre_de_la_variable en lugar del valor que iría en el xml.
[editar] Estados
Los estados llevan asignado un nombre y pueden ir asociados a diferentes tipos de sensores.
El sensor a su vez lleva asociadas una serie de recompensas (rewards) que son las acciones a llevar a cabo cuando se cumpla la condición del sensor.
[editar] Sensores (triggers)
Se pueden asociar sensores de diferentes tipos y cada uno requiere unos parametros de fireon:
[editar] inventory
sensor que se activa cuando una cierta entidad tiene otra en el inventario
<fireon entity="camera" child_entity="$key_ent" />
[editar] trigger
sensor que se activa al activarse el sensor con el tag correspondiente en la entidad especificada.
<fireon entity="$this" entity_tag="$tag"/>
[editar] meshselect
sensor que se activa cuando la entidad especificada es seleccionada.
<fireon entity="$this" />
[editar] timeout
sensor que se dispara pasado un cierto tiempo.
<fireon timeout="$waittime" />
[editar] Recompensas (rewards)
las recompensas se ejecutan cuando las condiciones de un sensor se cumplen. hay diversos tipos de recompensas y cada una recibe unos parámetros.
[editar] debugprint
imprime mensajes de debugging
<reward type="debugprint" message="Door Closes!" />
[editar] inventory
añade una entidad al inventario de otra
<reward type="inventory" entity="camera" child_entity="$this" />
[editar] newstate
cambia la entidad especificada al estado correspondiente
<reward type="newstate" state="suspended" />
<reward type="newstate" entity="$target_ent" state="$target_state_off" />
[editar] sequence
ejecuta la secuencia especificada en la entidad correspondiente
<reward type="sequence" entity="$target_ent" sequence="$target_op" />
[editar] sequencefinish
termina la ejecución de la secuencia especificada
<reward type="sequencefinish" entity="$this" sequence="opendoor" />
[editar] changeproperty
cambia la propiedad especificada
<reward type="changeproperty" entity="$this" pc="pcportal" tag="portal1" property="cel.property.closed" bool="true" />
<reward type="changeproperty" entity="camera" pc="pclinearmovement" property="cel.property.anchor" string="$this" />
[editar] Ejemplo
<state name="onground">
<trigger type="meshselect">
<fireon entity="$this" />
<reward type="debugprint" message="Mesh picked up!" />
<reward type="inventory" entity="camera" child_entity="$this" />
<reward type="newstate" state="ininventory!" />
</trigger>
</state>
[editar] Secuencias
Una secuencia puede realizar una serie de operaciones a lo largo del tiempo sobre un objeto.
Hay varios tipos de operaciones que pueden realizarse, y cada una lleva unos parámetros:
[editar] Operaciones
[editar] Transform
Para mover un objeto.
Parámetros: v (csVector3d), rotx (float), roty (float), rotz (float)
[editar] Light
Para cambiar el color de una luz
Parámetros: red (float), green (float), blue (float) />
[editar] MovePath
Para mover un objeto a lo largo de un camino definido por una serie de puntos.
Parámetros: varios <pathnode sector="Sector" node="NombreNodo" time="0" />
[editar] Ejemplos
<sequence name="slide_close">
<op type="transform" duration="500" entity="$this">
<v x="2" y="0" z="0" />
</op>
</sequence>
<sequence name="closedoor">
<op type="transform" duration="500" entity="$this">
<roty angle="-1.5" />
</op>
</sequence>
<sequence name="light_off">
<op type="light" entity="$this">
<abscolor red="0" green="0" blue="0" />
</op>
</sequence>
<sequence name="move_Start_Spire">
<op type="movepath" duration="$movetime" entity="$this">
<pathnode sector="Shaft" node="ShaftPStart" time="0" />
<pathnode sector="Shaft" node="ShaftP1" time=".25" />
<pathnode sector="Shaft" node="ShaftP2" time=".50" />
<pathnode sector="Shaft" node="ShaftP3" time=".75" />
<pathnode sector="Shaft" node="ShaftPSpire" time="1" />
</op>
</sequence>
[editar] Ejemplos de Quests
[editar] PickableObject
Quest para un objeto que puede recojerse.
<quest name="PickableObject">
<state name="onground">
<trigger type="meshselect">
<fireon entity="$this" />
<reward type="debugprint" message="Mesh picked up!" />
<reward type="inventory" entity="camera" child_entity="$this" />
<reward type="newstate" state="ininventory!" />
</trigger>
</state>
<state name="ininventory">
</state>
</quest>
[editar] DoorOpen
Quest para una puerta que puede abrirse automáticamente al acercarse a no ser que esté cerrada. Para abrirla es necesario tener un cierto objeto en el inventario.
Parámetros: $key_ent: la entidad que representa la llave. Este parámetro no es necesario si la puerta está siempre cerrada.
<quest name="DoorOpen">
<state name="locked">
<trigger type="trigger">
<fireon entity="$this" />
<reward type="debugprint" message="Door is closed!" />
</trigger>
<trigger type="inventory">
<fireon entity="camera" child_entity="$key_ent" />
<reward type="debugprint" message="The door is unlocked!" />
<reward type="changeproperty" entity="$key_ent" pc="pcbillboard"
property="cel.property.visible" bool="true" />
<reward type="newstate" state="closed" />
</trigger>
</state>
<state name="closed">
<trigger type="trigger">
<fireon entity="$this" />
<reward type="debugprint" message="Door Opens!" />
<reward type="sequencefinish" entity="$this" sequence="closedoor" />
<reward type="sequence" entity="$this" sequence="opendoor" />
<reward type="newstate" state="opened" />
</trigger>
</state>
<state name="opened">
<trigger type="trigger">
<fireon entity="$this" leave="true" />
<reward type="debugprint" message="Door Closes!" />
<reward type="sequencefinish" entity="$this" sequence="opendoor" />
<reward type="sequence" entity="$this" sequence="closedoor" />
<reward type="newstate" state="closed" />
</trigger>
</state>
<sequence name="opendoor">
<op type="transform" duration="500" entity="$this">
<roty angle="1.5" />
</op>
</sequence>
<sequence name="closedoor">
<op type="transform" duration="500" entity="$this">
<roty angle="-1.5" />
</op>
</sequence>
</quest>
[editar] ButtonLight
Quest para una lámpara que puede encenderse y apagarse.
Parámetros:
$onred: color rojo para cuando la luz está encendida
$ongreen: color verde para cuando la luz está encendida.
$onblue: color azul para cuando la luz está encendida
<quest name="ButtonLight">
<state name="none">
</state>
<sequence name="light_on">
<op type="light" entity="$this">
<abscolor red="$onred" green="$ongreen" blue="$onblue" />
</op>
</sequence>
<sequence name="light_off">
<op type="light" entity="$this">
<abscolor red="0" green="0" blue="0" />
</op>
</sequence>
</quest>
[editar] blender2crystal
Los quests se almacenan en la carpeta .blender/scripts/b2cs/templates/quests y se pueden asignar mediante la herramienta de quests (tools->quest tool). Esto crea automáticamente al exportar la clase de propiedad PcQuest en la entidad a la que le hayamos asignado el quest.
Los quests disponibles con el exportador son solo una muestra de lo que se puede llegar a conseguir. Muchas más cosas son posibles con el potente formato de xml de cel.

