Une petite expérience d'écriture de petits jeux en java

Afin de consolider les bases de java, j'ai écrit un petit jeu de Thunder fighter, en utilisant les connaissances du swing et du thread javaSE, puis j'ai appris Spring et Mybatis, j'ai donc écrit un serveur basé sur TCP pour gérer certaines données de base des joueurs Ensuite, cette fois, je partagerai certaines de mes réflexions sur l'écriture de ce jeu.
Mettez d'abord l'image en premier
Insérez la description de l'image ici
C'est l'image du jeu

Il y a trop de pages de connexion, la page principale et ainsi de suite, mais elles ne sont pas publiées. Pour présenter brièvement, le gameplay est similaire au Thunder fighter. Il y a 4 compétences dans le contrôle de la souris ou du clavier. Une fois les compétences libérées, il y a un rétrécissement. La première image est de jouer un soldat, et la deuxième image est de jouer un boss. Après la fin, le résultat est téléchargé sur le serveur.

1. J'ai écrit deux blogs sur le problème du scintillement sur l' écran
https://blog.csdn.net/D1124615130/article/details/104436930

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

2. Trop de calculs de jeu entraînent un gel d'écran.
Ma méthode consiste à ouvrir deux threads, l'un dédié au dessin et l'autre dédié au traitement des données. La fréquence de rafraîchissement du thread de traitement des données est de préférence supérieure à la fréquence du dessin.

3. Des objets dans le conteneur peuvent apparaître lorsque le jeu Thunder Fighter est joué pendant une longue période. Lorsque la traversée est trop grande, les données seront bloquées et les objets expirés devraient être nettoyés à temps (comme être hors de portée de l'écran, être tué par le joueur, etc.)

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

Les ennemis sont des objets ConcurrentLinkedQueue. Bien sûr, le conteneur doit être thread-safe. Le
code ci-dessus est appelé avant le traitement des données, et certaines données obsolètes seront d'abord nettoyées.

4. Suspendre , ma méthode:
Ceci est un fil de dessin.
Lock est une classe que j'ai écrite en mode singleton. Il y a un sémaphore, une suspension de type booléen et un verrou de type Object.
Le sémaphore est utilisé pour demander l'accès à la suspension de type booléen, puis utiliser le verrouillage pour appeler wait

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();
				}
			}
	}

Pour réveiller le fil endormi, j'ai fait ceci:

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

Après quelques essais, il n'y a pas eu de problème. Je pense aussi que ce code est très gênant. Si vous avez une meilleure solution, merci de me faire un commentaire. Merci.

Publié 21 articles originaux · loué 0 · visites

Je suppose que tu aimes

Origine blog.csdn.net/D1124615130/article/details/104559665
conseillé
Classement