Exemplo n.º 1
0
        public void crearCriaturasIniciales()
        {
            CreacionesConTiempo = new Thread(crearPorTiempo);
            CreacionesConTiempo.Start();
            ndDelegate = new newDirDelegate(Direccion);
            int cantidadSoldados = randy.Next(4, 8);
            int cantidadEruditos = randy.Next(4, 8);
            cantidadEruditos = 10;
            cantidadSoldados = 10;
            int id;
            for (int i = 0; i < cantidadEruditos; i++)
            {
                id = nuevoId();
                var posx = randy.Next(0, 1000);
                var posy = randy.Next(0, 680);
                while ((posx > 720 && posy > 550) || (posx > 700 && posy < 187))
                {
                    posx = randy.Next(0, 1000);
                    posy = randy.Next(0, 680);
                }
                var criatura = new CriaturaBack(id, posx, posy, "erudito", randy);
                eruditos.Add(id, criatura);
                crearElementoFrontEnd(criatura);
                criatura.MoverElemento += moverElementoFrontEnd;
                criatura.ndDelegate = ndDelegate;
            }

            for (int i = 0; i < cantidadSoldados; i++)
            {
                id = nuevoId();
                var posx = randy.Next(0, 1000);
                var posy = randy.Next(0, 680);
                while ((posx < 346 && posy < 200) || (posx > 700 && posy < 187))
                {
                    posx = randy.Next(0, 1000);
                    posy = randy.Next(0, 680);
                }
                var criatura = new CriaturaBack(id, posx, posy, "soldado", randy);
                soldados.Add(id, criatura);
                crearElementoFrontEnd(criatura);
                criatura.MoverElemento += moverElementoFrontEnd;
                criatura.ndDelegate = ndDelegate;
            }

            foreach (KeyValuePair<int, CriaturaBack> kv in soldados)
            {
                kv.Value.IniciarMovimiento();
            }
            foreach (KeyValuePair<int, CriaturaBack> kv in eruditos)
            {
                kv.Value.IniciarMovimiento();
            }
        }
 public void eliminarElementoDelegate(CriaturaBack criaturaBack)
 {
     try
     {
         Criatura porEliminar = Criaturas[criaturaBack.id];
         Criaturas.Remove(criaturaBack.id);
         MyCanvas.Children.Remove(porEliminar);
     }
     catch
     {
         Console.Write("id no encontrado");
     }
 }
 public CriaturaBack(int _id, double _canvasPosX, double _canvasPosY, string _tipo, Random _randy)
 {
     id = _id;
     CanvasPosX = _canvasPosX;
     CanvasPosY = _canvasPosY;
     tipo = _tipo;
     randy = _randy;
     PonderadorDeVelocidad = randy.Next(60, 140) / 100.0;
     PonderadorOriginal = PonderadorDeVelocidad;
     direccion = randy.Next(0, 62832) / 10000.0;
     grupo.Add(this);
     jefe = this;
 }
 public void moverElementoDelegate(CriaturaBack criaturaBack)
 {
     try
     {
         Criatura criatura = Criaturas[criaturaBack.id];
         Canvas.SetLeft(criatura, criaturaBack.CanvasPosX);
         Canvas.SetTop(criatura, criaturaBack.CanvasPosY);
     }
     catch
     {
         Console.Write("id no encontrado");
     }
 }
 public void eliminarElementoFront(CriaturaBack criaturaBack)
 {
     Action<CriaturaBack> delegateAlDispatcher = new Action<CriaturaBack>(eliminarElementoDelegate);
     Dispatcher.BeginInvoke(delegateAlDispatcher, criaturaBack);
 }
 public void crearElementoDelegate(CriaturaBack criaturaBack)
 {
     Criatura criatura = new Criatura(criaturaBack.id, criaturaBack.tipo, criaturaBack.CanvasPosX, criaturaBack.CanvasPosY);
     Criaturas.Add(criatura.id, criatura);
     MyCanvas.Children.Add(criatura);
 }
Exemplo n.º 7
0
 public void moverElementoFrontEnd(CriaturaBack criatura)
 {
     if (MoverElementoFront != null)
     {
         MoverElementoFront(criatura);
     }
 }
Exemplo n.º 8
0
        public double DireccionErmitano(CriaturaBack criatura)
        {
            var listaGrupos = new List<List<CriaturaBack>>();
            foreach (KeyValuePair<int, CriaturaBack> kv in soldados)
            {
                if (!listaGrupos.Contains(kv.Value.jefe.grupo) && kv.Value.jefe.grupo.Count > 1)
                    listaGrupos.Add(kv.Value.jefe.grupo);
            }
            foreach (KeyValuePair<int, CriaturaBack> kv in eruditos)
            {
                if (!listaGrupos.Contains(kv.Value.jefe.grupo) && kv.Value.jefe.grupo.Count > 1)
                    listaGrupos.Add(kv.Value.jefe.grupo);
            }
            List<CriaturaBack> masCercano = new List<CriaturaBack>();
            Tuple<double,double> posCriatura = new Tuple<double,double>(criatura.CanvasPosX, criatura.CanvasPosY);
            foreach (List<CriaturaBack> grupo in listaGrupos)
            {
                if (masCercano.Count == 0)
                    masCercano = grupo;
                else if (Distancia(CentroDeMasa(grupo), posCriatura) < Distancia(CentroDeMasa(masCercano), posCriatura))
                    masCercano = grupo;
            }
            if (masCercano.Count < 2)
                return criatura.direccion;
            if (Distancia(CentroDeMasa(masCercano), posCriatura) > RadioDeGrupo(masCercano.Count) * 2)
                return criatura.direccion;
            var centroDeMasaMasCercano = CentroDeMasa(masCercano);
            var direccion = (Math.Atan((criatura.CanvasPosY - centroDeMasaMasCercano.Item2) / (criatura.CanvasPosX - centroDeMasaMasCercano.Item1)));

            return direccion;
        }
