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 detener la representación de posiciones antiguas al mover una imagen en Java?

Construí un pequeño juego en Java en el cual uso un bucle de juego. Agrego gameobjects que renderizo usando los métodos render() y tick(). Sin embargo, ahora que el programa se ha vuelto más grande, encontré un problema. ¿Cómo puedo solucionar que cuando uso la velocidad para mover una imagen, el objeto siga representándose en posiciones antiguas? Para programas pequeños esto no es un problema, pero cuando hay como 100 objetos en la pantalla, los FPS (cuadros por segundo) comienzan a disminuir hasta el punto en que el programa deja de funcionar correctamente. Esto se debe únicamente a la gran cantidad de objetos para representar. ¿Existe alguna forma de eliminar la representación de las posiciones antiguas del objeto? Aquí abajo hay un poco de código que he escrito.

El bucle de juego que usé:

public void run() {
    this.requestFocus();
    long lastTime = System.nanoTime();
    double amountOfTicks = 60.0;
    double ns = 1000000000 / amountOfTicks;
    double delta = 0;
    long timer = System.currentTimeMillis();
    int frames = 0;

    while (running) {
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;

        while (delta >= 1) {
            tick();
            delta--;
        }

        if (running) {
            try {
                render();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (FontFormatException e) {
                e.printStackTrace();
            }
        }

        frames++;

        if (System.currentTimeMillis() - timer > 1000) {
            timer += 1000;
            System.out.println("FPS: " + frames);
            frames = 0;
        }
    }
    stop();
}

Usé la clase Graphics en Java para dibujar las imágenes/cadenas/rectángulos/etc. en el JFrame.

Aquí abajo hay una imagen del problema. Puedes ver que el objeto empezó todo el camino a la derecha. Cambié el eje x en cada tic del bucle de juego, lo cual hizo que el objeto se moviera hacia la izquierda. Desafortunadamente, el objeto deja una estela detrás y sigue representando eso, mientras quiero que sólo represente la posición más reciente.

Imagen del problema de representación del objeto:

Foto

¿Cómo puedo solucionar esto? Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una solución a este problema es borrar la pantalla antes de renderizar el siguiente cuadro. Puedes hacer esto llamando al método clearRect() en el objeto Graphics antes de renderizar los objetos.

    private void render() {
        BufferStrategy bs = this.getBufferStrategy();
        if (bs == null) {
            this.createBufferStrategy(3);
            return;
        }
    
        Graphics g = bs.getDrawGraphics();
    
        // Borrar la pantalla
        g.clearRect(0, 0, ANCHO, ALTO);
    
        // Renderizar los objetos del juego
        for (GameObject obj : gameObjects) {
            obj.render(g);
        }
    
        g.dispose();
        bs.show();
    }
    

    Esto llenará la pantalla con el color de fondo antes de renderizar los objetos del juego, asegurándose de que no queden píxeles residuales del cuadro anterior.

    También puedes experimentar con optimizar el proceso de renderizado al renderizar solo los objetos del juego que son visibles en la pantalla, o al utilizar el doble búfer para mejorar el rendimiento.

Comments are closed.