Una pequeña experiencia de escribir pequeños juegos en Java

Para consolidar la base de Java, escribí un pequeño juego de Thunder Fighter, usando el conocimiento del swing y el hilo Java, y luego aprendí Spring y Mybatis, así que escribí un servidor basado en TCP para administrar algunos datos básicos de jugadores Después, esta vez compartiré algunos de mis pensamientos sobre escribir este juego.
Primero pon la foto primero
Inserte la descripción de la imagen aquí
Esta es la imagen en el juego.

Hay demasiadas páginas de inicio de sesión, la página principal, etc., pero no se publican. Para presentar brevemente, la jugabilidad es similar a la del luchador Thunder. Hay 4 habilidades en el control del mouse o del teclado. Después de que se liberan las habilidades, hay una contracción. La primera imagen es jugar a un soldado, y la segunda imagen es jugar a un jefe. Después del final, el resultado se carga en el servidor.

1. He escrito dos blogs sobre el problema de parpadeo en la pantalla
https://blog.csdn.net/D1124615130/article/details/104436930

https://blog.csdn.net/D1124615130/article/details/104439034

2. Demasiados resultados de cálculo del juego se congelan en la pantalla.
Mi método es abrir dos hilos, uno dedicado al dibujo y el otro al procesamiento de datos. La frecuencia de actualización del hilo de procesamiento de datos es preferiblemente mayor que la frecuencia del dibujo.

3. Los objetos en el contenedor pueden aparecer cuando el juego Thunder Fighter se juega durante mucho tiempo. Cuando el recorrido es demasiado grande, los datos se atascarán, y los objetos caducados deben limpiarse a tiempo (como fuera del alcance de la pantalla, el jugador los mata, etc.)

while(!enemys.isEmpty()&&(enemys.peek()==null||!enemys.peek().isAlive()))
			enemys.poll();

Los enemigos son objetos ConcurrentLinkedQueue. Por supuesto, el contenedor debe ser seguro para subprocesos. El
código anterior se llama antes del procesamiento de datos, y algunos datos obsoletos se limpiarán primero.

4. Suspender , mi método:
este es un hilo de dibujo.
Lock es una clase que escribí en modo singleton. Hay un semáforo, una suspensión de tipo booleano y un bloqueo de tipo Object.
Semaphore se usa para solicitar acceso al tipo booleano suspendido, y luego usa el bloqueo para llamar a la espera

class DrawThread extends Thread{
		@Override
		public void run() {
			while(true) {
				try {
					Lock.getSemaphore().acquire();
					if(Lock.isSuspend()) {
						Lock.getSemaphore().release();
						Object lock=Lock.getLock();
						synchronized (lock) {
							lock.wait();
						}
						requestFocus();
					}else
						Lock.getSemaphore().release();
				} catch (InterruptedException e1) {
					e1.printStackTrace();
				}
				repaint();
				try {
					sleep(Data.REFALSH_INTERVAL);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
	}

Para despertar el hilo dormido, hice esto:

try {
		Lock.getSemaphore().acquire();
		Lock.setSuspend(false);
		Lock.getSemaphore().release();
	} catch (InterruptedException e1) {
		e1.printStackTrace();
	}
	Object lock=Lock.getLock();
	synchronized (lock) {
		lock.notifyAll();
	}

Después de varias pruebas, no hubo ningún problema. También siento que este código es muy problemático. Si tiene una mejor manera, por favor deme un comentario. Gracias.

21 artículos originales publicados · me gustaron 0 · visitas 721

Supongo que te gusta

Origin blog.csdn.net/D1124615130/article/details/104559665
Recomendado
Clasificación