示例#1
0
        public override bool intersectRay(TgcRay ray, Matrix transform, out Vector3 q)
        {
            COLLISION_SPHERE.setCenter(Vector3.TransformCoordinate(position, transform));
            float t;

            return(TgcCollisionUtils.intersectRaySphere(ray, COLLISION_SPHERE, out t, out q));
        }
        public override bool colisionaConPersonaje(TgcBoundingSphere esferaPersonaje)
        {
            bool colision = false;
            TgcBoundingSphere esferaAux      = esferaPersonaje;
            TGCVector3        centroOriginal = esferaAux.Center;

            TGCVector3 centroTestColision = centroOriginal;

            centroTestColision.Y -= 50f;
            esferaAux.setCenter(centroTestColision);

            colision = base.colisionaConPersonaje(esferaAux);

            esferaAux.setCenter(centroOriginal);
            return(colision);
        }
示例#3
0
        /// <summary>
        /// Detección de colisiones, filtrando los obstaculos que se encuentran dentro del radio de movimiento
        /// </summary>
        private void collideWithWorld(TgcBoundingSphere characterSphere, Vector3 movementVector, List <IColisionablePelota> obstaculos, ColisionInfo colisionInfo)
        {
            /*
             * // DEJO que al menos se haga una iteracion aunque la pelota no se mueva, fix bug de colision con pelota quieta.
             * if (movementVector.LengthSq() < EPSILON)
             * {
             *  return;
             * }
             */
            List <IColisionable> objetosCandidatos = new List <IColisionable>();
            Vector3 lastCenterSafePosition         = characterSphere.Center;

            //Dejar solo los obstáculos que están dentro del radio de movimiento de la esfera
            Vector3           halfMovementVec = Vector3.Multiply(movementVector, 0.5f);
            TgcBoundingSphere testSphere      = new TgcBoundingSphere(
                characterSphere.Center + halfMovementVec,
                halfMovementVec.Length() + characterSphere.Radius
                );

            objetosCandidatos.Clear();
            foreach (IColisionable obstaculo in obstaculos)
            {
                if (TgcCollisionUtils.testSphereAABB(testSphere, obstaculo.GetTgcBoundingBox()))
                {
                    //colisionInfo.Add(obstaculo);
                    objetosCandidatos.Add(obstaculo);
                }
            }

            //Detectar colisiones y deplazar con sliding
            doCollideWithWorld(characterSphere, movementVector, objetosCandidatos, 0, colisionInfo);

            //Manejo de error. No deberiamos colisionar con nadie si todo salio bien
            foreach (IColisionable obstaculo in objetosCandidatos)
            {
                if (TgcCollisionUtils.testSphereAABB(characterSphere, obstaculo.GetTgcBoundingBox()))
                {
                    //Hubo un error, volver a la posición original
                    characterSphere.setCenter(lastCenterSafePosition);
                    return;
                }
            }
        }
示例#4
0
        /// <summary>
        /// Detección de colisiones, filtrando los obstaculos que se encuentran dentro del radio de movimiento
        /// </summary>
        private void collideWithWorld(TgcBoundingSphere characterSphere, Vector3 movementVector, List <TgcBoundingBox> obstaculos)
        {
            if (movementVector.LengthSq() < EPSILON)
            {
                return;
            }

            Vector3 lastCenterSafePosition = characterSphere.Center;

            //Dejar solo los obstáculos que están dentro del radio de movimiento de la esfera
            Vector3           halfMovementVec = Vector3.Multiply(movementVector, 0.5f);
            TgcBoundingSphere testSphere      = new TgcBoundingSphere(
                characterSphere.Center + halfMovementVec,
                halfMovementVec.Length() + characterSphere.Radius
                );

            objetosCandidatos.Clear();
            foreach (TgcBoundingBox obstaculo in obstaculos)
            {
                if (TgcCollisionUtils.testSphereAABB(testSphere, obstaculo))
                {
                    objetosCandidatos.Add(obstaculo);
                }
            }

            //Detectar colisiones y deplazar con sliding
            doCollideWithWorld(characterSphere, movementVector, objetosCandidatos, 0);


            //Manejo de error. No deberiamos colisionar con nadie si todo salio bien
            foreach (TgcBoundingBox obstaculo in objetosCandidatos)
            {
                if (TgcCollisionUtils.testSphereAABB(characterSphere, obstaculo))
                {
                    //Hubo un error, volver a la posición original
                    characterSphere.setCenter(lastCenterSafePosition);
                    return;
                }
            }
        }
        /// <summary>
        /// Detección de colisiones, filtrando los obstaculos que se encuentran dentro del radio de movimiento
        /// </summary>
        private void collideWithWorld(TgcBoundingSphere characterSphere, Vector3 movementVector, List<IColisionablePelota> obstaculos, ColisionInfo colisionInfo)
        {
            /*
            // DEJO que al menos se haga una iteracion aunque la pelota no se mueva, fix bug de colision con pelota quieta.
            if (movementVector.LengthSq() < EPSILON)
            {
                return;
            }
            */
            List<IColisionable> objetosCandidatos = new List<IColisionable>();
            Vector3 lastCenterSafePosition = characterSphere.Center;

            //Dejar solo los obstáculos que están dentro del radio de movimiento de la esfera
            Vector3 halfMovementVec = Vector3.Multiply(movementVector, 0.5f);
            TgcBoundingSphere testSphere = new TgcBoundingSphere(
                characterSphere.Center + halfMovementVec,
                halfMovementVec.Length() + characterSphere.Radius
                );
            objetosCandidatos.Clear();
            foreach (IColisionable obstaculo in obstaculos)
            {
                if (TgcCollisionUtils.testSphereAABB(testSphere, obstaculo.GetTgcBoundingBox()))
                {
                    //colisionInfo.Add(obstaculo);
                    objetosCandidatos.Add(obstaculo);
                }
            }

            //Detectar colisiones y deplazar con sliding
            doCollideWithWorld(characterSphere, movementVector, objetosCandidatos, 0, colisionInfo);

            //Manejo de error. No deberiamos colisionar con nadie si todo salio bien
            foreach (IColisionable obstaculo in objetosCandidatos)
            {
                if (TgcCollisionUtils.testSphereAABB(characterSphere, obstaculo.GetTgcBoundingBox()))
                {
                    //Hubo un error, volver a la posición original
                    characterSphere.setCenter(lastCenterSafePosition);
                    return;
                }
            }
        }
 protected virtual void Item_PositionChanged(Item item)
 {
     Sphere.setCenter(Position = item.Position);
 }
