public virtual void UpdatePhysics(float elapsed_time) { colission = false; on_ground = false; on_door = false; Vector3 dir = Position - PrevPosition; if (dir.LengthSquared() > 0) { dir.Normalize(); float s = scene.intersectSegment(PrevPosition, PrevPosition + dir * 50, out ip_data ip0); if (s < 1000) { var n = scene.g_faces[ip0.nro_face].nro_modelo; on_door = n >= 0 && (scene.modelos[n].flags & CBspFile.PROP_DOOR_ROTATING) != 0; // abro la puerta if (on_door) { scene.modelos[n].angles.Y += 0.1f; } else { Position = PrevPosition; colission = true; } } } /* * // performacne * float xxx = 0; * for (var i = 0; i < 2000; ++i) * { * xxx += scene.intersectSegment(Position, Position - new Vector3(0, 100, 0)); * } */ float t = scene.intersectSegment(Position, Position - new Vector3(0, 100, 0), out ip_data ip1); if (t < 100) { // toca piso Position.Y -= t * 100 - Height / 2; on_ground = true; speed = 0; } else { // esta en el aire speed += elapsed_time * 386.0f; Position.Y -= elapsed_time * speed; } }
public void UpdateGame(GameTime gameTime) { float elapsed_time = (float)gameTime.ElapsedGameTime.TotalSeconds; var keyState = Keyboard.GetState(); if (keyState.IsKeyDown(Keys.Escape)) { Exit(); //Salgo del juego. } weapon.Update(elapsed_time); MouseState state = Mouse.GetState(); if (keyState.IsKeyDown(Keys.Space)) { if (!keyDown[(int)Keys.Space]) { fisica = !fisica; } keyDown[(int)Keys.Space] = true; } else { keyDown[(int)Keys.Space] = false; } if (keyState.IsKeyDown(Keys.T)) { if (!keyDown[(int)Keys.T]) { scene.mostrar_tools = !scene.mostrar_tools; } keyDown[(int)Keys.T] = true; } else { keyDown[(int)Keys.T] = false; } // capturar mouse if (keyState.IsKeyDown(Keys.M)) { if (!keyDown[(int)Keys.M]) { mouse_captured = !mouse_captured; } keyDown[(int)Keys.M] = true; IsMouseVisible = !mouse_captured; } else { keyDown[(int)Keys.M] = false; } // dibujar hitpoints if (keyState.IsKeyDown(Keys.H)) { if (!keyDown[(int)Keys.H]) { draw_hitpoints = !draw_hitpoints; } keyDown[(int)Keys.H] = true; } else { keyDown[(int)Keys.H] = false; } // dibujar mesh info if (keyState.IsKeyDown(Keys.I)) { if (!keyDown[(int)Keys.I]) { draw_meshinfo = !draw_meshinfo; } keyDown[(int)Keys.I] = true; } else { keyDown[(int)Keys.I] = false; } if (keyState.IsKeyDown(Keys.P)) { if (!keyDown[(int)Keys.P]) { pause = !pause; } keyDown[(int)Keys.P] = true; } else { keyDown[(int)Keys.P] = false; } player.Update(elapsed_time); for (int i = 0; i < MAX_ENEMIGOS; ++i) { enemigo[i].Update(elapsed_time); } if (weapon.firing()) { // contra que le pego el disparo var p0 = GraphicsDevice.Viewport.Unproject(new Vector3(state.X, state.Y, 0), Projection, View, Matrix.Identity); var p1 = GraphicsDevice.Viewport.Unproject(new Vector3(state.X, state.Y, 1), Projection, View, Matrix.Identity); scene.intersectSegment(p0, p1, out ip_data ip); float min_dist = ip.nro_face != -1 ? (ip.ip - camPosition).LengthSquared():0; bool hay_sangre = false; // verifico si mato a algun enemigo // de forma aproximada verifico si el enemigo esta antes del punto de colision con el escenario // para evitar que lo mate si hay algun obstaculo que detenga el tiro. for (int i = 0; i < MAX_ENEMIGOS; ++i) { if (min_dist == 0 || (enemigo[i].Position - camPosition).LengthSquared() < min_dist) { if (enemigo[i].colision(camPosition, player.Direction)) { if (!enemigo[i].muerto) { enemigo[i].muerto = true; enemigo[i].currentAnimation = 0; enemigo[i].currentTime = 0; } hay_sangre = true; } } } if (ip.nro_face != -1) { scene.addDecal(ip.ip, ip.nro_face, hay_sangre ? "decals/blood" + grnd.Next(1, 9) : "decals/concrete/shot3", hay_sangre); } } // camara primera persona // la pos.Y = pos suelo + soldier_height/2 // pos camara = pos.Y + soldier_height/2 - epsilon (en pulgadas) Vector3 desf = new Vector3(0, soldier_height / 2 - 5, 0); camPosition = player.Position + player.Direction * 0 + desf; View = Matrix.CreateLookAt(camPosition, camPosition + player.Direction * 100, new Vector3(0, 1, 0)); base.Update(gameTime); }