示例#1
0
        internal void HuirDe(Personaje personaje, float elapsedTime)
        {
            var posicionDeBorrado = new TGCVector3(ghost.Position.X + 2000, ghost.Position.Y, ghost.Position.Z - 5000);

            ghost.Move(posicionDeBorrado);
            ghost.updateBoundingBox();
            ghost.UpdateMeshTransform();
        }
示例#2
0
        private void eliminarMesh()
        {
            TGCVector3 posicionDeBorrado = new TGCVector3(0, -4000, 0);

            mesh.Move(posicionDeBorrado);
            mesh.updateBoundingBox();
            mesh.UpdateMeshTransform();
        }
        private void eliminarMesh()
        {
            TGCVector3 posicionDeBorrado = new TGCVector3(0, -4000, 0);

            mesh.Move(posicionDeBorrado);
            mesh.updateBoundingBox();
            mesh.UpdateMeshTransform();
            //no hago el dispose aca porque sino lo tendria que sacar del TGCScene y no se si quiero hacer eso
        }
        public override void Init()
        {
            var loader = new TgcSceneLoader();
            var scene  = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Meshes\\Vehiculos\\Patrullero\\Patrullero-TgcScene.xml");

            mesh       = scene.Meshes[0];
            mesh.Scale = new Vector3(0.25f, 0.25f, 0.25f);

            //Cuerpo principal que se controla con el teclado
            //mesh = TgcBox.fromSize(new Vector3(0, 10, 0), new Vector3(10, 10, 10), Color.Blue).toMesh("box");

            //triangulo
            triangle    = new CustomVertex.PositionColored[3];
            triangle[0] = new CustomVertex.PositionColored(-100, 0, 0, Color.Green.ToArgb());
            triangle[1] = new CustomVertex.PositionColored(0, 0, 50, Color.Green.ToArgb());
            triangle[2] = new CustomVertex.PositionColored(0, 100, 0, Color.Green.ToArgb());
            triagleAABB =
                TgcBoundingAxisAlignBox.computeFromPoints(new[]
                                                          { triangle[0].Position, triangle[1].Position, triangle[2].Position });

            //box2
            box2 = TgcBox.fromSize(new Vector3(-50, 10, -20), new Vector3(15, 15, 15), Color.Violet);

            //sphere
            boundingSphere = new TgcBoundingSphere(new Vector3(30, 20, -20), 15);

            //OBB: computar OBB a partir del AABB del mesh.
            meshObb =
                loader.loadSceneFromFile(MediaDir +
                                         "MeshCreator\\Meshes\\Objetos\\Catapulta\\Catapulta-TgcScene.xml")
                .Meshes[0];
            meshObb.Scale    = new Vector3(0.1f, 0.1f, 0.1f);
            meshObb.Position = new Vector3(100, 0, 30);
            meshObb.updateBoundingBox();
            //Computar OBB a partir del AABB del mesh. Inicialmente genera el mismo volumen que el AABB, pero luego te permite rotarlo (cosa que el AABB no puede)
            obb = TgcBoundingOrientedBox.computeFromAABB(meshObb.BoundingBox);
            //Otra alternativa es computar OBB a partir de sus vertices. Esto genera un OBB lo mas apretado posible pero es una operacion costosa
            //obb = TgcBoundingOrientedBox.computeFromPoints(mesh.getVertexPositions());

            //Rotar mesh y rotar OBB. A diferencia del AABB, nosotros tenemos que mantener el OBB actualizado segun cada movimiento del mesh
            meshObb.Rotation = new Vector3(0, FastMath.PI / 4, 0);
            //Los obb tienen una especie de autotransform aun.
            obb.rotate(new Vector3(0, FastMath.PI / 4, 0));

            //Configurar camara en Tercer Persona
            camaraInterna = new TgcThirdPersonCamera(mesh.Position, 30, -75);
            Camara        = camaraInterna;
        }