Exemplo n.º 9
0
        public double Direccion(CriaturaBack criatura)
        {
            lock (lockObject)
            {
                #region Control de aliados cercanos
                Dictionary<int, CriaturaBack> aliados = null;
                Dictionary<int, CriaturaBack> enemigos = null;
                if (criatura.tipo == "erudito")
                {
                    aliados = eruditos;
                    enemigos = soldados;
                }
                else if (criatura.tipo == "soldado")
                {
                    aliados = soldados;
                    enemigos = eruditos;
                }
                else if (criatura.tipo == "ermitano")
                {
                    return DireccionErmitano(criatura);
                }

                var centroDeMasaGrupo = CentroDeMasa(criatura.jefe.grupo);

                var cercanos = new List<CriaturaBack>();
                foreach (KeyValuePair<int, CriaturaBack> kv in aliados)
                {
                    var distX = centroDeMasaGrupo.Item1 - kv.Value.CanvasPosX;
                    var distY = centroDeMasaGrupo.Item2 - kv.Value.CanvasPosY;
                    if (Math.Sqrt(distX * distX + distY * distY) < RadioDeGrupo(criatura.jefe.grupo.Count))
                    {
                        cercanos.Add(kv.Value);
                    }
                    else
                    {
                        criatura.jefe.grupo.Remove(kv.Value);
                        kv.Value.jefe = kv.Value;
                        kv.Value.grupo = new List<CriaturaBack>();
                        kv.Value.grupo.Add(kv.Value);
                        kv.Value.PonderadorDeVelocidad = kv.Value.PonderadorOriginal;
                    }
                    cercanos.Sort((emp1, emp2) => emp1.PonderadorOriginal.CompareTo(emp2.PonderadorOriginal));
                    var cantidad = 0;
                    foreach (CriaturaBack c in cercanos)
                    {
                        if (cantidad > 5)
                        {
                            c.jefe.grupo.Remove(c);
                            c.jefe = c;
                            c.grupo = new List<CriaturaBack>();
                            c.grupo.Add(c);
                            c.PonderadorDeVelocidad = c.PonderadorOriginal;
                        }
                        else
                        {
                            c.jefe = criatura.jefe;
                            if (!criatura.jefe.grupo.Contains(c))
                            {
                                criatura.jefe.grupo.Add(c);
                            }
                        }
                        cantidad++;
                    }

                }

                #endregion

                #region Calculo de direccion individual segun grupo

                double direccionGrupal = 0;
                foreach (CriaturaBack c in criatura.jefe.grupo)
                {
                    direccionGrupal += c.direccion;
                }
                direccionGrupal = direccionGrupal / criatura.jefe.grupo.Count;

                #endregion

                #region Ajuste de velocidad dentro del grupo
                foreach (CriaturaBack c in criatura.jefe.grupo)
                {
                    var distX = centroDeMasaGrupo.Item1 - c.CanvasPosX;
                    var distY = centroDeMasaGrupo.Item2 - c.CanvasPosY;
                    var dist = Math.Sqrt(distX * distX + distY * distY);
                    var ponderador = ReductorDeVelocidad(dist, RadioDeGrupo(criatura.jefe.grupo.Count));
                    c.PonderadorDeVelocidad = c.PonderadorOriginal * ponderador;
                }
                #endregion

                #region Redireccion Por repulsion enemiga
                if (enemigos != null)
                {
                    List<List<CriaturaBack>> ListaDeGrupos = new List<List<CriaturaBack>>();
                    var sumaDirecciones = 0.0;
                    var cantidad = 0;
                    foreach (KeyValuePair<int, CriaturaBack> kv in enemigos)
                    {
                        if (!ListaDeGrupos.Contains(kv.Value.jefe.grupo))
                            ListaDeGrupos.Add(kv.Value.jefe.grupo);
                    }
                    foreach (List<CriaturaBack> grupo in ListaDeGrupos)
                    {
                        if (Math.Sqrt(Math.Pow(CentroDeMasa(grupo).Item1 - criatura.CanvasPosX, 2) + Math.Pow(CentroDeMasa(grupo).Item2 - criatura.CanvasPosY, 2)) > RadioDeGrupo(grupo.Count) * 2)
                            continue;
                        var distanciaInicial = Math.Sqrt(Math.Pow(criatura.CanvasPosX - CentroDeMasa(grupo).Item1, 2) + Math.Pow(criatura.CanvasPosY - CentroDeMasa(grupo).Item2, 2));
                        var distanciaFinal = Math.Sqrt(Math.Pow(criatura.CanvasPosX + Math.Cos(criatura.direccion) * criatura.PonderadorOriginal - CentroDeMasa(grupo).Item1, 2) + Math.Pow(criatura.CanvasPosY + Math.Sin(criatura.direccion) * criatura.PonderadorOriginal - CentroDeMasa(grupo).Item2, 2));
                        if (distanciaFinal < distanciaInicial)
                        {
                            sumaDirecciones += grupo[0].direccion * -1;
                            cantidad++;
                        }
                    }
                    if (cantidad > 0)
                    {
                        criatura.redirigirGrupo(sumaDirecciones / cantidad);
                    }
                }
                #endregion

                #region Conversion de ermitaños
                List<CriaturaBack> todelete = new List<CriaturaBack>();
                foreach (KeyValuePair<int, CriaturaBack> kv in ermitanos)
                {
                    var ermitano = kv.Value;
                    if (Distancia(new Tuple<double, double>(ermitano.CanvasPosX, ermitano.CanvasPosY), centroDeMasaGrupo) < RadioDeGrupo(criatura.jefe.grupo.Count) && criatura.jefe.grupo.Count > 1)
                    {
                        var convertido = new CriaturaBack(nuevoId(), ermitano.CanvasPosX, ermitano.CanvasPosY, criatura.tipo, randy);
                        aliados.Add(convertido.id, convertido);
                        crearElementoFrontEnd(convertido);
                        convertido.MoverElemento += moverElementoFrontEnd;
                        convertido.ndDelegate = ndDelegate;
                        convertido.IniciarMovimiento();
                        convertido.jefe = criatura.jefe;
                        convertido.jefe.grupo.Add(convertido);
                        todelete.Add(ermitano);

                    }
                }
                foreach (CriaturaBack c in todelete)
                {
                    c.movimiento = false;
                    c.thread_movimiento.Join(1);
                    if (EliminarElementoFront != null)
                        EliminarElementoFront(c);
                    ermitanos.Remove(c.id);
                }
                #endregion

                return (direccionGrupal + criatura.direccion) / 2;
            }
        }
