/// <summary> /// Renderizar toda la parte cliente, con el manejo de input /// </summary> private void renderClient() { //Calcular proxima posicion de personaje segun Input var moveForward = 0f; float rotate = 0; var moving = false; var rotating = false; //Adelante if (Input.keyDown(Key.W)) { moveForward = -VELODICAD_CAMINAR; moving = true; } //Atras if (Input.keyDown(Key.S)) { moveForward = VELODICAD_CAMINAR; moving = true; } //Derecha if (Input.keyDown(Key.D)) { rotate = VELOCIDAD_ROTACION; rotating = true; } //Izquierda if (Input.keyDown(Key.A)) { rotate = -VELOCIDAD_ROTACION; rotating = true; } //Si hubo rotacion if (rotating) { meshPrincipal.RotateY(Geometry.DegreeToRadian(rotate * ElapsedTime)); this.camaraInterna.rotateY(rotate); } //Si hubo desplazamiento if (moving) { meshPrincipal.MoveOrientedY(moveForward * ElapsedTime); } //Hacer que la camara siga al personaje en su nueva posicion this.camaraInterna.Target = meshPrincipal.Position; //Render piso piso.Render(); //Renderizar meshPrincipal if (meshPrincipal != null) { meshPrincipal.Render(); } //Renderizar otrosMeshes foreach (var entry in otrosMeshes) { entry.Value.Render(); } }
public override void Render() { PreRender(); //Calcular proxima posicion de personaje segun Input var moveForward = 0f; float rotate = 0; var moving = false; var rotating = false; //Adelante if (Input.keyDown(Key.W)) { moveForward = -VELODICAD_CAMINAR; moving = true; } //Atras if (Input.keyDown(Key.S)) { moveForward = VELODICAD_CAMINAR; moving = true; } //Derecha if (Input.keyDown(Key.D)) { rotate = VELOCIDAD_ROTACION; rotating = true; } //Izquierda if (Input.keyDown(Key.A)) { rotate = -VELOCIDAD_ROTACION; rotating = true; } //Si hubo rotacion if (rotating) { //Rotar personaje y la camara, hay que multiplicarlo por el tiempo transcurrido para no atarse a la velocidad el hardware var rotAngle = Geometry.DegreeToRadian(rotate * ElapsedTime); personaje.RotateY(rotAngle); camaraInterna.rotateY(rotAngle); } //Si hubo desplazamiento if (moving) { //Aplicar movimiento hacia adelante o atras segun la orientacion actual del Mesh var lastPos = personaje.Position; personaje.MoveOrientedY(moveForward * ElapsedTime); //Detectar colisiones var collide = false; foreach (var obstaculo in obstaculos) { var result = TgcCollisionUtils.classifyBoxBox(personaje.BoundingBox, obstaculo.BoundingBox); if (result == TgcCollisionUtils.BoxBoxResult.Adentro || result == TgcCollisionUtils.BoxBoxResult.Atravesando) { collide = true; break; } } //Si hubo colision, restaurar la posicion anterior if (collide) { personaje.Position = lastPos; } } //Hacer que la camara siga al personaje en su nueva posicion camaraInterna.Target = personaje.Position; //Render piso piso.Render(); //Render obstaculos foreach (var obstaculo in obstaculos) { obstaculo.Render(); } //Render personaje personaje.Render(); PostRender(); }