Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
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
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
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
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)) {
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;
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; }
}
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)
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.
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.
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);
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;
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; } }
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;
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];
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.
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)
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.
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);
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
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
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.
21
static void FlattenTransforms(NodeContent node, BoneContent skeleton) Esta funcion aplica transformaciones a los “meshes”.
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
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()
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.
25
1.6 Componentes Menu.
Fig5. Arquitectura del componente Menu. La funcionalidad de estos componentes son explicados a
continuación.
Menu Menu.cs
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;
}
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) {
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
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.
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;
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;
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;
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;
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.
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){}
36
MATYA3D
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
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
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.
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.
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
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.
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
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.