Exemplo n.º 10
0
        public void crearPorTiempo()
        {
            while (true)
            {
                Thread.Sleep(60 * 1000);
                //SincronizarThreads();
                randy = new Random();
                lock (lockObject)
                {
                    #region Erudito
                    var id = nuevoId();
                    var posx = randy.Next(0, 8) * 32;
                    var posy = randy.Next(0, 4) + 32;
                    var criatura = new CriaturaBack(id, posx, posy, "erudito", randy);
                    eruditos.Add(id, criatura);
                    crearElementoFrontEnd(criatura);
                    criatura.MoverElemento += moverElementoFrontEnd;
                    criatura.ndDelegate = ndDelegate;
                    criatura.IniciarMovimiento();
                    #endregion

                    #region Soldado
                    id = nuevoId();
                    posx = randy.Next(22, 32) * 32;
                    posy = randy.Next(18, 22) * 32;
                    criatura = new CriaturaBack(id, posx, posy, "soldado", randy);
                    soldados.Add(id, criatura);
                    crearElementoFrontEnd(criatura);
                    criatura.MoverElemento += moverElementoFrontEnd;
                    criatura.ndDelegate = ndDelegate;
                    criatura.IniciarMovimiento();
                    #endregion
                    //ReiniciarMovimiento();
                }
            }
        }
Exemplo n.º 11
0
 public void crearErmitano(double X, double Y)
 {
     bool crear = true;
     if (X > 670 && Y < 180) //agua
         crear = false;
     else if (X > 675 && Y < 183)
         crear = false;
     if (X < 65 && Y > 219 && Y < 417) //arboles
         crear = false;
     if (crear)
     {
         CriaturaBack ermitano = new CriaturaBack(nuevoId(), X, Y, "ermitano", randy);
         ermitanos.Add(ermitano.id, ermitano);
         ermitano.ndDelegate = ndDelegate;
         ermitano.MoverElemento += moverElementoFrontEnd;
         ermitano.IniciarMovimiento();
         crearElementoFrontEnd(ermitano);
     }
 }
Exemplo n.º 12
0
 public void crearErmitano()
 {
     CriaturaBack ermitano = new CriaturaBack(nuevoId(), randy.Next(0, 1000), randy.Next(0, 680), "ermitano", randy);
     ermitanos.Add(ermitano.id, ermitano);
     ermitano.ndDelegate = ndDelegate;
     ermitano.MoverElemento += moverElementoFrontEnd;
     ermitano.IniciarMovimiento();
     crearElementoFrontEnd(ermitano);
 }
Exemplo n.º 13
0
 public void crearElementoFrontEnd(CriaturaBack criatura)
 {
     if (CrearElementoFront != null)
     {
         CrearElementoFront(criatura);
     }
 }