public void Update(GameTime gameTime) { secondsSinceBirth += (float)gameTime.ElapsedGameTime.TotalSeconds; totalHeight = force * secondsSinceBirth * MathHelper.ToDegrees((float)Math.Sin(MathHelper.ToRadians(dirAngle))) - (gravity / 2f) * (float)Math.Pow(secondsSinceBirth, 2f); pos.X -= dirH.X * hSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds * MathHelper.ToDegrees((float)Math.Cos(MathHelper.ToRadians(dirAngle))); pos.Z -= dirH.Z * hSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds * MathHelper.ToDegrees((float)Math.Cos(MathHelper.ToRadians(dirAngle))); pos.Y += totalHeight - prevHeight; prevHeight = totalHeight; worldMatrix = Matrix.CreateTranslation(pos); model.Root.Transform = scaleMatrix * worldMatrix; model.CopyAbsoluteBoneTransformsTo(boneTransforms); if (pos.X < ground.vertices[0].Position.X || pos.Z <ground.vertices[0].Position.Z || pos.X> ground.vertices[ground.vertices.Length - 1].Position.X || pos.Z > ground.vertices[ground.vertices.Length - 1].Position.Z) { dead = true; return; } Vector3[] vectors = ground.GetVerticesFromXZ((int)pos.X, (int)pos.Z); // float YA = vectors[0].Y; // float YB = vectors[1].Y; // float YC = vectors[2].Y; // float YD = vectors[3].Y; //Interpolação e calculo da posição no eixo do Y do tank float YAB = ((((int)pos.Z + 1) - pos.Z) * YA + (pos.Z - (int)pos.Z) * YB); // float YCD = ((((int)pos.Z + 1) - pos.Z) * YC + (pos.Z - (int)pos.Z) * YD); // if (pos.Y <= ((((int)pos.X + 1) - pos.X) * YAB + (pos.X - ((int)pos.X)) * YCD) || secondsSinceBirth >= 10) { dead = true; } }
public void Update(KeyboardState keyboard, MouseState mouse, GameTime gameTime, Tank tank1) { if (keyboard.IsKeyDown(Keys.F3)) { mode = PlayerMode.CameraSurfaceFollow; Mouse.SetPosition(this.graphicsDevice.Viewport.Width / 2, this.graphicsDevice.Viewport.Height / 2); } if (keyboard.IsKeyDown(Keys.F2)) { mode = PlayerMode.CameraFree; Mouse.SetPosition(this.graphicsDevice.Viewport.Width / 2, this.graphicsDevice.Viewport.Height / 2); } if (keyboard.IsKeyDown(Keys.F1)) { mode = PlayerMode.CameraTank; } if (mode == PlayerMode.CameraSurfaceFollow) { int centroX = graphicsDevice.Viewport.Width / 2; int centroY = graphicsDevice.Viewport.Height / 2; int deltaX = mouse.X - centroX; int deltaY = mouse.Y - centroY; yaw = yaw - deltaX * escalaRadianosPorPixel; pitch = pitch + deltaY * escalaRadianosPorPixel; pitch = MathHelper.Clamp(pitch, -1, 1); Matrix rotacao = Matrix.CreateFromYawPitchRoll(yaw, pitch, 0); Vector3 dir = Vector3.Transform(-Vector3.UnitZ, rotacao); Vector3 right = Vector3.Cross(dir, Vector3.Up); if (keyboard.IsKeyDown(Keys.NumPad8)) // { // pos = pos + dir * cameraSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds; // } // if (keyboard.IsKeyDown(Keys.NumPad5)) // { // pos = pos - dir * cameraSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds; // } // Controlo de movimento da camara if (keyboard.IsKeyDown(Keys.NumPad4)) // { // pos = pos - right * cameraSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds; // } // if (keyboard.IsKeyDown(Keys.NumPad6)) { // pos = pos + right * cameraSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds; // } if (pos.X < terreno.vertices[0].Position.X) // { pos.X = terreno.vertices[0].Position.X; // } if (pos.Z < terreno.vertices[0].Position.Z) // { pos.Z = terreno.vertices[0].Position.Z; // Mantém a camara dentro dos limites do terreno } if (pos.X > terreno.vertices[terreno.vertices.Length - 1].Position.X) // { pos.X = terreno.vertices[terreno.vertices.Length - 1].Position.X - 0.0001f; // } if (pos.Z > terreno.vertices[terreno.vertices.Length - 1].Position.Z) // { pos.Z = terreno.vertices[terreno.vertices.Length - 1].Position.Z - 0.0001f; // } Vector3[] vectors = terreno.GetVerticesFromXZ((int)pos.X, (int)pos.Z); // Vai buscar os vetores que circulam a camara float YA = vectors[0].Y; // float YB = vectors[1].Y; // Posição Y de cada vetor float YC = vectors[2].Y; // float YD = vectors[3].Y; // float YAB = ((((int)pos.Z + 1) - pos.Z) * YA + (pos.Z - (int)pos.Z) * YB); // Interpolação do Y entre A e B float YCD = ((((int)pos.Z + 1) - pos.Z) * YC + (pos.Z - (int)pos.Z) * YD); // Interpolação do Y entre C e D pos.Y = ((((int)pos.X + 1) - pos.X) * YAB + (pos.X - ((int)pos.X)) * YCD) + 2f; // Interpolação final para encontrar novo Y da camara, adicionando 2 à altura para não haver clipping target = pos + dir; // Atualiza o target viewMatrix = Matrix.CreateLookAt(pos, target, Vector3.Up); // Atualiza a viewMatrix Mouse.SetPosition(centroX, centroY); // Coloca o cursor no centro do ecrã } if (mode == PlayerMode.CameraFree) { //primeira coisa a ver é quanto o rato andou , mas apenas sabemos a posição dele, podemos tambem no fim da frame o rato sempre a meio da janela portanto prendemos o rato a meio da janela //neste caso o rato não mexe por isso usamos o device int centroX = graphicsDevice.Viewport.Width / 2; int centroY = graphicsDevice.Viewport.Height / 2; int deltaX = mouse.X - centroX;//é a nova posição do x - o centro do x yaw = yaw - deltaX * escalaRadianosPorPixel; int deltaY = mouse.Y - centroY; pitch -= deltaY * escalaRadianosPorPixel; pitch = MathHelper.Clamp(pitch, -1, 1); Matrix rotacao = Matrix.CreateFromYawPitchRoll(yaw, pitch, 0); //criar uma rotação Vector3 dir = Vector3.Transform(Vector3.UnitZ /*é um vetor base ,direção inicial olhar para frente*/, rotacao /*vetor rotação*/); //transformar vetor base(naão a yaw nem pitch) com a rotação Vector3 right = Vector3.Cross(dir, Vector3.Up); //cross do vetor que estamos a andar com a vertical //atualização da posição target = pos + dir; this.viewMatrix = Matrix.CreateLookAt(pos, target, Vector3.Up); Mouse.SetPosition(centroX, centroY); float vel = 30; if (keyboard.IsKeyDown(Keys.NumPad8)) { pos = pos + dir * vel * (float)gameTime.ElapsedGameTime.TotalSeconds; } if (keyboard.IsKeyDown(Keys.NumPad5)) { pos = pos - dir * vel * (float)gameTime.ElapsedGameTime.TotalSeconds; } if (keyboard.IsKeyDown(Keys.NumPad4)) { pos = pos - right * vel * (float)gameTime.ElapsedGameTime.TotalSeconds; } if (keyboard.IsKeyDown(Keys.NumPad6)) { pos = pos + right * vel * (float)gameTime.ElapsedGameTime.TotalSeconds; } if (keyboard.IsKeyDown(Keys.NumPad7)) { pos.Y += 0.5f; } if (keyboard.IsKeyDown(Keys.NumPad1)) { pos.Y -= 0.5f; } } if (mode == PlayerMode.CameraTank) { Vector3 cameraTarget = tank1.pos + tank1.dir + new Vector3(0, 3, 0); //target da camara calculado com posição e direção do tank e somado um vector3 para não olhar demasiado para baixo pos = tank1.pos - Vector3.Normalize(tank1.rotation.Backward) * 3f + new Vector3(0, 4, 0); //posição da camara calculado com posição da camara e vetor de tras da rotação da mesma, sendo somado um vector3 para a camara nao estar dentro do tank viewMatrix = Matrix.CreateLookAt(pos, cameraTarget, Vector3.Up); //atualização da viewMatrix } }