45
Paquete Computacional Videojuego MATYA3D Este documento describe los componentes que se utilizan en el videojuego MATYA3D. Se incluye el manual de usuario. Dr. Francisco Madera Ramírez M.C. Luis Ramiro Basto Díaz M.C. Genny Rocío Uicab Ballote M.C. María del Pilar Rosado Ocaña Manual Técnico y Manual de Usuario March 7 2011

Manual Técnico y Manual de Usuario

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Manual Técnico y Manual de Usuario

Paquete Computacional

Videojuego MATYA3D

Este documento describe los componentes que se utilizan en el

videojuego MATYA3D. Se incluye el manual de usuario.

Dr. Francisco Madera Ramírez

M.C. Luis Ramiro Basto Díaz M.C. Genny Rocío Uicab Ballote

M.C. María del Pilar Rosado Ocaña

Manual Técnico y Manual de Usuario

March 7

2011

Page 2: Manual Técnico y Manual de Usuario

1

1. Arquitectura del Videojuego.

Fig1. Arquitectura del Videojuego. Componentes principales del videojuego.

1.1. Componentes del videojuego. La lista de componentes que integran el videojuego es la siguiente.

SkinningSample

SkinnedModelPipeline

SkinnedModel

Menu

MensajeDelJuegoV2

Videojuego

SkinningSample SkinnedModelPipeline SkinnedModel Menu MensajeDelJuegoV2

Page 3: Manual Técnico y Manual de Usuario

2

1.2. Componentes del SkinningSample.

Fig2. Arquitectura del componente SkinningSample. La funcionalidad de estos componentes son

explicados a continuación.

SkinningSample

BaseCamera

Colision

Envoltura

Escenario

Juegos

Juego01

Juego02

Juego03

Juego04

Juego05

Juego06

Juego07

Juego8

Juego09

objDinamico

Pelota

SkinningSample

Page 4: Manual Técnico y Manual de Usuario

3

1.3 Descripción de los Componentes de SkinningSample

1.3.1 Avatar.cs

public void Reset() Reinicia la posición y dirección del avatar.

public void Update(GameTime gameTime, MouseState currentMouseState) Actualiza el movimiento del avatar, y captura eventos de teclado y mouse, para que el usuario mueva el avatar.

1.3.2 BaseCamera.cs Es la cámara principal del videojuego. Su funcionalidad primordial es perseguir al avatar,

“grabando”” todo el mundo tridimensional durante todo el videojuego.

1.3.3 Colision.cs

Private void Colision_Avatar_ModelTzomplantli() Detecta colisión del avatar con el edificio Tzomplantli

{ if (BVBoxModelTzompantli[0].Intersects(BVSphereAvatar)) { Linea = Avatar.Position - Center_BVBoxModelTzompantli[0]; Linea.Normalize(); Avatar.Position += Linea * 0.2f; } else if (BVBoxModelTzompantli[1].Intersects(BVSphereAvatar)) { Linea = Avatar.Position - Center_BVBoxModelTzompantli[1]; Linea.Normalize(); Avatar.Position += Linea * 0.2f; } }

private void Colision_Avatar_ModelAguilas() Detecta colisión del avatar con el edificio águilas. { if (BVBoxModelAguilas.Intersects(BVSphereAvatar)) {

Page 5: Manual Técnico y Manual de Usuario

4

Linea = Avatar.Position - Center_BVBoxModelAguilas; Linea.Normalize(); Avatar.Position += Linea * 0.2f; } }

private void Colision_Avatar_ModelGuerreros() Detecta colisión del avatar con el edificio de guerreros. { if (BVBoxModelGuerreros.Intersects(BVSphereAvatar)) { Linea = Avatar.Position - Center_BVBoxModelGuerreros; Linea.Normalize(); Avatar.Position += Linea * 0.2f; } }

private void Colision_Avatar_ModelVenus() Detecta colisión del avatar con el venus.

{ if (BVBoxModelVenus.Intersects(BVSphereAvatar)) { Linea = Avatar.Position - Center_BVBoxModelVenus; Linea.Normalize(); Avatar.Position += Linea * 0.2f; } }

privatevoidColision_Avatar_ModelMesas() Detecta colisión del avatar con las mesas del cuadrado Mágico.

{ if (BVBoxModelMesas.Intersects(BVSphereAvatar))

{ Linea = Avatar.Position - Center_BVBoxModelMesas; Linea.Normalize(); Avatar.Position += Linea * 0.2f;

Page 6: Manual Técnico y Manual de Usuario

5

} }

private void Colision_Avatar_ModelChinchancob() Detecta la colisión entre el avatar y el edificio chinchancob

{ if (BVBoxModelChinchancob.Intersects(BVSphereAvatar)) { Linea = Avatar.Position - Center_BVBoxModelChinchancob; Linea.Normalize(); Avatar.Position += Linea * 0.2f; } }

privatevoidColision_Avatar_ModelOsario() Detecta la colisión del avatar con el osario. { if (BVBoxModelOsario.Intersects(BVSphereAvatar)) { Linea = Avatar.Position - Center_BVBoxModelOsario; Linea.Normalize(); Avatar.Position += Linea * 0.2f; } }

privatevoidColision_Avatar_ModelObservatorio() Detecta la colisión entre el avatar y el edificio observatorio { if (BVBoxModelObservatorio.Intersects(BVSphereAvatar)) { Linea = Avatar.Position - Center_BVBoxModelObservatorio; Linea.Normalize(); Avatar.Position += Linea * 0.2f; }

}

Page 7: Manual Técnico y Manual de Usuario

6

