none
Como borrar objeto RRS feed

  • Pregunta

  • Necesito borrar F1 y F2, cuando el objeto primero llegue a dichas coordenadas como lo dejo escrito en el codigo.

        public partial class MainWindow : Window
        {
            Personaje primero;
            DispatcherTimer dp;
            Floor F1, F2, F3, F4;
            int Fx1=0, Fx2=70, Fy1=195, Fy2=100;
            int Piso = 265; //1[265]
            int Techo = 200; //1[200] - Inhabilitada de momento
    
    
            public MainWindow()
            {
                
                InitializeComponent();
    
                //Genera objetos
    
                primero = new Personaje(Canvas);
                F1 = new Floor(Canvas, Fx1, Fy1); 
                F2 = new Floor(Canvas, Fx2, Fy2);
                
                
    
                dp = new DispatcherTimer();
                dp.Interval = new TimeSpan(0, 0, 0, 0, 25);
                
                dp.Tick += new EventHandler(dp_tick);
                dp.IsEnabled = true;
    
            }
    
            public void dp_tick(object sender, EventArgs e)
            {
                primero.MainMove();
    
    
                if (primero.x >= 690 && primero.x <= 760 && primero.y == 65)
                {
                    primero.x = 20;
                    primero.y = 265;
    
    
    
                }

    miércoles, 15 de enero de 2020 5:08

Todas las respuestas

  • Investigando un poco, creo que la solucion seria un list, aca trate de implementarlo, aunque igualmente no me funciona del todo correcto y sigue sin eliminar, pero bueno, tal vez ustedes lo puedan pullir o buscar otra alternativa mejor.

        public partial class MainWindow : Window
        {
            Personaje primero;
            DispatcherTimer dp;
            List<Floor> Lista = new List<Floor>();
           
            Floor F1, F2, F3, F4;
            int Fx1=0, Fx2=70, Fy1=195, Fy2=100;
            int Piso = 265; //1[265]
            int Techo = 200; //1[200] - Inhabilitada de momento
    
    
            public MainWindow()
            {
    
    
                InitializeComponent();
    
                
    
    
                //Genera objetos
    
                primero = new Personaje(Canvas);
    
    
    
    
                dp = new DispatcherTimer();
                dp.Interval = new TimeSpan(0, 0, 0, 0, 25);
                
                dp.Tick += new EventHandler(dp_tick);
                dp.IsEnabled = true;
    
            }
    
            public void dp_tick(object sender, EventArgs e)
            {
                primero.MainMove();
    
                if (primero.x >= 0 && primero.x <= 400)
                    {
                    Lista.Add(F1 = new Floor(Canvas, 0, 195));
                    Lista.Add(F2 = new Floor(Canvas, 70, 100));
    
                }
    
    
                if (primero.x >= 690 && primero.x <= 760 && primero.y == 65)
                {
                    Lista.Remove(F1);
                    Lista.Remove(F2);
                    
                    
    
    
    
                    primero.x = 20;
                    primero.y = 265;
    
    
    
                }

    Son dos pisos, digamos que es un juego que estoy armando y simplemente lo estoy perfeccionando, el problema seria que el personaje (primero) al llegar a la meta, se reinicia, pero los floor, no se eliminan, lo que necesito hacer es que se eliminen de algun modo. Sino otra, es armar un Singleton, llamando a la clase Floor y lo configuro todo desde ahi, pero es mas trabajo, cuando tal vez haya alguna funcion mas sencilla. Tipo que el singleton, cuando el jugador toca dichas coordenadas, se efectue el cambio de dibujos en un valor null y desaparezca desde ahi, se me ocurre eso ...


    miércoles, 15 de enero de 2020 6:04
  • hola

    >>igualmente no me funciona del todo correcto y sigue sin eliminar,

    pero puedes validar que se cumple la condicion del if ?

    en el codigo veo que evaluas unas propiedades x-y pero si pones un breakpoint puedes ver que ingresa al if para eliminar de a lista

    No se como asignas esos valores de movimiento, pero que pongas un primero.y== 65 implica que debe llegar exactamente a ese valor para ingresar

    quizas no elimina porque nunca se cumple la condicion del if

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 15 de enero de 2020 13:21
  • La condicional IF se cumple, pero lo que no desaparece es la imagen, queda intacta, por eso hay algo que no esta funcionando adecuadamente. Digamos que hice 2 pisos distintos, en cada piso el personaje primero, se frenta en una cordenada Y, la ultima cordenada Y, seria la 65, siempre va estar en 65, una vez que llega dentro del rango de x que designe, el personaje primero, vuelve al lugar de origen donde siempre comienza y se deberian borrar los floor, que es una clase donde dibuja un piso. 
    jueves, 16 de enero de 2020 3:27
  • hola

    >>pero lo que no desaparece es la imagen,

    pero la imagen que tiene que ver

    cuando eliminas un item de la lista quitas su refernecia, pero el canvas aun sigue referenciado desde la UI

    si quiere eliminarlo primer deberias quitarlo de la UI y luego de la lista

    Lo que no veo ese canvas como lo representas en pantalla, porque veo la instancia que agregas a la lista, pero despues donde lo pones para que se visualice ?

    cuando detectas que una instancia de la lista se debe eliminar antes deberias buscar la instancia del canvas de ese item, quitarlo de la UI y luego si eliminar el item de la lista

    Recuerda que son objetos que apuntan a una referencia en memoria, puedes eliminar un puntero a esa posicion pero aun quedar otros como es el caso del canvas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 16 de enero de 2020 5:32
  • Acá logre corregir un poco el código, pero solamente se me elimina un solo objeto, no los dos, te paso igual todo para que lo veas

    public MainWindow() { SharedInstance = this; // Singleton InitializeComponent(); primero = new Personaje(Canvas); Lista.Add(F1 = new Floor(Canvas, Fx1, Fy1)); Lista.Add(F2 = new Floor(Canvas, Fx2, Fy2)); //Genera objetos dp = new DispatcherTimer(); dp.Interval = new TimeSpan(0, 0, 0, 0, 25); dp.Tick += new EventHandler(dp_tick); dp.IsEnabled = true; } public void dp_tick(object sender, EventArgs e) { primero.MainMove(); //Tengo que llamar al canvas c del floor

                if (primero.x >= 700 && primero.x <= 760 && primero.y == 265)
                {
                    Lista.Remove(F1);
                    Lista.Remove(F2);
                    Floor.SharedInstance.c.Children.Remove(Floor.SharedInstance._F);

                }

    if (primero.x >= 690 && primero.x <= 760 && primero.y <= 65) { primero.x = 20; primero.y = 265; } Clase Floor

    class Floor { public static Floor SharedInstance; public int x, y; public int w = 700; public int h = 5; public Canvas c; public Rectangle _F = new Rectangle(); public SolidColorBrush CF1 = new SolidColorBrush(); public Floor(Canvas c, int x, int y) { SharedInstance = this; this.x = x; this.y = y; this.c = c; CF1.Color = Color.FromRgb(0, 255, 0); _F.Width = w; _F.Height = h; _F.Fill = CF1; Canvas.SetTop(_F, y); //195 Canvas.SetLeft(_F, x); // 0 c.Children.Add(_F);


    Solo se me borra el primer objeto, pero el segundo queda intacto, como si solo lo hace una vez, hay alguna manera de que borre los dos? borre la referencia, también lo borre desde la UI

    martes, 21 de enero de 2020 20:02