示例#5
0
        public void MoverPersonaje(char key, float elapsedTime, TgcD3dInput input, Escenario escenario, Monster monster)
        {
            MovementSpeed = 800.0f;
            var movimiento       = TGCVector3.Empty;
            var posicionOriginal = this.Position;

            var moving        = false;
            var estoyFlotando = false;

            if (key == key_forward)
            {
                movimiento.Z = -1;
                moving       = true;
            }

            if (key == key_left)
            {
                movimiento.X = 1;
                moving       = true;
            }

            if (key == key_back)
            {
                movimiento.Z = 1;
                moving       = true;
            }


            if (key == key_right)
            {
                movimiento.X = -1;
                moving       = true;
            }

            if (key == ' ')
            {
                movimiento.Y = 1;
                moving       = true;
            }


            if (moving)
            {
                this.posicionAnterior = this.Position;

                var lastPos = meshPersonaje.Position;

                movimiento            *= MovementSpeed * elapsedTime;
                meshPersonaje.Position = meshPersonaje.Position + movimiento;
                meshPersonaje.updateBoundingBox();

                //COLISIONES

                bool chocaron = escenario.tgcScene.Meshes.Any(mesh => TgcCollisionUtils.testAABBAABB(mesh.BoundingBox, meshPersonaje.BoundingBox));
                if (chocaron)
                {
                    meshPersonaje.Position = lastPos;
                }

                bool chocoConMonster = TgcCollisionUtils.testAABBAABB(monster.ghost.BoundingBox, meshPersonaje.BoundingBox);
                if (chocoConMonster)
                {
                    meshPersonaje.Position = lastPos;
                }

                meshPersonaje.Transform = TGCMatrix.Scaling(meshPersonaje.Scale) *
                                          TGCMatrix.RotationYawPitchRoll(meshPersonaje.Rotation.Y, meshPersonaje.Rotation.X, meshPersonaje.Rotation.Z) *
                                          TGCMatrix.Translation(meshPersonaje.Position);

                this.Position = meshPersonaje.Position;
                //Hacer que la camara siga al personaje en su nueva posicion
                //camaraInterna.Target = this.Position;
            }

            float rotY = input.XposRelative * rotationSpeed;
            float rotX = input.YposRelative * rotationSpeed;

            eye     = this.Position;
            target += movimiento;
            if (lockMouse)
            {
                if (rotY != 0.0f || rotX != 0.0f)
                {
                    look(rotX, rotY);
                }

                Cursor.Position = windowCenter;
            }
            this.SetCamera(eye, target);
        }