privatevoidColision_Avatar_ModelMonjas() Detecta la colisión del avatar con el edificio de las monjas { if (BVBoxModelMonjas.Intersects(BVSphereAvatar)) { Linea = Avatar.Position - Center_BVBoxModelMonjas; Linea.Normalize(); Avatar.Position += Linea * 0.2f; } }

privatevoidColision_Avatar_ModelIglesia() Detecta la colisión del avatar con la iglesia. if (BVBoxModelIglesia.Intersects(BVSphereAvatar)) { Linea = Avatar.Position - Center_BVBoxModelIglesia; Linea.Normalize(); Avatar.Position += Linea * 0.2f; }

1.3.4 Envoltura.cs

Esta clase representa las envolturas o cascarones que tienen los modelos 3D en el

videojuego.

public static BoundingSphere LoadModelWithBoundingSphere(ref Matrix[]

modelTransforms, string asset, ContentManager content)

Esta función carga un modelo para un objeto en 3D, es decir crea el modelo de un objeto en 3D

a partir de un cascarón.

public static bool BoXSphereIntersectionTest(BoundingSphere S, BoundingBox A)

Page 8: Manual Técnico y Manual de Usuario

7

Esta función se encarga de detectar si existe colisión entre dos esferas, es decir retorna falso o

verdadero, dependiendo si dos objetos en 3D entraron en contacto o no.

1.3.5 Escenario.cs

partial class SkinningSampleGame

Define todos los modelos que serán dibujados en el videojuego. El modelo del cenote, el templo, el

castillo, las columnas, las mesas etc.

private void InitVerticesCilindro() Inicializa los vértices de todos los cilindros.

private void InitVerticesCilindroSmall()

Inicializa los vértices del cilindro mas pequeño.

private void Draw_Labels_Block(BasicEffect effect, Vector3

Traslada, Texture2D TexturaVertices)

Dibuja los números o etiquetas de los bloques que serán utilizados en el reto del castillo.

private void Draw_Block(Model model, Vector3 Traslada, float RotaEnX, int NumBlock)

Dibuja los bloques que serán utilizados en el reto del castillo.

private void Draw_Model(Model model, Vector3 Traslada,

float Escala)

Dibuja un modelo especifico en el mundo del videojuego

private void Draw_Model_Templo(Model model, Vector3

rota, Vector3 Pos, float escala)

Dibuja el modelo del templo en el videojuego.

Page 9: Manual Técnico y Manual de Usuario

8

1.3.6 ObjDinamico.cs Se encarga de crear aquellos objetos que tienen movimiento en el videojuego Por ejemplo la

princesa y el venado son objetos dinámicos por que todo el tiempo durante el juego se están

moviendo.

1.3.7 Pelota.cs Esta clase Representa la pelota del primer juego. En el constructor de la clase se le pasa como

parámetro un Model EsferaPelota para construir la pelota.

1.3.8 SkinningSample.cs Este módulo representa el componente más importante en el videojuego. Se puede decir que es la

clase principal del videojuego.

privatevoidloadCounters()

Inicializa los contadores de los juegos 4,3,7,8. La función de cada contador esta definido mas abajo

en el documento.

Private void loadMapaDelJuego()

Inicializa el mapa del juego. Este método realiza la función de dibujar el mapa que esta en la esquina

inferior derecha del videojuego.

También se encarga de dibujar o pintar el punto que representa al avatar

Para saber más acerca del mapa, este componente se encuentra descrito en secciones posteriores.

Private void loadMenu()

Carga el menú del juego. El menú es aquella barra que esta en la parte inferior de la

ventana del videojuego y permite elegir cualquier juego.

Private void loadMensajesJuego()

Se encarga de inicializar el gestor de mensajes del videojuego. El gestor o administrador de

mensajes se encuentra descrito en secciones posteriores.

Page 10: Manual Técnico y Manual de Usuario

9

private VertexPositionColor[] InitVerticesRayo() Inicializa los vértices del rayo.

private VertexPositionColor[] InitVerticesLineRayo()

Inicializa los vértices de la línea del rayo

private VertexPositionTexture[] CreateWaterVertices()

Inicializa y crea los vértices del agua.

protected override void Update(GameTime gameTime) Este método actualiza el flujo del videojuego. Se encarga de detectar si el usuario realizo una acción en el videojuego. Si el usuario desencadeno un evento se llama al modulo en cuestión para ejecutar la acción que el usuario requiera. Por ejemplo: Este método detecta si el usuario presiono una tecla determinada, dependiendo de la tecla presionada el videojuego realizará una acción.

protected override void Draw(GameTime gameTime) Dibuja todos los edificios, animaciones, torres, plantas etc. existentes en el videojuego.

1.3.9 Juegos.cs

1.3.9.1 Juego01.cs

privatevoid juego1_mueve_pelota() Este método mueve la pelota del juego 1. Para que la pelota se mueva necesita haber colision.La

colisión es la siguiente.

Si la pelota intersecta con el aro se realiza una anotación.

Pelota.Position += 0.2f * Pelota.Direction;

if (BVaro.Intersects(BVSpherePelota))

{ colision = 0;

Pelota.Position = new Vector3(-22f, 0.15f, 10.0f);

BVSpherePelota.Center = Pelota.Position;

Pelota.Direction = new Vector3(0, 0, 0);

Page 11: Manual Técnico y Manual de Usuario

10

scorejuego1 += 1;

}

