/// <summary> /// Crea un partido con todos sus componentes Cancha, Arcos, Jugadores y Pelota /// </summary> /// <param name="alumnoEjemplosMediaDir"> Carpeta donde estan los recursos </param> /// <returns> Un partido listo para comenzar a jugar :)</returns> public Partido CrearPartido(string pathRecursos, TgcD3dInput input, Dictionary<string, TgcStaticSound> sonidos, TgcThirdPersonCamera camara) { string nombreEquipoLocal = "SKTS"; string nombreEquipoVisitante = "TGCV"; Partido partido = Partido.Instance; partido.Sonidos = sonidos; partido.Marcador = this.CrearMarcador(nombreEquipoLocal, nombreEquipoVisitante); partido.Cancha = this.CrearCancha(pathRecursos); partido.ArcoLocal = this.CrearArco(pathRecursos, partido.Cancha, -1); partido.ArcoVisitante = this.CrearArco(pathRecursos, partido.Cancha, 1); partido.Pelota = this.CrearPelota(pathRecursos, partido.Cancha); partido.EquipoLocal = EquipoFactory.Instance.CrearEquipoHumanoIA(nombreEquipoLocal, pathRecursos, input, partido); partido.EquipoVisitante = EquipoFactory.Instance.CrearEquipoIA(nombreEquipoVisitante, pathRecursos, partido); //Creo la pelota con todos sus obstaculos List<IColisionablePelota> obstaculosPelota = new List<IColisionablePelota>(); obstaculosPelota.AddRange(partido.ArcoLocal.GetColisionables()); obstaculosPelota.AddRange(partido.ArcoVisitante.GetColisionables()); obstaculosPelota.Add(partido.Cancha); obstaculosPelota.AddRange(partido.Cancha.LimitesCancha); obstaculosPelota.AddRange(partido.EquipoLocal.JugadoresColisionables()); obstaculosPelota.AddRange(partido.EquipoVisitante.JugadoresColisionables()); partido.Pelota.CollisionManager = new PelotaCollisionManager(obstaculosPelota); //partido.Pelota.CollisionManager = new SphereCollisionManager(obstaculosPelota); //Cargo las colisiones de los jugadores EquipoFactory.Instance.CargarColisionesEquipos(partido.EquipoLocal, partido.EquipoVisitante, partido); partido.Camara = camara; return partido; }
public TgcFpsCamera(TgcD3dInput input) { Input = input; positionEye = new Vector3(); mouseCenter = new Point( D3DDevice.Instance.Device.Viewport.Width / 2, D3DDevice.Instance.Device.Viewport.Height / 2); RotationSpeed = 0.1f; MovementSpeed = 500f; JumpSpeed = 500f; directionView = new Vector3(0, 0, -1); leftrightRot = FastMath.PI_HALF; updownRot = -FastMath.PI / 10.0f; cameraRotation = Matrix.RotationX(updownRot) * Matrix.RotationY(leftrightRot); }
/// <summary> Crea un equipo con un jugador humano y el resto IA</summary> /// <param name="pathRecursos"> De donde saco el mesh</param> /// <param name="input"> Input por teclado</param> /// <param name="pelota"> La pelota del partido</param> /// <returns> Un equipo formado con un humano y el resto IA pero sin colisiones</returns> public Equipo CrearEquipoHumanoIA(string nombre, string pathRecursos, TgcD3dInput input, Partido partido) { List<Jugador> jugadores = new List<Jugador>(); jugadores.Add(this.CrearJugadorIA(pathRecursos, Settings.Default.textureTeam1, new Vector3(0, 1, 30), 45f, partido.Pelota)); jugadores.Add(this.CrearJugadorHumano(pathRecursos, Settings.Default.textureTeam1, new Vector3(-180, 1, -150), 270, partido.Pelota, input)); jugadores.Add(this.CrearJugadorIA(pathRecursos, Settings.Default.textureTeam1, new Vector3(-400, 1, -150), 270f, partido.Pelota)); jugadores.Add(this.CrearJugadorIA(pathRecursos, Settings.Default.textureTeam1, new Vector3(-400, 1, 150), 270f, partido.Pelota)); jugadores.Add(this.CrearArqueroIA(pathRecursos, Settings.Default.textureTeam1, new Vector3(partido.ArcoLocal.Red.GetPosition().X + 60, 1, partido.ArcoLocal.Red.GetPosition().Z), 270f, partido.Pelota)); Equipo equipo = new Equipo(nombre, jugadores, partido.ArcoLocal, partido.ArcoVisitante); foreach (Jugador jugador in equipo.Jugadores) { jugador.EquipoPropio = equipo; } return equipo; }
/// <summary> /// Crea el jugador que hay que manejar manualmente /// </summary> /// <param name="pathRecursos"> De donde saco el mesh</param> /// /// /// <param name="pelota">La pelota del partido</param> /// <returns> El jugador controlado manualmente</returns> private Jugador CrearJugadorHumano(string pathRecursos, string textura, Vector3 posicion, float angulo, Pelota pelota, TgcD3dInput input) { return this.CrearJugador(pathRecursos, textura, posicion, angulo, new JugadorManualStrategy(input), pelota); }
/// <summary> /// Estado: Cuando se esta arrastrando el mouse para armar el cuadro de seleccion /// </summary> private void doSelectingObject() { TgcD3dInput input = GuiController.Instance.D3dInput; //Mantiene el mouse apretado if (input.buttonDown(TgcD3dInput.MouseButtons.BUTTON_LEFT)) { //Definir recuadro Vector2 mousePos = new Vector2(input.Xpos, input.Ypos); Vector2 min = Vector2.Minimize(initMousePos, mousePos); Vector2 max = Vector2.Maximize(initMousePos, mousePos); rectMesh.updateMesh(min, max); } //Solo el mouse else if (input.buttonUp(TgcD3dInput.MouseButtons.BUTTON_LEFT)) { //Definir recuadro Vector2 mousePos = new Vector2(input.Xpos, input.Ypos); Vector2 min = Vector2.Minimize(initMousePos, mousePos); Vector2 max = Vector2.Maximize(initMousePos, mousePos); Rectangle r = new Rectangle((int)min.X, (int)min.Y, (int)(max.X - min.X), (int)(max.Y - min.Y)); //Usar recuadro de seleccion solo si tiene un tamaño minimo if (r.Width > 1 && r.Height > 1) { //Limpiar seleccionar anterior si no estamos agregando en forma aditiva if (!selectiveObjectsAdditive) { clearSelection(); } //Buscar que primitivas caen dentro de la seleccion y elegirlos int i = 0; EditPolyPrimitive p = iteratePrimitive(currentPrimitive, i); while (p != null) { //Ver si hay colision contra la proyeccion de la primitiva y el rectangulo 2D Rectangle primRect; if (p.projectToScreen(mesh.Transform, out primRect)) { if (r.IntersectsWith(primRect)) { //Agregar el objeto en forma aditiva if (selectiveObjectsAdditive) { selectOrRemovePrimitiveIfPresent(p); } //Agregar el objeto en forma simple else { selectPrimitive(p); } } } p = iteratePrimitive(currentPrimitive, ++i); } } //Si el recuadro no tiene tamaño suficiente, hacer seleccion directa else { doDirectSelection(selectiveObjectsAdditive); } currentState = State.SelectObject; /* * //Si quedo algo seleccionado activar gizmo * if (selectionList.Count > 0) * { * activateTranslateGizmo(); * } */ //Actualizar panel de Modify con lo que se haya seleccionado, o lo que no updateUiPanel(); } //Dibujar recuadro rectMesh.render(); }
/// <summary> /// Constructor de la camara a partir de un TgcD3dInput y un positionEye, moveSpeed y jumpSpeed. Los atributos mouseCenter a partir del centro del a pantalla, RotationSpeed 1.0f, /// el directionView (0,0,-1) /// </summary> /// <param name="positionEye"></param> /// <param name="moveSpeed"></param> /// <param name="jumpSpeed"></param> /// <param name="input"></param> public TgcFpsCamera(TGCVector3 positionEye, float moveSpeed, float jumpSpeed, TgcD3dInput input) : this(positionEye, input) { this.MovementSpeed = moveSpeed; this.JumpSpeed = jumpSpeed; }
/// <summary> /// Constructor de la camara a partir de un TgcD3dInput y un positionEye. Los atributos mouseCenter a partir del centro del a pantalla, RotationSpeed 1.0f, /// MovementSpeed y JumpSpeed 500f, el directionView (0,0,-1) /// </summary> /// <param name="positionEye"></param> /// <param name="input"></param> public TgcFpsCamera(TGCVector3 positionEye, TgcD3dInput input) : this(input) { this.positionEye = positionEye; }
public void Update(TgcD3dInput Input, float elapsedTime) { if (ilumnacionActiva == false) { tiempoDesprotegido += elapsedTime; } else { tiempoDesprotegido = 0; } if (ilumnacionActiva) { iluminadorPrincipal.Update(this, elapsedTime); } if (tiempoDesprotegido >= tiempoLimiteDesprotegido) { this.perdio = true; } if (Input.keyPressed(Key.Tab)) { EquiparProximoItem(); } if (Input.keyPressed(Key.N)) { if (visionNocturna) { visionNocturnaActivada = !visionNocturnaActivada; } } if (visionNocturnaActivada) { tiempoDesprotegido = 0; tiempoVisionNocturna += elapsedTime; } if (tiempoVisionNocturna >= tiempoLimiteVisionNocturna) { visionNocturnaActivada = false; } if (Input.keyPressed(Key.R)) { if (itemSelecionadoActivo) { itemSelecionado.desactivar(this); objetoEquipado = true; itemSelecionadoActivo = false; } else { itemSelecionado.accion(this); objetoEquipado = true; itemSelecionadoActivo = true; } } if (Input.keyPressed(Key.G) && pistas.Count != 0) { AbrirAgenda(0); } if (agendaActiva && Input.keyPressed(Key.Space)) { pistaActual = (pistaActual + 1) % pistas.Count; HUD.Instance.seleccionarPaginaActual(pistas[pistaActual]); } if (agendaActiva && Input.keyPressed(Key.Space)) { pistaActual = (pistaActual + 1) % pistas.Count; HUD.Instance.paginaActual = pistas[pistaActual]; GameModel.sonidoNota.play(false); } HUD.Instance.Update(elapsedTime); }
public TgcFpsCamera(Vector3 positionEye, float moveSpeed, float jumpSpeed, TgcD3dInput input) : this(positionEye, input) { MovementSpeed = moveSpeed; JumpSpeed = jumpSpeed; }
public CamaraGod(Vector3 positionEye, float moveSpeed, float jumpSpeed, TgcD3dInput input) : this(positionEye, input) { MovementSpeed = moveSpeed; JumpSpeed = jumpSpeed; }
public CamaraGod(bool lockCam, Vector3 positionEye, TgcD3dInput input) : this(positionEye, input) { LockCam = true; }
public CamaraGod(Vector3 positionEye, TgcD3dInput input) : this(input) { this.positionEye = positionEye; }
public void update(float dt, C_Hoja[] hojas, C_Earth the_earth, C_Earth the_earth2, C_Water water, TgcSkyBox skyBox) { time += dt; TgcD3dInput d3dInput = GuiController.Instance.D3dInput; //gravedad (si no estoy en contacto con algo, caer) if (glued == null) { playMove.Y -= 30f * dt; } else { playMove.Y = 0; } //si estoy en el suelo y BARRA ESPACIADORA => Saltar if (move_able & d3dInput.keyDown(Key.Space) && (glued != null)) { playMove.Y = 30f; sound_b.render(); } //M => Bolquear movimiento if (d3dInput.keyDown(Key.M)) { move_able = !move_able; } //calcular movimiento hacia adelante y costado float moveForward = 0f; float moveLateral = 0f; if (move_able & d3dInput.keyDown(Key.W)) { moveForward = 1f; } if (move_able & d3dInput.keyDown(Key.S)) { moveForward = -1f; } if (move_able & d3dInput.keyDown(Key.A)) { moveLateral = 1f; } if (move_able & d3dInput.keyDown(Key.D)) { moveLateral = -1f; } //rotar camara rotation = 0; if (d3dInput.keyDown(Key.Q)) { rotation = 1; } if (d3dInput.keyDown(Key.E)) { rotation = -1; } //calcular vectores de movimiento, basado en camara playMove.X = playMove.Z = 0f; if (moveLateral != 0 | moveForward != 0) { Vector3 camDir = GuiController.Instance.CurrentCamera.getLookAt() - GuiController.Instance.CurrentCamera.getPosition(); camDir.Y = 0; Vector3 moveDir = Vector3.Normalize(camDir); playMove.X = moveDir.X * moveForward - moveDir.Z * moveLateral; playMove.Z = moveDir.Z * moveForward + moveDir.X * moveLateral; //"normalizar" para tener velocidad maxima float modXZ = (float)Math.Sqrt(playMove.X * playMove.X + playMove.Z * playMove.Z); playMove.X = playMove.X * 75f / modXZ; playMove.Z = playMove.Z * 75f / modXZ; } //si esta en contacto con una hoja, moverse con ella if (glued != null) { if (glued.id == 'h') { C_Hoja h = (C_Hoja)glued; playMove += h.vel; } } Vector3 old_pos = pos; pos += playMove * dt; mesh.BoundingBox.move(playMove * dt); bool collide = false; TgcCollisionUtils.BoxBoxResult result; //si choca contra una cara del skybox, frenarla foreach (TgcMesh face in skyBox.Faces) { result = TgcCollisionUtils.classifyBoxBox(mesh.BoundingBox, face.BoundingBox); if (result == TgcCollisionUtils.BoxBoxResult.Adentro || result == TgcCollisionUtils.BoxBoxResult.Atravesando) { collide = true; break; } } if (collide) { Vector3 dif = old_pos - pos; dif.Y = 0f; pos += dif; mesh.BoundingBox.move(dif); } //cuando esta muriendo, si deja de estar en contacto con agua (la termino de atravesar) resetear if (dieing) { result = TgcCollisionUtils.classifyBoxBox(mesh.BoundingBox, water.BoundingBox()); if (result == TgcCollisionUtils.BoxBoxResult.Atravesando) { sound_c.render(); } if (result != TgcCollisionUtils.BoxBoxResult.Adentro && result != TgcCollisionUtils.BoxBoxResult.Atravesando) { reset(the_earth); } return; } //chequear si sihue en contacto con el objeto con el que estaba en contacto if (glued != null) { result = TgcCollisionUtils.BoxBoxResult.Afuera; if (glued.id == 'e') { C_Earth e = (C_Earth)glued; result = TgcCollisionUtils.classifyBoxBox(mesh.BoundingBox, e.BoundingBox()); } else if (glued.id == 'h') { C_Hoja h = (C_Hoja)glued; result = TgcCollisionUtils.classifyBoxBox(mesh.BoundingBox, h.BoundingBox()); } else if (glued.id == 'w') { C_Water w = (C_Water)glued; result = TgcCollisionUtils.classifyBoxBox(mesh.BoundingBox, w.BoundingBox()); } if (result == TgcCollisionUtils.BoxBoxResult.Encerrando || result == TgcCollisionUtils.BoxBoxResult.Adentro || result == TgcCollisionUtils.BoxBoxResult.Atravesando) { return; } glued = null; } //colisionar con hojas foreach (C_Hoja x in hojas) { result = TgcCollisionUtils.classifyBoxBox(mesh.BoundingBox, x.BoundingBox()); if (result == TgcCollisionUtils.BoxBoxResult.Adentro || result == TgcCollisionUtils.BoxBoxResult.Atravesando) { glued = x; return; } } //colisionar con la tierra result = TgcCollisionUtils.classifyBoxBox(mesh.BoundingBox, the_earth.BoundingBox()); if (result == TgcCollisionUtils.BoxBoxResult.Adentro || result == TgcCollisionUtils.BoxBoxResult.Atravesando) { glued = the_earth; return; } //colisionar con la otra tierra result = TgcCollisionUtils.classifyBoxBox(mesh.BoundingBox, the_earth2.BoundingBox()); if (result == TgcCollisionUtils.BoxBoxResult.Adentro || result == TgcCollisionUtils.BoxBoxResult.Atravesando) { glued = the_earth2; return; } //colisionar con agua result = TgcCollisionUtils.classifyBoxBox(mesh.BoundingBox, water.BoundingBox()); if (result == TgcCollisionUtils.BoxBoxResult.Adentro || result == TgcCollisionUtils.BoxBoxResult.Atravesando) { dieing = true; } return; }
/// <summary> /// Actualizar y dibujar seleccion /// </summary> public void render() { TgcD3dInput input = GuiController.Instance.D3dInput; //Mantiene el mouse apretado if (input.buttonDown(TgcD3dInput.MouseButtons.BUTTON_LEFT)) { //Definir recuadro Vector2 mousePos = new Vector2(input.Xpos, input.Ypos); Vector2 min = Vector2.Minimize(initMousePos, mousePos); Vector2 max = Vector2.Maximize(initMousePos, mousePos); rectMesh.updateMesh(min, max); } //Solo el mouse else if (input.buttonUp(TgcD3dInput.MouseButtons.BUTTON_LEFT)) { //Definir recuadro Vector2 mousePos = new Vector2(input.Xpos, input.Ypos); Vector2 min = Vector2.Minimize(initMousePos, mousePos); Vector2 max = Vector2.Maximize(initMousePos, mousePos); Rectangle r = new Rectangle((int)min.X, (int)min.Y, (int)(max.X - min.X), (int)(max.Y - min.Y)); //Usar recuadro de seleccion solo si tiene un tamaño minimo if (r.Width > 1 && r.Height > 1) { //Limpiar seleccionar anterior si no estamos agregando en forma aditiva if (!selectiveObjectsAdditive) { clearSelection(); } //Buscar que objetos del escenario caen dentro de la seleccion y elegirlos foreach (EditorPrimitive p in control.Meshes) { //Solo los visibles if (p.Visible) { //Ver si hay colision contra la proyeccion del AABB del mesh //Rectangle primRect = MeshCreatorUtils.projectAABB(p.BoundingBox); Rectangle primRect; if (MeshCreatorUtils.projectBoundingBox(p.BoundingBox, out primRect)) { if (r.IntersectsWith(primRect)) { //Agregar el objeto en forma aditiva if (selectiveObjectsAdditive) { selectOrRemoveObjectIfPresent(p); } //Agregar el objeto en forma simple else { selectObject(p); } } } } } } //Si el recuadro no tiene tamaño suficiente, hacer seleccion directa else { doDirectSelection(selectiveObjectsAdditive); } control.CurrentState = MeshCreatorControl.State.SelectObject; //Si quedo algo seleccionado activar gizmo if (control.SelectionList.Count > 0) { activateCurrentGizmo(); } //Actualizar panel de Modify con lo que se haya seleccionado, o lo que no control.updateModifyPanel(); } //Dibujar recuadro rectMesh.render(); }
public Input(TgcD3dInput _keyboard, Joystick _joystick) { this.keyboard = _keyboard; this.joystick = _joystick; }
public CamaraGod(Vector3 positionEye, float moveSpeed, float jumpSpeed, float rotationSpeed, TgcD3dInput input) : this(positionEye, moveSpeed, jumpSpeed, input) { RotationSpeed = rotationSpeed; }
public void Update(TgcD3dInput input) { dynamicsWorld.StepSimulation(1 / 60f, 100); var strength = 10.30f; var angle = 5; var moving = false; #region Comoportamiento if (input.keyDown(Key.W)) { moving = true; //Activa el comportamiento de la simulacion fisica para la capsula capsuleRigidBody.ActivationState = ActivationState.ActiveTag; capsuleRigidBody.AngularVelocity = TGCVector3.Empty.ToBulletVector3(); capsuleRigidBody.ApplyCentralImpulse(-strength * director.ToBulletVector3()); } if (input.keyDown(Key.S)) { moving = true; //Activa el comportamiento de la simulacion fisica para la capsula capsuleRigidBody.ActivationState = ActivationState.ActiveTag; capsuleRigidBody.AngularVelocity = TGCVector3.Empty.ToBulletVector3(); capsuleRigidBody.ApplyCentralImpulse(strength * director.ToBulletVector3()); } if (input.keyDown(Key.A)) { director.TransformCoordinate(TGCMatrix.RotationY(-angle * 0.01f)); personaje.Transform = TGCMatrix.Translation(TGCVector3.Empty) * TGCMatrix.RotationY(-angle * 0.01f) * new TGCMatrix(capsuleRigidBody.InterpolationWorldTransform); capsuleRigidBody.WorldTransform = personaje.Transform.ToBsMatrix; } if (input.keyDown(Key.D)) { director.TransformCoordinate(TGCMatrix.RotationY(angle * 0.01f)); personaje.Transform = TGCMatrix.Translation(TGCVector3.Empty) * TGCMatrix.RotationY(angle * 0.01f) * new TGCMatrix(capsuleRigidBody.InterpolationWorldTransform); capsuleRigidBody.WorldTransform = personaje.Transform.ToBsMatrix; } if (input.keyPressed(Key.Space)) { //Activa el comportamiento de la simulacion fisica para la capsula capsuleRigidBody.ActivationState = ActivationState.ActiveTag; capsuleRigidBody.ApplyCentralImpulse(new TGCVector3(0, 80 * strength, 0).ToBulletVector3()); } #endregion Comoportamiento #region Animacion if (moving) { personaje.playAnimation("Caminando", true); } else { personaje.playAnimation("Parado", true); } #endregion Animacion }
public TgcFpsCamera(Vector3 positionEye, TgcD3dInput input) : this(input) { this.positionEye = positionEye; }
/// <summary> /// Constructor de la camara a partir de un TgcD3dInput y un positionEye, moveSpeed, jumpSpeed y rotationSpeed. Los atributos mouseCenter a partir del centro del a pantalla, /// el directionView (0,0,-1) /// </summary> /// <param name="positionEye"></param> /// <param name="moveSpeed"></param> /// <param name="jumpSpeed"></param> /// <param name="rotationSpeed"></param> /// <param name="input"></param> public TgcFpsCamera(TGCVector3 positionEye, float moveSpeed, float jumpSpeed, float rotationSpeed, TgcD3dInput input) : this(positionEye, moveSpeed, jumpSpeed, input) { this.RotationSpeed = rotationSpeed; }
public TgcFpsCamera(Vector3 positionEye, float moveSpeed, float jumpSpeed, float rotationSpeed, TgcD3dInput input) : this(positionEye, moveSpeed, jumpSpeed, input) { RotationSpeed = rotationSpeed; }
public void Update(TgcD3dInput input, TgcMesh monstruo, TgcMesh monstruoSil) { monstruoMesh = monstruo; monstruoSilueta = monstruoSil; dynamicsWorld.StepSimulation(1 / 60f, 100); #region Comportamiento if (input.keyDown(Key.Space) && ModoCreativo) { //Activa el comportamiento de la simulacion fisica para la capsula personajeBody.ActivationState = ActivationState.ActiveTag; personajeBody.AngularVelocity = TGCVector3.Empty.ToBulletVector3(); personajeBody.ApplyCentralImpulse(strength * 10 * (new TGCVector3(0, 1, 0)).ToBulletVector3()); } if (input.keyDown(Key.W)) { //Activa el comportamiento de la simulacion fisica para la capsula personajeBody.ActivationState = ActivationState.ActiveTag; personajeBody.AngularVelocity = TGCVector3.Empty.ToBulletVector3(); personajeBody.ApplyCentralImpulse(-strength * director.ToBulletVector3()); } if (input.keyUp(Key.W)) { personajeBody.ActivationState = ActivationState.IslandSleeping; } if (input.keyUp(Key.S)) { personajeBody.ActivationState = ActivationState.IslandSleeping; } if (input.keyDown(Key.S)) { //Activa el comportamiento de la simulacion fisica para la capsula personajeBody.ActivationState = ActivationState.ActiveTag; personajeBody.AngularVelocity = TGCVector3.Empty.ToBulletVector3(); personajeBody.ApplyCentralImpulse(strength * director.ToBulletVector3()); } if (input.keyDown(Key.A)) { director.TransformCoordinate(TGCMatrix.RotationY(-angle * rotationStrength)); personaje.Transform = TGCMatrix.Translation(TGCVector3.Empty) * TGCMatrix.RotationY(-angle * rotationStrength) * new TGCMatrix(personajeBody.InterpolationWorldTransform); personajeBody.WorldTransform = personaje.Transform.ToBsMatrix; personaje.RotateY(-angle * rotationStrength); personajeActual.RotarManos(-angle * rotationStrength); monstruo.RotateY(-angle * rotationStrength); monstruoSilueta.RotateY(-angle * rotationStrength); } if (input.keyDown(Key.D)) { director.TransformCoordinate(TGCMatrix.RotationY(angle * rotationStrength)); personaje.Transform = TGCMatrix.Translation(TGCVector3.Empty) * TGCMatrix.RotationY(angle * rotationStrength) * new TGCMatrix(personajeBody.InterpolationWorldTransform); personajeBody.WorldTransform = personaje.Transform.ToBsMatrix; personaje.RotateY(angle * rotationStrength); personajeActual.RotarManos(angle * rotationStrength); monstruo.RotateY(angle * rotationStrength); monstruoSilueta.RotateY(angle * rotationStrength); } #endregion Comportamiento }