示例#6
0
        public override void Update()
        {
            var velocidadCaminar = VELOCIDAD_DESPLAZAMIENTO * ElapsedTime;

            //Calcular proxima posicion de personaje segun Input
            var moving   = false;
            var movement = TGCVector3.Empty;

            //Adelante
            if (Input.keyDown(Key.W))
            {
                movement.Z = velocidadCaminar;
                moving     = true;
            }

            //Atras
            if (Input.keyDown(Key.S))
            {
                movement.Z = -velocidadCaminar;
                moving     = true;
            }

            //Derecha
            if (Input.keyDown(Key.D))
            {
                movement.X = velocidadCaminar;
                moving     = true;
            }

            //Izquierda
            if (Input.keyDown(Key.A))
            {
                movement.X = -velocidadCaminar;
                moving     = true;
            }
            //Salto
            if (Input.keyDown(Key.Space))
            {
                movement.Y = velocidadCaminar;
                moving     = true;
            }
            //Agachar
            if (Input.keyDown(Key.LeftControl))
            {
                movement.Y = -velocidadCaminar;
                moving     = true;
            }
            //Si hubo desplazamiento
            if (moving)
            {
                //Aplicar movimiento, internamente suma valores a la posicion actual del mesh.
                mesh.Position  = mesh.Position + movement;
                mesh.Transform = TGCMatrix.Translation(mesh.Position);
                mesh.updateBoundingBox();
            }
            //Hacer que la camara siga al personaje en su nueva posicion
            camaraInterna.Target = mesh.Position;

            //Detectar colision con triangulo
            if (TgcCollisionUtils.testTriangleAABB(new TGCVector3(triangle[0].Position), new TGCVector3(triangle[1].Position), new TGCVector3(triangle[2].Position),
                                                   mesh.BoundingBox))
            {
                triangle[0].Color = Color.Red.ToArgb();
                triangle[1].Color = Color.Red.ToArgb();
                triangle[2].Color = Color.Red.ToArgb();
            }
            else
            {
                triangle[0].Color = Color.Green.ToArgb();
                triangle[1].Color = Color.Green.ToArgb();
                triangle[2].Color = Color.Green.ToArgb();
            }
            //Detectar colision con el otro AABB
            if (TgcCollisionUtils.testAABBAABB(mesh.BoundingBox, box2.BoundingBox))
            {
                box2.Color = Color.Red;
                box2.updateValues();
            }
            else
            {
                box2.Color = Color.Violet;
                box2.updateValues();
            }
            //Detectar colision con la esfera
            if (TgcCollisionUtils.testSphereAABB(boundingSphere, mesh.BoundingBox))
            {
                boundingSphere.setRenderColor(Color.Red);
            }
            else
            {
                boundingSphere.setRenderColor(Color.Yellow);
            }

            //Detectar colision con la obb
            if (TgcCollisionUtils.testObbAABB(obb, mesh.BoundingBox))
            {
                obb.setRenderColor(Color.Red);
            }
            else
            {
                obb.setRenderColor(Color.Yellow);
            }
        }
        public void MoverPersonaje(char key, float elapsedTime, TgcD3dInput input, GameModel gameModel)
        {
            MovementSpeed = 800.0f;
            var movimiento       = TGCVector3.Empty;
            var posicionOriginal = this.Position;

            var moving        = false;
            var estoyFlotando = false;
            var adelante      = false;
            var lateral       = false;

            float rotY1 = input.XposRelative * 5 * elapsedTime;
            float rotX1 = input.YposRelative * 5 * elapsedTime;

            anguloAbsolutoEnY -= rotY1;
            anguloAbsolutoEnX += rotX1;

            if (key == key_forward)
            {
                movimiento.Z = -1;
                moving       = true;
                adelante     = true;
            }

            if (key == key_left)
            {
                movimiento.X = 1;
                moving       = true;
                lateral      = true;
            }

            if (key == key_back)
            {
                movimiento.Z = 1;
                moving       = true;
                adelante     = true;
            }


            if (key == key_right)
            {
                movimiento.X = -1;
                moving       = true;
                lateral      = true;
            }

            if (moving)
            {
                this.posicionAnterior = this.Position;

                var lastPos = meshPersonaje.Position;

                //movimiento *= MovementSpeed * elapsedTime;
                //meshPersonaje.Position = meshPersonaje.Position + movimiento;


                float MovimientoDelPersonaje = 0;
                if (adelante)
                {
                    MovimientoDelPersonaje = (-1) * movimiento.Z * MovementSpeed;
                    avanzarYretroceder(elapsedTime, MovimientoDelPersonaje, anguloAbsolutoEnY);
                }
                if (lateral)
                {
                    MovimientoDelPersonaje = -1 * movimiento.X * MovementSpeed;
                    DesplazamientoLateral(elapsedTime, MovimientoDelPersonaje, anguloAbsolutoEnY);
                }
                //RecalcularForward();
                //en este metodo hay que poner bien forward y se soluciona el shader
                meshPersonaje.updateBoundingBox();



                //COLISIONES

                bool chocaron = gameModel.escenario.tgcScene.Meshes.Any(mesh => TgcCollisionUtils.testAABBAABB(mesh.BoundingBox, meshPersonaje.BoundingBox));
                if (chocaron)
                {
                    meshPersonaje.Position = lastPos;
                    var escalera = gameModel.escenario.tgcScene.Meshes.Find(mesh => mesh.Name.Contains("Escalera"));
                    this.chocandoConEscalera = TgcCollisionUtils.testAABBAABB(escalera.BoundingBox, meshPersonaje.BoundingBox);
                }

                bool chocoConMonster = TgcCollisionUtils.testAABBAABB(gameModel.monster.ghost.BoundingBox, meshPersonaje.BoundingBox);
                if (chocoConMonster)
                {
                    meshPersonaje.Position = lastPos;
                }
                if (!chocoConMonster && !chocaron)
                {
                    vectorDeMovemiento = movimiento;
                }


                bool chocoConParedInvisible = TgcCollisionUtils.testAABBAABB(gameModel.paredInvisible.paredInvisible.BoundingBox, meshPersonaje.BoundingBox);
                if (chocoConParedInvisible)
                {
                    meshPersonaje.Position = lastPos;
                }

                reproducirCaminata();

                transformarMesh(); // Hace el mesh transform

                this.Position = meshPersonaje.Position;
            }

            //en este metodo hay que poner bien forward y se soluciona el shader

            eye    = this.Position;
            target = puntoDemira(anguloAbsolutoEnY, anguloAbsolutoEnX);//movimiento;

            RecalcularForward();
            //Hacer que la camara siga al personaje en su nueva posicion
            //camaraInterna.Target = this.Position;

            this.SetCamera(eye, target);
        }