Threads en Java

Kiroushi

Hola,

He preguntado en el hilo de Java del foro de desarrollo, pero creo que esta pregunta está mejor situada aquí.

En la asignatura de OOP de la Uned, la práctica consiste en programar un Pacman en Java.

Es la primera vez que toco el lenguaje y la programación de juegos, pero como tengo experiencia previa con C++, PHP y JS me ha resultado bastante sencillo ponerme al día.

La única duda que me surge es el saber si en los juegos, independientemente del game loop y su timestep (fijo o variable), es bueno tener un thread independiente para cada personaje que se dibuje en pantalla.

Estoy usando ahora mismo este loop:

while(playing) {
    if (!this.paused) {
        double currTime = (double)System.nanoTime() / 1000000000.0;
        if((currTime - nextTime) > maxTimeDiff) nextTime = currTime;
         if(currTime >= nextTime) {
            nextTime += delta;
	
        try {
        doGameUpdates();
    } 
        catch (InterruptedException e) {
            e.printStackTrace();
        }

        if((currTime < nextTime) || (skippedFrames > maxSkippedFrames)) {
            repaint();
            skippedFrames = 1;
        } else {
            skippedFrames++;
        }
    } else {
        int sleepTime = (int)(1000.0 * (nextTime - currTime));
    
        if(sleepTime > 0) {
            try {
                Thread.sleep(sleepTime);
            }
        catch(InterruptedException e) {
                    	
            }
        }
     }
}
}
FrioneL

Crear un thread por cada personaje con logica que tengas en pantalla es una burrada.

El diseño de un juego se basa en el game loop, que viene a ser un thread que controla todo el flujo del juego, que por lo que vi por encima, es eso que tienes ahi. En la llamada ' doGameUpdates(); ' es donde tienes que llamar a cada elemento en pantalla para que haga su faena: logica y pintado.

1
B

Muestra a todos los personajes con el mismo thread

Kiroushi

Guardo las posiciones en doubles y multiplico la velocidad por el incremento en delta, no? Y luego para dibujar hago el cast a ints.

1 respuesta
DaRk-eXe

#4 cuando necesito que los enemigos hagan algo en particular, por ejemplo, crear varios en un intervalo de tiempo y que hagan todos el mismo movimiento, estilo jueguecito de naves, hago Timer.schedule() y voy añadiendo Timer.Tasks (hablando siempre de java con libgdx claro).

karlozalb

Soy de la opinión de un thread también

Kiroushi

Al final lo he metido en un thread, pero usando posiciones de tipo Point2D.Double.

El incremento de posición lo hago tal que:

+= (int) Math.cos(direction) * this.speed * delta

Y a la hora de dibujar hago cast a int. Por ahora parece que va bien.

Usuarios habituales