privatevoid juego1_colision_Avatar_Pelota() { Mueve la pelota cuando existe colisión con el avatar del videojuego

if (BVSphereAvatar.Intersects(BVSpherePelota) && colision == 0)

{ Rumble = true;

Vector3 C = BVSpherePelota.Center - BVSphereAvatar.Center;

C.Normalize();

Pelota.Position += C / 2;

#region Checa si la pelota esta cerca de algun aro para preparar el enceste

Vector3 direction0 = verticesRayo[1].Position - Pelota.Position;

Vector3 direction1 = verticesRayo1[1].Position - Pelota.Position;

float direction0Long = direction0.Length();

}

1.3.9.2 Juego02.cs

privatevoid IniciaJuego2() Crea las columnas con determinada altura en m2. Para asignarles altura a estas, se

utiliza Random para generar valores al azar.

Random r = new Random(DateTime.Now.Millisecond);

int NumAleatorio;

RandomNumber = r.Next(3); RandomNumber = RandomNumber + 3; //El primer cilindro tendra a lo mas 5 divisiones de 8 NumAleatorio = r.Next(5); alturaCilindro = Dame_Fraccion(NumAleatorio);

private float Dame_Fraccion(int NumAleatorio) De acuerdo al numAleatorio, devuelve un valor, que será la fracción de cada columna float valor;

Page 12: Manual Técnico y Manual de Usuario

11

if (NumAleatorio == 0) valor = 0.25f;

else if (NumAleatorio == 1) valor = 0.5f;

else if (NumAleatorio == 2) valor = 0.75f;

else if (NumAleatorio == 3) valor = 1.0f;

else if (NumAleatorio == 4) valor = 1.25f;

else valor = 1.5f;

return valor;

}

private bool colision_Avatar_Cilindro() Como su nombre lo indica, detecta si ocurrio colisión del avatar con alguna columna. if (BVSphereAvatar.Intersects(BVSphereCilindro)) { Avatar.Position += Avatar.Direction * 0.5f;

bandera = true;

} else if (BVSphereAvatar.Intersects(BVSphereCilindro1)) { Avatar.Position += Avatar.Direction * 0.5f; bandera = true; }

private void juego02_Colision_Cilindro01()

private void juego02_Colision_Cilindro02()

private void juego02_Colision_Cilindro03()

