示例#1
0
        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;
            }
        }
示例#2
0
        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);
        }