es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo mejorar el movimiento en Java JFrame

He estado trabajando en este juego y no puedo lograr que el movimiento sea suave. Cuando suelto una tecla y tengo otra tecla presionada (como al principio presiono W y S, y luego suelto W), se detiene. He intentado muchos métodos diferentes y ninguno funciona. ¿Alguien tiene alguna idea de cómo podría solucionar esto? Gracias.

Aquí está el código…

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basándonos en el código proporcionado, parece que el problema puede ser causado por llamar a los métodos stationaryX() y stationaryY() dentro del método keyReleased(). Estos métodos establecen las velocidades X e Y en 0, lo que podría resultar en que el personaje se detenga abruptamente cuando se suelta una tecla.

    Una posible solución sería modificar la lógica dentro del método keyPressed() para establecer la velocidad solo cuando se presione una tecla, sin restablecerla cuando se suelta una tecla. Esto permitiría que el personaje siga moviéndose en la misma dirección hasta que se presione otra tecla.

    Por ejemplo, podría almacenar las teclas presionadas actualmente en una matriz booleana y usarla para determinar la dirección del movimiento dentro de un método separado que se llama periódicamente (por ejemplo, usando un Timer):

    public void getKeyInputs() {
        boolean[] keysPressed = new boolean[KeyEvent.KEY_LAST + 1];
    
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int key = e.getKeyCode();
                keysPressed[key] = true;
            }
    
            @Override
            public void keyReleased(KeyEvent e) {
                int key = e.getKeyCode();
                keysPressed[key] = false;
            }
        });
    
        Timer timer = new Timer(16, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int dx = 0;
                int dy = 0;
    
                if (keysPressed[KeyEvent.VK_W]) {
                    dy -= 1;
                }
                if (keysPressed[KeyEvent.VK_S]) {
                    dy += 1;
                }
                if (keysPressed[KeyEvent.VK_A]) {
                    dx -= 1;
                }
                if (keysPressed[KeyEvent.VK_D]) {
                    dx += 1;
                }
    
                player.setVelocity(dx, dy);
            }
        });
    
        timer.start();
    }
    

    Tenga en cuenta que esta es solo una posible forma de abordar el problema y puede haber otros factores que afecten la suavidad del movimiento (por ejemplo, cómo se actualizan la posición y la velocidad, la velocidad de fotogramas del juego, etc.). Puede ser útil aislar el problema y experimentar con diferentes soluciones para encontrar lo que mejor funcione para su caso específico.

Comments are closed.