示例#7
0
        public void Update(float ElapsedTime, TgcD3dInput Input)
        {
            // Actualizo la posicion del Hacha
            Posicion = env.Camara.Position;
            hachaPersonaje.Position = new Vector3(Posicion.X - 1, Posicion.Y - 0.8f, Posicion.Z);

            // Actualizo la Posicion de la Esfera de Colisión
            BoundingSphere.setCenter(Posicion);

            // Actualizo las Variables de Estado del Personaje
            actualizarEstado(ElapsedTime);

            actualizarControles(ElapsedTime);

            if (this.Muerto)
            {
                env.musica.selectionSound("Sonido\\game_over.mp3");
                env.musica.startSound();
            }
            else
            {
                // Creo la fogata
                if (env.terreno.activarFogata && !env.terreno.ubicacionFogataFija)
                {
                    env.terreno.fogata.Position     = new Vector3(env.Camara.Position.X - (1 * env.terreno.SceneScaleXZ), env.terreno.CalcularAlturaTerreno((env.Camara.Position.X - (1 * env.terreno.SceneScaleXZ)) / env.terreno.SceneScaleXZ, env.Camara.Position.Z / env.terreno.SceneScaleXZ) * env.terreno.SceneScaleY, env.Camara.Position.Z);
                    env.terreno.ubicacionFogataFija = true;
                }

                // Verifico cuantos objetos estan Cerca
                env.objetosCerca = 0;
                foreach (var objeto in env.terreno.SceneMeshes)
                {
                    if (estaCerca(objeto))
                    {
                        env.objetosCerca++;

                        // Si el objeto es una Fruta
                        if (objeto.Name.StartsWith("Fruta") && env.Input.keyPressed(Key.E))
                        {
                            Inventario[0].cantidad++;

                            // Desactivo el objeto y lo muevo a un lugar lejano ya que no puedo sacarlos de SceneMeshes
                            objeto.Enabled = false;
                            objeto.dispose();
                            objeto.Position = new Vector3(0, 0, 0);
                        }

                        // Si el objeto es una Palmera
                        if (objeto.Name.StartsWith("Palmera") && Input.buttonDown(TgcD3dInput.MouseButtons.BUTTON_LEFT))
                        {
                            sonidoHacha(true);
                            env.sonidoHacha = true;

                            Inventario[2].cantidad++;

                            // Desactivo el objeto y lo muevo a un lugar lejano ya que no puedo sacarlos de SceneMeshes
                            objeto.Enabled = false;
                            objeto.dispose();
                            objeto.Position = new Vector3(0, 0, 0);
                        }

                        // Si el objeto es un Pino
                        if (objeto.Name.StartsWith("Pino") && Input.buttonDown(TgcD3dInput.MouseButtons.BUTTON_LEFT))
                        {
                            sonidoHacha(true);
                            env.sonidoHacha = true;

                            Inventario[2].cantidad++;

                            // Desactivo el objeto y lo muevo a un lugar lejano ya que no puedo sacarlos de SceneMeshes
                            objeto.Enabled = false;
                            objeto.dispose();
                            objeto.Position = new Vector3(0, 0, 0);
                        }

                        // Si el objeto es una Piedra
                        if (objeto.Name.StartsWith("Roca") && Input.buttonDown(TgcD3dInput.MouseButtons.BUTTON_LEFT))
                        {
                            sonidoHacha(true);
                            env.sonidoHacha = true;

                            Inventario[3].cantidad++;

                            // Desactivo el objeto y lo muevo a un lugar lejano ya que no puedo sacarlos de SceneMeshes
                            objeto.Enabled = false;
                            objeto.dispose();
                            objeto.Position = new Vector3(0, 0, 0);
                        }
                    }
                }
            }
        }