none
Como desactivar "mantener apretado" en un boton, dentro de wpf RRS feed

  • Pregunta

  • Estoy armando un pequeno juego en 2d, digamos que estoy haciendo la base, pero solo el unico inconveniente que tengo es que al mantener presionado, la fase de acumulacion de y, sigue siendo constante, podria suplantarlo por un bucle, pero de momento estoy usando un acumulativo y timer. Basicamente, tengo un personaje (primero) que salta, baja y se mueve de izquierda derecha, el problema esta, que cuando mantengo apretado, no para de saltar, le puse un limitador para que no siga de largo, lo que necesito saber, es si existe algun mecanismo, que solo te deje pulsar una vez y de deshabilite el dejar mantenido pulsado la tecla, osea Window_KeyDown ... Se que esta la de soltar que es Window_KeyUp, pero eso no interfiere que el KeyDown, deje de mantener la pulsacion.

    Aca les dejo el codigo

          public MainWindow()
            {
                
                InitializeComponent();
    
                primero = new Personaje(Canvas);
                dp = new DispatcherTimer();
                dp.Interval = new TimeSpan(0, 0, 0, 0, 40);
                
                dp.Tick += new EventHandler(dp_tick);
                dp.IsEnabled = true;
            }
    
    
    
            public void dp_tick(object sender, EventArgs e)
            {     
                primero.MainMove();
                CordY.Content = primero.y;
    
                if (primero.y <= 200)
                {
                    primero.SaltarOff();
                }
    
                if(primero.y >= 265)
                {
                    primero.PararY();
                }
            }
    
            private void Window_KeyDown(object sender, KeyEventArgs e)
            {
                {
    
                    if (e.Key == Key.D)
                    {
                        primero.MovimientoDer();
                    }
    
                    if (e.Key == Key.A)
                    {
    
                        primero.MovimientoIzq();
                    }
    
                    if (e.Key == Key.Space)
                    {
                        primero.Saltar();
    
                        if (primero.y <= 200)
                        {
                            primero.SaltarOff();
                        }
    
                        
                    }
    
                }
            }
    
    
            private void Window_KeyUp(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.D)
                {
                    primero.PararX();
                }
    
                if( e.Key == Key.A)
                {
                    primero.PararX();
                }
    

    martes, 7 de enero de 2020 21:44

Todas las respuestas

  • Hola Thepistoleru

    Podes tener una variable bool que se llame estaSaltando, que arranque en false. Cuando pulsas la tecla de salto, si estaSaltando es false (y si estás pisando tierra, también, porque no podes saltar si ya estás en el aire, o si estás muerto, por ejemplo), das la orden de saltar y pones estaSaltando en true. Cuando aterrizas, o sea cuando tocas tierra firme, pones estaSaltando en false.

    Igual me resulta raro esto del evento KeyDown ... habría creido que lo toma sólo una vez la pulsación de la tecla, hasta que se suelta 

    En SFML.Net tenes los Eventos KeyPressed (se pulsó la tecla) y KeyReleased (se soltó la tecla), entiendo que es más fácil

    También, el asunto del salto, es mucho más complejo de lo que parece, te lo digo por experiencia en Super Mario

    Saludos

    Pablo

    EDITO: Hay que ver también como definiste el método Saltar()
    martes, 7 de enero de 2020 22:32