示例#1
0
 public override void Dispose()
 {
     Bandicoot.Dispose();
     Physics.Dispose();
     Terrain.Dispose();
     Water.Dispose();
 }
 /// <summary>
 ///     Es muy importante liberar los recursos, sobretodo los gráficos
 ///     ya que quedan bloqueados en el device de video.
 /// </summary>
 public override void Dispose()
 {
     Bandicoot.Dispose();
     foreach (Mesh item in ListaMeshes)
     {
         item.Malla.Dispose();
     }
 }
示例#3
0
        public override void Render()
        {
            PreRender();
            Bandicoot.Transform = Scale * Rotation * new TGCMatrix(Physics.BandicootRigidBody.InterpolationWorldTransform);

            skyBox.Render();
            Bandicoot.Render();
            Terrain.Render();
            Water.Render();
            Physics.Render();

            PostRender();
        }
        public void InitMeshes()
        {
            var    sceneLoader = new TgcSceneLoader();
            string path        = $"{MediaDir}/crash/bandicoot-TgcScene.xml";
            var    pMin        = new TGCVector3(-185f, 0, -100f);
            var    pMax        = new TGCVector3(0, 225f, 0);

            Bandicoot = sceneLoader.loadSceneFromFile(path).Meshes[0];

            Bandicoot.AutoTransformEnable   = false;
            Bandicoot.AutoUpdateBoundingBox = false;


            Bandicoot.Scale = new TGCVector3(0.15f, 0.15f, 0.15f);
            Bandicoot.RotateY(3.12f);
            Bandicoot.BoundingBox.setExtremes(pMin, pMax);


            Scale    = TGCMatrix.Scaling(0.15f, 0.15f, 0.15f);
            Rotation = TGCMatrix.RotationY(3.12f);


            //Traslation = TGCMatrix.Translation(0, 1, 830);
            //Bandicoot.Transform = TGCMatrix.Scaling(Bandicoot.Scale) * TGCMatrix.RotationYawPitchRoll(3.12f, 0, 0) * Traslation;

            //Bandicoot.Move(0, 1, 830);
            //Bandicoot.Position = TGCVector3.Empty;

            Bandicoot.Position = new TGCVector3(0, 1, 830);
            Traslation         = TGCMatrix.Translation(0, 1, 830);

            Parte1 = sceneLoader.loadSceneFromFile($"{MediaDir}/Nivel1-1-TgcScene.xml").Meshes;
            Parte2 = sceneLoader.loadSceneFromFile($"{MediaDir}/Nivel1-2-TgcScene.xml").Meshes;

            //Parte2 = sceneLoader.loadSceneFromFile($"{MediaDir}/room-with-fruit3-TgcScene-TgcScene.xml").Meshes;

            ListaMeshes = new Escena().ObtenerMeshesDeEscena($"{MediaDir}/Nivel1-1-TgcScene.xml");

            ListaMeshes2 = new Escena().ObtenerMeshesDeEscena($"{MediaDir}/Nivel1-2-TgcScene.xml");

            foreach (Mesh item in ListaMeshes2)
            {
                item.Malla.Move(0, 0, -1290f);
                //item.Malla.Transform = TGCMatrix.Translation(0, 0, -1290f);

                //item.Malla.UpdateMeshTransform();
                //item.Malla.setColor(Color.Black);
            }

            ListaMeshes.AddRange(ListaMeshes2);


            ListaMeshes2 = new Escena().ObtenerMeshesDeEscena($"{MediaDir}/movingPlatform-as1-TgcScene.xml");

            foreach (Mesh item in ListaMeshes2)
            {
                item.Malla.Move(0, -10, -60);
            }

            ListaMeshes.AddRange(ListaMeshes2);
        }
        /// <summary>
        ///     Se llama cada vez que hay que refrescar la pantalla.
        ///     Escribir aquí todo el código referido al renderizado.
        ///     Borrar todo lo que no haga falta.
        /// </summary>
        public override void Render()
        {
            //Inicio el render de la escena, para ejemplos simples. Cuando tenemos postprocesado o shaders es mejor realizar las operaciones según nuestra conveniencia.
            PreRender();

            //Dibuja un texto por pantalla
            DrawText.drawText("Con la tecla F se dibuja el bounding box.", 0, 20, Color.OrangeRed);
            DrawText.drawText("Con clic izquierdo subimos la camara [Actual]: " + TGCVector3.PrintVector3(Camara.Position), 0, 30, Color.OrangeRed);
            DrawText.drawText("La posicion del bandicoot es: " + TGCVector3.PrintVector3(Bandicoot.Position), 0, 40, Color.Black);
            DrawText.drawText("La posicion del bandicoot es: " + Traslation, 0, 50, Color.Black);

            //terrain.Render();

            // Cuando tenemos modelos mesh podemos utilizar un método que hace la matriz de transformación estándar.
            // Es útil cuando tenemos transformaciones simples, pero OJO cuando tenemos transformaciones jerárquicas o complicadas.
            //Bandicoot.UpdateMeshTransform();

            var transformacion = Scale * Rotation * Traslation;

            //Bandicoot.Transform = TGCMatrix.Scaling(Bandicoot.Scale) * TGCMatrix.RotationY(3.12f) * Traslation * jumpTraslation;
            //Bandicoot.Move(0, 0, 1);

            Bandicoot.Transform = transformacion;
            //Bandicoot.Position.TransformCoordinate(transformacion);

            //Bandicoot.BoundingBox.
            Bandicoot.BoundingBox.transform(transformacion);

            //new TGCBox().updateValues
            Bandicoot.Render();

            /*
             * foreach (TgcMesh item in Parte1)
             * {
             *  item.Render();
             * }
             *
             * foreach (TgcMesh item in Parte2)
             * {
             *  item.Render();
             * }
             */
            foreach (Mesh item in ListaMeshes)
            {
                item.RenderMesh();
            }

            if (BoundingBox)
            {
                foreach (Mesh mesh in ListaMeshes)
                {
                    mesh.RenderBoundingBox();
                }
                Bandicoot.BoundingBox.Render();

                /*
                 * foreach (TgcMesh item in Parte1)
                 * {
                 *  item.BoundingBox.Render();
                 * }
                 * foreach (TgcMesh item in Parte2)
                 * {
                 *  item.BoundingBox.Render();
                 * }
                 */
            }

            // Finaliza el render y presenta en pantalla, al igual que el preRender se debe usar para casos
            // puntuales es mejor utilizar a mano las operaciones de EndScene y PresentScene
            PostRender();
        }
        /// <summary>
        ///     Se llama en cada frame.
        ///     Se debe escribir toda la lógica de computo del modelo,
        ///     así como también verificar entradas del usuario y reacciones ante ellas.
        /// </summary>
        public override void Update()
        {
            PreUpdate();

            alturaMaximaSalto = posBaseBandicoot + alturaMaximaInicial;
            // Capturar Input teclado utilizado para movimiento
            var anguloCamara = TGCVector3.Empty;
            var movimiento   = TGCVector3.Empty;

            var lastPos = Bandicoot.Position;

            if (Input.keyPressed(Key.F))
            {
                BoundingBox = !BoundingBox;
            }

            // movimiento lateral
            if (Input.keyDown(Key.Left) || Input.keyDown(Key.A))
            {
                movimiento.X = 1;
            }
            else if (Input.keyDown(Key.Right) || Input.keyDown(Key.D))
            {
                movimiento.X = -1;
            }

            //Movernos adelante y atras, sobre el eje Z.
            if (Input.keyDown(Key.Up) || Input.keyDown(Key.W))
            {
                movimiento.Z = -1;
            }
            else if (Input.keyDown(Key.Down) || Input.keyDown(Key.S))
            {
                movimiento.Z = 1;
            }

            //salto
            if (Input.keyPressed(Key.Space) && !saltando)
            {
                saltando       = true;
                direccionSalto = 1;
                //Bandicoot.Move(0, direccionSalto * MOVEMENT_SPEED * ElapsedTime, 0);
            }

            //Posicion original del mesh principal (o sea del bandicoot)
            var originalPos = Bandicoot.Position;

            anguloCamara = Bandicoot.Position;

            //Multiplicar movimiento por velocidad y elapsedTime
            movimiento *= MOVEMENT_SPEED * ElapsedTime;

            //Bandicoot.Move(movimiento);
            Traslation *= TGCMatrix.Translation(movimiento);

            //Bandicoot.Transform = TGCMatrix.Translation(movimiento);

            if (saltando)
            {
                Bandicoot.Move(0, direccionSalto * MOVEMENT_SPEED * ElapsedTime, 0);
                Traslation *= TGCMatrix.Translation(0, direccionSalto * MOVEMENT_SPEED * ElapsedTime, 0);

                //Si la posicion en Y es mayor a la maxima altura.
                if (Bandicoot.Position.Y > alturaMaximaSalto)
                {
                    direccionSalto = -1;
                }
                foreach (var item in ListaMeshes)
                {
                    if (TgcCollisionUtils.testAABBAABB(Bandicoot.BoundingBox, item.Malla.BoundingBox))
                    {
                        if (!item.EsFruta())
                        {
                            //Bandicoot.Transform = TGCMatrix.Translation(-movimiento.X, movimiento.Y / 2 + ((item.Malla.BoundingBox.PMax.Y / 2) + 1), -movimiento.Z);
                            //movimiento = new TGCVector3(0, 1 * MOVEMENT_SPEED * ElapsedTime + 0.1f, 0); ;
                            //Bandicoot.Move(0, 1 * MOVEMENT_SPEED * ElapsedTime + 0.1f, 0);

                            //item.ExecuteCollision(Bandicoot,Camara,movimiento);
                            if (item.isUpperCollision(Bandicoot, posBaseBandicoot))
                            {
                                Bandicoot.Position = new TGCVector3(Bandicoot.Position.X, item.Malla.BoundingBox.PMax.Y + 0.05f, Bandicoot.Position.Z);

                                posBaseBandicoot = item.Malla.BoundingBox.PMax.Y;
                            }
                            objetoColisionado = item;
                            //if (item.isUpperCollision(Bandicoot, posBaseBandicoot))
                            //    item.ExecuteJumpCollision(Bandicoot, Camara, movimiento);
                            saltando = false;
                            break;
                        }
                    }
                }
            }
            else
            {
                if (Bandicoot.Position.Y > posInicialBandicoot && !objetoColisionado.EsFruta())
                {
                    //saltando = false;

                    if (objetoColisionado.isUpperCollision(Bandicoot, posBaseBandicoot) && objetoColisionado.Malla != null)
                    {
                        //Bandicoot.Move(0, 1 * MOVEMENT_SPEED * ElapsedTime + 0.1f, 0);
                        Bandicoot.Position = new TGCVector3(Bandicoot.Position.X, objetoColisionado.Malla.BoundingBox.PMax.Y + 0.05f, Bandicoot.Position.Z);
                        saltando           = true;
                        //var traslacion = new TGCVector3()
                        //movimiento = new TGCVector3(0, 0, MOVEMENT_SPEED * ElapsedTime);
                        objetoColisionado.ExecuteJumpCollision(Bandicoot, Camara, movimiento, MOVEMENT_SPEED * ElapsedTime);
                        // objetoColisionado.tipo.Move(Bandicoot, MOVEMENT_SPEED * ElapsedTime);
                    }
                    else
                    {
                        posBaseBandicoot = posInicialBandicoot;
                    }
                }
            }

            /*
             * foreach (TgcMesh mesh in Parte1)
             * {
             *   if (TgcCollisionUtils.testAABBAABB(Bandicoot.BoundingBox, mesh.BoundingBox))
             *   {
             *
             *      Bandicoot.Move(-movimiento);
             *       Camara.SetCamera((Camara.Position - movimiento), anguloCamara);
             *   }
             *
             * }
             * foreach (TgcMesh mesh in Parte2)
             * {
             *  if (TgcCollisionUtils.testAABBAABB(Bandicoot.BoundingBox, mesh.BoundingBox))
             *  {
             *      Bandicoot.Move(-movimiento);
             *      Camara.SetCamera((Camara.Position - movimiento), anguloCamara);
             *  }
             * }*/

            foreach (var mesh in ListaMeshes)
            {
                if (mesh.Malla.BoundingBox == null)
                {
                    continue;
                }

                if (mesh.Malla.Name.Contains("movingPlatform"))
                {
                    mesh.Move(MOVEMENT_SPEED * ElapsedTime);
                }


                if (TgcCollisionUtils.testAABBAABB(Bandicoot.BoundingBox, mesh.Malla.BoundingBox))
                {
                    //comment = mesh.GetType().ToString();
                    mesh.ExecuteCollision(Bandicoot, Camara, movimiento);
                }
            }
            ListaMeshes.RemoveAll(mesh => mesh.Malla.BoundingBox == null);

            //Desplazar camara para seguir al personaje
            Camara.SetCamera((Camara.Position + movimiento), anguloCamara);

            //Capturar Input Mouse
            if (Input.buttonUp(TgcD3dInput.MouseButtons.BUTTON_LEFT))
            {
                //Como ejemplo podemos hacer un movimiento simple de la cámara.
                //En este caso le sumamos un valor en Y
                Camara.SetCamera(Camara.Position + new TGCVector3(0, 10f, 0), Camara.LookAt);
                //Ver ejemplos de cámara para otras operaciones posibles.

                //Si superamos cierto Y volvemos a la posición original.
                if (Camara.Position.Y > 300f)
                {
                    Camara.SetCamera(new TGCVector3(Camara.Position.X, 0f, Camara.Position.Z), Camara.LookAt);
                }
            }

            if (Input.buttonUp(TgcD3dInput.MouseButtons.BUTTON_RIGHT))
            {
                //Pruebo si baja camara
                Camara.SetCamera(Camara.Position + new TGCVector3(0, -10f, 0), Camara.LookAt);

                //igual que si sube a cierta altura reinicio camara
                if (Camara.Position.Y < -200f)
                {
                    Camara.SetCamera(new TGCVector3(Camara.Position.X, 0f, Camara.Position.Z), Camara.LookAt);
                }
            }

            PostUpdate();
        }