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.

Herramientas personales