private void juego02_Colision_Cilindro04() Estos métodos detectan si ocurre colisión del avatar con cada cilindro. Si ocurre la colisión el avatar carga el cilindro o la columna. En caso de que ya exista colisión el videojuego actualiza el avatar y el cilindro para determinar si este ya soltó el cilindro. if (!ColisionConCilindro01) { if (!ColisionConCilindro02 && !ColisionConCilindro03 && !ColisionConCilindro04) if (BVSphereAvatar.Intersects(BVSphereCilindro7)) { ColisionConCilindro01 = true; //carga cilindro juego02_Actualiza_Cilindro01(); animationPlayer.StartClip(clip[4]); accion = 4; } }

Page 13: Manual Técnico y Manual de Usuario

12

else //si estas cargando el cilindro { juego02_Actualiza_Cilindro01(); //actualiza sus coordenadas if (currentKeyboardState.IsKeyDown(Keys.Space) || currentGamePadState.Buttons.RightShoulder == ButtonState.Pressed) { if (ColisionConCilindro) //coloca el cilindro encima del cilindro base { animationPlayer.StartClip(clip[0]); accion = 0; //ColisionConCilindro01 = false; juego02_Arriba_Cilindro01(); subeCilindro7 = true; //ConAguaLec01 = false; //ContenidoLec += 100; } else //coloca el cilindro en el piso { //ColisionConCilindro01 = false; agarraCilindro7 = 0.2f; animationPlayer.StartClip(clip[0]); accion = 0; } ColisionConCilindro01 = false; //ahora ya puedes agarrar el cilindro nuevamente Avatar.Position += Avatar.Direction * 0.5f; //el avatar se hace un poco para atras } Rumble = true; } }

1.3.9.3 Juego03.cs

privatevoid IniciaJuego3()

Carga un arreglo de boléanos para mostrar las flores rojas, moradas, amarillas y naranjas. Si

la variable booleana es igual a true, muestra la flor.

El tamaño de cada arreglo, es la cantidad de flores que será desplegado en el cenote.

{ for (int i = 0; i < Numflor1; i++)

flor1Despliega[i] = true;

Page 14: Manual Técnico y Manual de Usuario

13

for (int i = 0; i < Numflor2; i++)

flor2Despliega[i] = true;

for (int i = 0; i < Numflor3; i++)

flor3Despliega[i] = true;

for (int i = 0; i < Numflor4; i++)

flor4Despliega[i] = true;

}

privatebool juego3_colision_Avatar_Cenote() Detecta si existe colision o no del avatar con el cenote.

{ if (BVBoxPared.Intersects(BVSphereAvatar)) { return true; } return false; } }

1.3.9.4 Juego04.cs

privatevoid IniciaJuego4()

En el juego existen 4 lecs o vasos de madera, este método, carga los 4 lecs con sus propios atributos

Lec01 = Content.Load<Model>("Lec/lec");

// Lec01

PelotaLec01 = new Pelota(this, Lec01);

PelotaLec01.Position = v[9];

PelotaLec01.Position.X -= 2;

PelotaLec01.Position.Z -= 3;

PelotaLec01.Position.Y -= 0.3f;

BVSphereLec01 = new BoundingSphere(PelotaLec01.Position, 1);

BVSphereLec01.Radius = 0.25f;

// Lec02

PelotaLec02 = new Pelota(this, Lec01);

PelotaLec02.Position = v[9];

Page 15: Manual Técnico y Manual de Usuario

14

PelotaLec02.Position.X -= 2;

PelotaLec02.Position.Z -= 4.5f;

PelotaLec02.Position.Y -= 0.3f;

BVSphereLec02 = new BoundingSphere(PelotaLec02.Position, 0.25f);

privatevoid juego04_Colision_Lec01()

privatevoid juego04_Colision_Lec02()

privatevoid juego04_Colision_Lec03()

privatevoid juego04_Colision_Lec04()

Estos cuatro métodos, detectan si existe colision o no del avatar con cada uno de los lecs. Por ejemplo el metodo“void juego04_Colision_Lec01()” detecta si el avatar tuvo colision o no con el lec01 o vaso 1.

1.3.1.1 Juego05.cs

privatevoid juego5_Colision_Avatar_Escaleras() Detecta si existe colisión del avatar con las escaleras de la pirámide. Si existe colisión el avatar sube las escaleras o colisiona con las escaleras. privatevoid juego05_Actualiza_Block0() Actualiza el movimiento del block con el avatar, si existe colisión del avatar con el block, el avatar captura el block. privatevoid juego05_Valida_Bordes_Escaleras() Se encarga de hacer que el avatar no se salga por los lados de las escaleras privatevoid juego05_Valida_Limite_Escaleras() Se encarga de validar que el avatar no se de los extremos de las escaleras.

Page 16: Manual Técnico y Manual de Usuario

15

1.3.1.2 Juego06.cs

privatevoid IniciaJuego6() Este método inicia las cuatro piedras existentes en el juego del venado. Cada piedra con sus propias características y atributos. Tambien carga e inicia los cuernos de cada venado. BVSpherePiedra[0] = new BoundingSphere(PelotaLec.Position + new Vector3(-1, 0.1f, -2), 0.2f); BVSpherePiedra[1] = new BoundingSphere(PelotaLec.Position + new Vector3(-2, 0.1f, -2), 0.2f); BVSpherePiedra[2] = new BoundingSphere(PelotaLec.Position + new Vector3(-3, 0.1f, -2), 0.2f); BVSpherePiedra[3] = new BoundingSphere(PelotaLec.Position + new Vector3(-4, 0.1f, -2), 0.2f); BVSpherePiedra[4] = new BoundingSphere(PelotaLec.Position + new Vector3(-5, 0.1f, -2), 0.2f); Random r = new Random(DateTime.Now.Millisecond); //Activalo Cuerno= r.Next(5); //Cuerno = 4; if (Cuerno == 0) { RespCuerno = 3; //es el BV a escoger ListaTextura[0] = 5; ListaTextura[1] = 9; ListaTextura[2] = 3; ListaTextura[3] = 0; ListaTextura[4] = 6; } else if (Cuerno == 1) { RespCuerno = 2; //es el BV a escoger ListaTextura[0] = 4; ListaTextura[1] = 6; ListaTextura[2] = 1; ListaTextura[3] = 2; ListaTextura[4] = 3; } else if (Cuerno == 2) { RespCuerno = 4; //es el BV a escoger ListaTextura[0] = 1; ListaTextura[1] = 7; ListaTextura[2] = 3; ListaTextura[3] = 5; ListaTextura[4] = 2; } private void Colision_Avatar_Piedra(int Num)

Page 17: Manual Técnico y Manual de Usuario

16

Si la variable j es negativa indica que el avatar no esta cargando la piedra, por lo tanto si no estás cargando la piedra, puede existir colisión, tal como se expresa en el condicional if if (j == -1) //si no estás cargando piedra alguna { if (BVSphereAvatar.Intersects(BVSpherePiedra[Num])) { //agarras la piedra ColisionPiedra[Num] = true; animationPlayer.StartClip(clip[5]); accion = 5; } } En caso de que no se cumpla la condicional anterior, quiere decir que estoy cargando la piedra. Por lo tanto si estoy cargando la piedra puede haber la acción de que el avatar suelte la piedra.Tal como lo muestra la condicional “ if (currentKeyboardState.IsKeyDown(Keys.Space) || currentGamePadState.Buttons.RightShoulder == ButtonState.Pressed)” else if (j == Num) { juego6_Actualiza_PiedraBV(Num); if (currentKeyboardState.IsKeyDown(Keys.Space) || currentGamePadState.Buttons.RightShoulder == ButtonState.Pressed) { ColisionPiedra[Num] = false; BVSpherePiedra[Num].Center.Y = PelotaLec.Position.Y + 0.1f; //el avatar en posicion de standby animationPlayer.StartClip(clip[0]); accion = 0; }

1.3.1.3 Juego07.cs

privatevoid IniciaJuego7() Crea los mangos y todos sus atributos, también inicializa el árbol que contiene estos mangos.

private void Aparece_Mango(GameTime gameTime)

Este método se encarga de desaparecer y reaparecer los mangos del árbol. Para realizar esto el método utiliza intervalos de tiempo para aparecer y reaparecer mangos.

Page 18: Manual Técnico y Manual de Usuario

17

1.3.1.4 Juego08.cs

privatevoid IniciaJuego8()

Crea los diamantes y meteoros con todos sus atributos, dirección y ubicación.

privatevoidActualiza_Posicion_Meteoros(GameTimegameTime)

Este método se encarga de mover aleatoriamente los meteoritos.

Para esto utiliza el Random y Time de Windows para mover los meteoritos por todos lados.

1.3.1.5 Juego09.cs

privatevoid IniciaJuego9() Inicia todos los bloques participantes en el juego 9. Cargando un arreglo de varios bloques cada uno con su propia ubicación y demás atributos.

private void juego9_Actualiza_Block(int Num) Va moviendo los bloques que se le indiquen.

privatevoidColision_Avatar_Numero(intNum) Determina o detecta si existe o no colisión del avatar con los bloques. La siguiente condicional se cumple, si el avatar no está cargando el block, por lo tanto, existe la posibilidad de que pueda agarrar el block. Si la siguiente condicional no se cumple, quiere decir que el avatar ya tiene agarrado algún block. En el momento en que se haya agarrado el block se da la situación de que el avatar pueda soltarlo, esto se cumple en la siguiente condicional “ if (currentKeyboardState.IsKeyDown(Keys.Space) || currentGamePadState.Buttons.RightShoulder == ButtonState.Pressed)” if (j==-1) //si no estás cargando algún block { if (BVSphereAvatar.Intersects(BVSphereJuego9[Num])) { //agarras el Block ColisionBlockJuego9[Num] = true; animationPlayer.StartClip(clip[5]); accion = 5; } } else if(j==Num) //si estas cargando el block { juego9_Actualiza_Block(Num);

Page 19: Manual Técnico y Manual de Usuario

18

juego9_Actualiza_BV(Num); //suelta el block if (currentKeyboardState.IsKeyDown(Keys.Space) ||currentGamePadState.Buttons.RightShoulder == ButtonState.Pressed)

{ soundBank.GetCue("colocar piedra").Play();

1.4 Componentes SkinnedModelPipeline

Page 20: Manual Técnico y Manual de Usuario

19

Fig3. Arquitectura del componente SkinningModelPipeline. La funcionalidad de estos componentes son

explicados a continuación.

1.4.1 TypeWriter Para definir como la animación del esqueleto va a ser leído o escrito de un archivo binario, necesitamos

crear un TypeReader y un TypeWriter para cada clase que queramos crear para guardar datos de un

esqueleto.

protected override void Write(ContentWriter output, SkinningData value)

El primer parámetro es usado para escribir datos de objetos en un archivo binario. El segundo

es el objeto que será escrito.

SkinnedModelPipeline

TypeWriter

SkinnedModelProcessor

Page 21: Manual Técnico y Manual de Usuario

20

1.4.2 SkinnedModelProcessor Este módulo se encarga de convertir y guardar datos de un modelo a un modelo leíble

de un archivo para que se pueda ser compilado por XNA. Por ejemplo generar model.xnb del

model.fbx. El processor solo guarda datos de tipo “mesh”,” transformation”,” texture”.

En SkinnedModelProcessor nosotros escribimos un nuevo procesador de contenido.

public override ModelContent Process(NodeContent input, ContentProcessorContext context) Éste método sobrescribe la función Process. Esta función es llamada por el

SkinningModelPipeline.

Esta función necesita realizar lo siguiente.

1. Obtener la raíz del esqueleto // Find the skeleton. BoneContent skeleton = MeshHelper.FindSkeleton(input);

2. Hacer que ModelProcessor pueda Convertir datos de modelos ModelContent model = base.Process(input, context);

3. Validar el skinnedMesh

ValidateSkinnedMesh();

4. Aplicar transformaciones a las geometrías FlattenTransforms(input, skeleton);

5. Construir el Skinning y la animación BuildSkinningData(boneMap)

6. Procesar el modelo con la clase Base ModelContent model= base.Process(input, context);

7. Asociar Skinning y la Animacion al modelo.

Model.Tagg = new Skeleton(boneMap) static void ValidateMesh(NodeContent node, ContentProcessorContext context,string parentBoneName) Esta funcion recursivamente navega todos los nodos y remueve los “mesh” que no contienen datos pesados. Si un hueso tiene uno o mas hijos, esta función regresa false.

Page 22: Manual Técnico y Manual de Usuario

21

static void FlattenTransforms(NodeContent node, BoneContent skeleton) Esta funcion aplica transformaciones a los “meshes”.

Page 23: Manual Técnico y Manual de Usuario

22

1.5 Componentes SkinnedModel

.

Fig4. Arquitectura del componente SkinningModel. La funcionalidad de estos componentes son

explicados a continuación.

1.5.1 TypeReader.cs

1.5.2 SkinningData.cs Construye un nuevo objeto Skinning Data

Combina todos los datos necesarios para renderizar y animar un objeto skinned.

SkinningModel

TypeReaders

SkinningData

KeyFrame

AnimationPlayer

AnimationClip

Page 24: Manual Técnico y Manual de Usuario

23

Construye un Nuevo objeto skinning data. public SkinningData(IDictionary<string, AnimationClip> animationClips, IList<Matrix> bindPose, IList<Matrix> inverseBindPose, IList<int> skeletonHierarchy)

1.5.3 KeyFrame.cs Describe la posición de un hueso en un determinado punto en el tiempo.

Construye un Nuevo objeto keyframe. public Keyframe(int bone, TimeSpan time, Matrix transform) { boneValue = bone; timeValue = time; transformValue = transform; }

1.5.4 AnimationPlayer Se encarga de decodificar en matrices la posición del hueso

a partir de una secuencia de animación o AnimationClip.

public AnimationPlayer(SkinningData skinningData) Construye un nuevo AnimationPlayer public void StartClip(AnimationClip clip) Comienza con la decodificacion del AnimationClip especificado.

public void Update(TimeSpan time, bool relativeToCurrentTime, Matrix rootTransform) { UpdateBoneTransforms(time, relativeToCurrentTime); UpdateWorldTransforms(rootTransform); UpdateSkinTransforms(); }

public void UpdateWorldTransforms(Matrix rootTransform) Usado por el metodo update para refrescar los datos del worldTransforms

public void UpdateSkinTransforms()

Page 25: Manual Técnico y Manual de Usuario

24

Usado por el método update para refrescar los datos de SkinTransforms.

public void UpdateBoneTransforms(TimeSpan time, bool relativeToCurrentTime)

Usado por el metodo Update para refrescar los datos del BoneTransforms.

1.5.5 AnimationClip Es el equivalente en tiempo de ejecución del AnimationContentType Mantiene todos los keyframes necesarios para describir una animación simple.

Page 26: Manual Técnico y Manual de Usuario

25

1.6 Componentes Menu.

Fig5. Arquitectura del componente Menu. La funcionalidad de estos componentes son explicados a

continuación.

Menu Menu.cs

Page 27: Manual Técnico y Manual de Usuario

26

1.6.1 Menu.cs Es el componente principal del Menú, que se encarga de proveer todas las funcionalidades

del menú del juego.

La siguiente lista es un conjunto de texturas utilizadas para pintar los nueve iconos del juego. private Texture2D juego1; private Texture2D juego2; private Texture2D juego3; private Texture2D juego4; private Texture2D juego5; private Texture2D juego6; private Texture2D juego7; private Texture2D juego8;

private Texture2D juego9; Variable booleana que indica si el avatar esta en movimiento o no.

private Boolean isAvatarEnMovimiento; private Texture2D texturaMenu; La imagen del menú.

Numero de elementos que tiene este menú por el momento existen 9 elementos. private int number_elements;

El element_active indica que elemento del menu esta elegido. Si por ejemplo element_active=2, quiere decir que el juego 2 esta activado. private int element_active = 0;

Esta función se utiliza para preguntar al menú, si el usuario Presiono la tecla para evaluar el juego. public Boolean haElegidoEvaluar() { return userEligioEvaluar;

}

Page 28: Manual Técnico y Manual de Usuario

27

Regresa el elemento active que eligio el usuario a la hora de q cambiar de juego a traves del menu.

public int obtenerCualEligio() {

Éste método se encarga de cargar los elementos del menú. public void AddElement(int element_number, string element_name) {

if ((element_number > -1) && (element_number < number_elements)) { elements[element_number] = element_name; } }

Este método se encargar poner activo un determinado elemento del menú a través del juego

que elija el usuario.

public void setIdJuego(int idJuego) {

Page 29: Manual Técnico y Manual de Usuario

28

1.7 Componente Mapa (MapaDelJuegoV2).

Fig. Representa los módulos que integran el componente “Mapa”.

Los módulos son descritos a continuación.

Mapa

UbicacionAvatarEnMapaChico

PuntoDeActividad

PropiedadesMapa

MapaAdministrador

Mensajes

MensajeJuego

AdministradorMensajes

CounterGame3

CounterGame4

CounterGame7

CounterGame8

Page 30: Manual Técnico y Manual de Usuario

29

UbicaciónAvatarEnMapaChico.cs Su función principal es ubicar el avatar en el mapa del juego. Para ubicarlo necesita un vector3 del avatar en el juego. Esta función ubica el avatar en el mapa de acuerdo al juego que se este jugando. privatevoidcargarPuntoDeAcuerdoAJuego(intidJuego){ } Este método se encarga de detectar si el avatar del juego ha sido movido. Movido por el usuario. Tiene dos condicionales, la primera detecta si el avatar se ha movido hacia adelante, la otra condicional detecta si el usuario movió o caminó hacia atrás el avatar. Public void movingPuntoEnMapa(Vector3 positionTemporal){ ///Este una condicional que detecta si el avatar ha sido movido por el usuario if (positionOrigenAvatar.Z > positionTemporal.Z) {} else if (positionOrigenAvatar.Z<positionTemporal.Z) {}

PuntoDeActividad.cs Un punto de actividad es todo punto que se muestra en el mapa, tiene color, idActividad,y prendido. El color del punto, es el color que va a tener el punto en el juego. El idActividad, es la actividad a la que pertenece ese punto, en total hay 9 actividades en este juego. El atributo prendido, se utiliza para saber si el punto debe ser prendido o no en el mapa. Private void controlarColor(){} Este método se utiliza para hacer cambiar de color de algún punto. Cambiar de verde a amarillo, amarillo a verde, así sucesivamente.

PropiedadesMapa.cs Es una clase que maneja la configuración de la imagen2D que se utiliza en el mapa.

Page 31: Manual Técnico y Manual de Usuario

30

MapaAdministrador.cs Es la clase principal que se encarga de manejar todo lo relacionado con el mapa. Crea el mapa con sus

propiedades, lo pinta, y lo actualiza; También maneja un arreglo de PuntoDeActividad, lo inicializa y lo

mantiene.

publicPuntoDeActividadinicializarActividad(intidActividad) {}

Este método se encarga de devolver un puntoDeActividad del arreglo, con base a un idActividad

public void pintarActividades() {

Este método se encarga de pintar todos los puntos de actividad del arreglo.

foreach(PuntoDeActividad punto in actividades){

punto.pintarPunto();

} }

public void apagarPunto(int idActividad){

Este método se encarga de apagar un punto de actividad, esto hace que el punto sea invisible en el

mapa

PuntoDeActividad punto= actividades.ElementAt<PuntoDeActividad>(idActividad - 1);

punto.apagarPunto(); }

publicvoidprenderPunto(intidActividad){}

Este método se encarga de apagar un punto, utilizando como parámetro el idActividad.

CounterGame3 En el momento en el que el usuario, captura flores del cenote, esta clase interviene en esta

funcionalidad. CounterGame3 es una clase que cuenta las flores que el usuario ha capturado del cenote.

private int Flor1, private int Flor2, private int Flor3 private int Flor4;

Page 32: Manual Técnico y Manual de Usuario

31

son variables que almacenan la cantidad de flores que el usuario ha capturado.

Si Flor1= 3, indica que el usuario ya capturo 3 flores amarillas

Si Flor2= 4, indica que el usuario ya capturo 4 flores moradas

Si Flor3= 1, indica que el usuario ya capturo 1 flor naranja

Si Flor4= 3, indica que el usuario ya capturo 3 flores rojas

Este método incrementa en uno el valor de las variables Flor. Es importante saber que este método se

llama, cada vez que el usuario ha capturado una flor amarilla.

public void incrementaFlor1() {

Flor1++; }

Se encarga de pintar la cantidad total de flores amarillas que ha capturado el usuario

public void pintaFlor1() {

SpriteBatch sprite = (SpriteBatch)game.Services.GetService(typeof(SpriteBatch));

Texture2D texturaPelota = game.Content.Load<Texture2D>("Lec/Flor1");

Rectangle rectanglePelota = new Rectangle(0, 200, 40, 40);

Rectangle rectangle2 = rectanglePelota;

for (int index = 0; index < Flor1; index++)

{

sprite.Draw(texturaPelota, rectanglePelota, Color.White);

rectanglePelota.X += 50;

}

rectanglePelota = rectangle2;

}

Asigna a cero todas las variables.

CounterGame4 En el momento en el que el usuario ha llenado su vaso de agua y lo ha vaciado en el recipiente, esta

clase interviene en esta funcionalidad. CounterGame4 es una clase que cuenta los vasos que el usuario

ha vaciado en el recipiente.

Tiene 3 atributos: privateint cantidadContenido1, privateint cantidadContenido2, privateint

cantidadContenido3;

Page 33: Manual Técnico y Manual de Usuario

32

cantidadContenido1 indica la cantidad de vasos de 100ml que han sido vaciados por el usuario

cantidadContenido2 indica la cantidad de vasos de 20ml que han sido vaciados por el usuario

cantidadContenido3 indica la cantidad de vasos de 1ml que han sido vaciados por el usuario.

Estas variables se incrementan en uno cada vez que el usuario vacia un vaso de agua.

Para incrementar estas variables se utiliza lo siguiente.

public void incrementContenidoLec100() {

this.cantidadContenido1++;

}

public void incrementContenidoLec20() {

this.cantidadContenido2++;

}

public void incrementContenidoLec1() {

this.cantidadContenido3++;

}

En pantalla aparecen todos los vasos de agua que ha vaciado. Para realizar lo anterior se utilizan los

siguientes tres métodos.

private void pintarVaso100() {

SpriteBatch sprite = (SpriteBatch)game.Services.GetService(typeof(SpriteBatch));

Texture2D texturaPelota = game.Content.Load<Texture2D>("Lec/Vaso100");

Rectangle rectanglePelota = new Rectangle(0, 200, 50, 50);

Rectangle rectangle2 = rectanglePelota;

for (int index = 0; index < cantidadContenido1; index++) {

sprite.Draw(texturaPelota, rectanglePelota, Color.White);

rectanglePelota.X += 60;

}

rectanglePelota = rectangle2; }

privatevoid pintarVaso20() {

SpriteBatch sprite = (SpriteBatch)game.Services.GetService(typeof(SpriteBatch));

Texture2D texturaPelota = game.Content.Load<Texture2D>("Lec/Vaso20");

Rectangle rectanglePelota = new Rectangle(0, 250, 40, 40);

Rectangle rectangle2 = rectanglePelota;

for (int index = 0; index < cantidadContenido2; index++) {

sprite.Draw(texturaPelota, rectanglePelota, Color.White);

rectanglePelota.X += 40;

Page 34: Manual Técnico y Manual de Usuario

33

}

rectanglePelota = rectangle2;

}

privatevoid pintarVaso1() {

SpriteBatch sprite = (SpriteBatch)game.Services.GetService(typeof(SpriteBatch));

Texture2D texturaPelota = game.Content.Load<Texture2D>("Lec/Vaso1");

Rectangle rectanglePelota = new Rectangle(0, 300, 30, 30);

Rectangle rectangle2 = rectanglePelota;

for (int index = 0; index < cantidadContenido3; index++) {

sprite.Draw(texturaPelota, rectanglePelota, Color.White);

rectanglePelota.X += 30;

}

rectanglePelota = rectangle2;

}

CounterGame7 Se encarga de contar la cantidad total de mangos que el usuario ha desprendido del árbol con su

resortera.

Int mangosAgarrados, esta variable almacena la cantidad de mangos que ha desprendido el usuario con

su resortera.

Cuando el usuario golpea un mango, se incrementa en uno la variable mangosAgarrados, para realizar lo

anterior se utiliza lo siguiente:

public void incrementaMangoAgarrado() {

mangosAgarrados++; }

El siguiente método se encarga de pintar todos los mangos que han sido golpeados por la resortera del

usuario.

public void pintaMangos()

SpriteBatch sprite = (SpriteBatch)game.Services.GetService(typeof(SpriteBatch));

Texture2D texturaPelota = game.Content.Load<Texture2D>("Lec/mango2D");

Rectangle rectanglePelota = new Rectangle(0, 200, 40, 40);

Rectangle rectangle2 = rectanglePelota;

for (int index = 0; index < mangosAgarrados; index++)

{

sprite.Draw(texturaPelota, rectanglePelota, Color.White);

rectanglePelota.X += 50;

}

rectanglePelota = rectangle2;

Page 35: Manual Técnico y Manual de Usuario

34

}

CounterGame8 Se encarga de almacenar y mostrar todas las gemas o joyas que el usuario ha capturado.

int gemasAgarradas; Esta variable se encarga de almacenar la cantidad de gemas que ha capturado

el usuario.

Cuando el usuario captura una nueva gema, la variable gemasAgarradas se incrementa en uno, para

realizar lo anterior se utiliza lo siguiente:

public void incrementaMangoAgarrado() {

gemasAgarradas++;

}

El siguiente método se encarga de pintar todas las gemas que han sido capturadas por el usuario.

public void pintaGemas() {

SpriteBatch sprite = (SpriteBatch)game.Services.GetService(typeof(SpriteBatch));

Texture2D texturaPelota = game.Content.Load<Texture2D>("Lec/gema2D");

Rectangle rectanglePelota = new Rectangle(0, 200, 40, 40);

Rectangle rectangle2 = rectanglePelota;

for (int index = 0; index < gemasAgarradas; index++) {

sprite.Draw(texturaPelota, rectanglePelota, Color.White);

rectanglePelota.X += 50;

}

rectanglePelota = rectangle2;

}

MensajeJuego.cs Clase que representa los atributos de los mensajes en 2D que se presentan en el juego.

Las variables o atributos principales de esta clase son los siguientes.

privateRectanglerectangle: rectángulo que se utiliza para pintar el mensaje.

Page 36: Manual Técnico y Manual de Usuario

35

bool pintarEnPantalla: un variable booleana que indica si el mensaje debe ser pintado o no en pantalla.

bool activado: una variable booleana que indica si el mensaje está activado o no. Si el mensaje esta

desactivado, el mensaje nunca se pintará en pantalla.

Para pintar los mensajes se utiliza la siguiente funcionalidad.

public void pintarMensaje() {

if (activado)

sprite.Draw(texture, rectangle, Color.AliceBlue);

}

AdministradorMensajes.cs Es la clase principal que se encarga de poner o quitar en pantalla los mensajes existentes en el juego.

Para controlar todos los mensajes del juego, esta clase tiene como atributo un arreglo o lista de

mensajes:

private List<MensajeJuego> listaMensajes;

El siguiente método se encarga de pintar los mensajes de acuerdo a la variable” juego”.

public void pintarMensajes(SpriteBatch batch, int juego,int scoreJuego){}

Page 37: Manual Técnico y Manual de Usuario

36

MATYA3D

Manual de Usuario

Page 38: Manual Técnico y Manual de Usuario

37

Historia

Cuenta la leyenda que Tséem Took, quien profesaba la medicina, se enamoró de X Koh Mukúuy, la princesa

de Chichen Itzá. El rey Kay le indicó a Tséem Took que para poder otorgar la mano de X koh Mukúuy le

hiciera a ella un presente que llamara la atención de todos los cortesanos. Por lo que Tséem Took va en

busca del obsequio.

Controles del juego

Controles para computadora

← → - Girar a la derecha y

girar a la izquierda

A – Mostar u ocultar menú principal

Esc – Salir del juego

Barra espaciadora – Usar objeto

↑↓ - Avanzar y retroceder

Page 39: Manual Técnico y Manual de Usuario

38

1

2

3 4

Controles para Xbox

Pantalla principal

1. Mensajes

En esta sección se presenta de manera textual las instrucciones de cada reto a lo largo del juego.

2. Porcentaje del reto

En esta sección se presenta el porcentaje de avance en cada reto, éste cambia dependiendo del

reto que se esté cursando.

3. Menú

En el menú principal del juego, se podrá cambiar de reto o evaluar el avance del reto actual.

4. Mapa

Se presenta un mapa de todo el escenario y se indica la posición del jugador en el mapa, al igual

que la posición donde se deberá realizar el reto en curso.

RB - Usar objeto

Right stick - Movimientos del

personaje (avanzar, retroceder, girar

a la derecha, girar a la izquierda) A – Mostar u ocultar

menú principal

Page 40: Manual Técnico y Manual de Usuario

39

Personajes

X Koh Mukúuy

Hija del rey Kay gobernador de Chichen Itzá.

Tséem Took

Joven enamorado, habitante de Chichen Itzá que

profesaba la medicina.

Objetos

Vaso

Objeto utilizado en uno de los retos para cargar agua.

Pelota

Utilizada en un reto para el juego de pelota maya.

Page 41: Manual Técnico y Manual de Usuario

40

Gema

Pieza faltante del collar.

Collar

Este objeto es el presente que el joven deberá llevarle a la princesa.

Tirahule

Este objeto es utilizado en uno de los retos para recolectar mangos.

Mango

Este objeto es utilizado en uno de los retos y es necesario recolectar cierta cantidad de ellos para

completar el reto.

Flor

Este objeto es utilizado en uno de los retos y es necesario recolectar cierta cantidad de ellos para

completar el reto.

Page 42: Manual Técnico y Manual de Usuario

41

Retos

Reto 1

El juego de pelota

En este reto el jugador deberá encestar la pelota 5 veces en los aros del área de juego, el cual es señalado en

el mapa.

Reto 2

Construcción de columnas

En este reto el jugador deberá construir una columna del mismo tamaño que las demás.

Reto 3

Page 43: Manual Técnico y Manual de Usuario

42

Agrupando flores

En este reto el jugador deberá recolectas las flores que se le piden así como la cantidad exacta de cada una

de éstas, las cuales se encuentran en el cenote que señala el mapa.

Reto 4

Llenando recipiente

En este reto el jugador deberá de llenar con agua, un recipiente con la cantidad indicada en milímetros, para

esto el jugador deberá de utilizar recipientes más pequeños y llenarlos con agua del cenote.

Reto 5

Calculando la edad del venado

En este reto el jugador deberá calcular la edad del venado, para esto deberá prestar atención a las

instrucciones del reto.

Page 44: Manual Técnico y Manual de Usuario

43

Reto 6

Bajando mangos

En este reto el jugador deberá de recolectar la cantidad de mangos que se le pide, los cuales se encuentran

en la cima de los arboles, para esto deberá de utilizar un tirahule y su destreza.

Reto 7

Las gemas del collar

En este reto el jugador deberá de encontrar y recolectar las gemas faltantes para el collar que llevará a la

princesa.

Reto 8

Page 45: Manual Técnico y Manual de Usuario

44

El cubo mágico

En este reto el jugador deberá de resolver el cubo mágico utilizando los números disponibles.

Reto 9

Subiendo al castillo

En este último reto el jugador deberá de subir hasta la parte más alta del castillo principal para alcanzar a la

princesa y para lograrlo deberá de colocar los bloques adecuados en los espacios vacíos de los escalones.