L'histoire de la création d'un lanceur de jeu avec une fonction de chargement automatique [Java]

1.Tout d'abord

J'appartiens à un club qui fait des jeux à l'université. Étant donné que le nombre de personnes connaissant les spécifications du lanceur de jeu (ci-après, le lanceur de jeu est parfois appelé le lanceur) qui a été utilisé pour afficher des jeux pendant de nombreuses années au festival de l'école est en baisse, j'ai essayé de le recréer à partir de zéro. C'était. Il y a diverses choses que je ne pourrais pas faire à temps, mais j'aimerais en parler car cela a pris forme.   Cet article ne concerne pas vraiment le côté design du lanceur. ** Nous parlerons principalement de la façon de charger automatiquement, de la structure des dossiers de données et des difficultés. ** J'aurais aimé pouvoir l'expliquer de manière facile à comprendre même si le langage que j'essaie de créer n'est pas Java.

スクリーンショット 2019-11-11 22.01.36.png スクリーンショット 2019-11-11 22.01.44.png ~~ Un joli en-tête a été collé dans la partie vide de la journée, mais pour une raison quelconque, je vais le cacher ;; ~~

2. Éléments à prendre en compte et à préparer avant de commencer à créer un lanceur

・ Pour Java

-IDEs comme Eclipse -Environnement d'exécution Java En Java, un fichier Jar est créé lorsqu'un fichier exécutable Jar pour l'application est généré. Le dernier environnement d'exécution (jdk ou jre) doit être défini pour démarrer le fichier Jar. C'est gênant car le paramètre est requis même sur l'ordinateur qui lance le lanceur. Utilisez également le cadre pour garder votre conception propre! Veuillez vous référer à: https://www.sejuku.net/blog/60411

・ Pour les autres langues

C'est fondamentalement le même que Java. Environnement de développement intégré IDE et environnement d'exécution pour son langage. Et vous devez vérifier à l'avance si cela fonctionne sur un ordinateur qui fonctionne correctement lorsqu'il devient un lanceur. En outre, vous devrez vérifier à partir du programme si le fichier exe, etc. fonctionne correctement. Recherchez "OOO GUI" etc. pour voir si vous pouvez créer le design que vous souhaitez.

3. Pour faire un bon lanceur

Pensons à l'avance aux fonctions nécessaires. Par exemple, dans le cas de mon lanceur ・ Comme fonction ・ Fonction de phrase fixe ・ Une fonction pour afficher préférentiellement les œuvres qui n'ont pas encore été beaucoup jouées ・ Fonction de chargement automatique pour les jeux, etc. (en fait, il prend également en charge les vidéos, etc.) Surtout pour la dernière partie, j'ai pensé que ce serait bien si non seulement je pouvais mettre à jour le lanceur, mais que tout le monde pourrait le mettre à jour en regardant les spécifications.

4. Structure des dossiers et préparation de la lecture

Je vais vous présenter la structure des dossiers de mon lanceur. Pensons-y correctement car c'est un lanceur de la fonction de chargement automatique.

project  ├src  ├data │ └ images (images utilisées pour le lanceur, etc.) │ └ logs (dossier pour enregistrer le nombre de likes et le temps de lecture des oeuvres)  └ExhibitionDatas    └Games │ └ Données de jeu    └Graphics └ Données vidéo, etc.

スクリーンショット 2019-11-16 8.24.35.png

Dans mon lanceur, j'ai utilisé un fichier appelé launcher_config.ini (fichier de propriétés en java) pour expliquer le travail sur le lanceur et comment le faire fonctionner. Plus précisément, cela ressemble à ce qui suit.

スクリーンショット 2019-11-16 8.21.44.png スクリーンショット 2019-11-14 4.42.59.png

Le fichier ini est essentiellement au format texte "Nom" = valeur C'est comme l'écrire comme un fichier texte. Avec cela, vous pouvez manipuler la sortie sur le lanceur en peaufinant ce texte sans avoir à jouer avec le contenu du lanceur. Si vous demandez à quelqu'un qui souhaite mettre un jeu dans le lanceur de créer ce fichier ini, vous pourrez jouer au jeu sur le lanceur!

スクリーンショット 2019-11-14 4.58.52.png

5. Débit jusqu'à ce que le lanceur puisse exécuter le jeu

Tout d'abord, la classe préparée ・ Classe de données de jeu (classe qui enregistre le contenu du fichier ini presque tel quel) ・ Classe de gestionnaire de données de jeu (classe qui gère toutes les classes de données de jeu) Fonctions requises etc. ・ Fonction pour lire le fichier ini Référence: https://qiita.com/motoki1990/items/2b643ea854624b09712c ・ Fonction de recherche de fichier est.

qiita.java


private ArrayList<String> fileSearch(String path, String fileName){
        File dir = new File(path);
        File files[] = dir.listFiles();
        for(int i=0; i<files.length; i++){
            if(files[i].isDirectory()){  //S'il s'agit d'un répertoire, effectuez une récurrence
                fileSearch(path+"/"+files[i].getName(), fileName);
            }else{
                if(file_name.equals(fileName)){  //Sortie si le fichier spécifié est trouvé
                	resultPaths.add(dir.getAbsolutePath()+"/");
                }
            }
        }
        return resultPaths;
    }

Tout d'abord, passez le dossier déterminé par la fonction de recherche de fichiers (ExhibitionData car nous voulons lire les données du jeu cette fois) et le nom du fichier ini (launcher_config.ini dans mon cas) à la fonction de recherche de fichiers. ↓ Le chemin d'accès au fichier ini sera renvoyé et la classe du gestionnaire de données de jeu l'utilisera. Mettez les données du fichier de chemin obtenu dans toutes les classes de données de jeu. À ce stade, utilisez la fonction pour lire le fichier ini ↓ Lanceur lancé ↓ Si l'action pour démarrer le jeu est terminée, le gestionnaire de données Lire et exécuter le chemin d'accès au fichier d'exécution de la classe de données de jeu du jeu à démarrer ↓ Le lanceur ne traite pas pendant que le jeu est en cours d'exécution

Est le flux principal. Vous pourrez peut-être exécuter le fichier exécutable de différentes manières avec java Dans le cas de moi, J'ai utilisé une bibliothèque Java standard appelée ProcessingBuilder. En un mot, vous serez en mesure de faire ce que vous pouvez avec cmd. Par conséquent, vous pouvez l'exécuter en passant le chemin du fichier d'exécution du jeu comme argument en utilisant this. Étant donné que ProcessingBuilder gère toujours s'il est en cours d'exécution ou non, vous pouvez configurer le lanceur pour qu'il ne fonctionne pas pendant ce temps (pratique!)

6. Où il se coince

Au début, certaines d'entre elles pouvaient être réalisées à l'aide de Processing Builder et d'autres non. Je ne connaissais pas la cause, mais si vous tapez simplement le chemin du fichier d'exécution, vous pouvez l'exécuter avec cmd Dans processingBuilder, si vous vous déplacez d'abord vers le fichier où se trouve le fichier exécutable, puis entrez le nom du fichier exécutable Il semble que cela puisse être exécuté. En particulier $ asdf / test / hogehoge / game.exe (← Traitement des bogues du constructeur) ↓ $ cd asdf/test/hogehoge $ game.exe C'est comme ça. Si quelqu'un a le même contenu, essayez-le.

7. Enfin

c'est tout, C'était le premier message. Dès la prochaine fois, je ferai de mon mieux pour l'écrire un peu plus concis. Si vous avez des questions, n'hésitez pas.

Sites qui ont été très utiles: https://qiita.com/massoumen/items/66d26b08333aeae1c0ea

Recommended Posts

L'histoire de la création d'un lanceur de jeu avec une fonction de chargement automatique [Java]
L'histoire de la création d'un proxy inverse avec ProxyServlet
L'histoire de la création de DTO, semblable à Dao avec Java, SQLite
Histoire de créer une application de gestion de tâches avec Swing, Java
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
L'histoire de la création d'un jeu d'Othello de type communication avec Scala.
L'histoire de la fabrication d'un Othello ordinaire à Java
Une histoire remplie des bases de Spring Boot (résolu)
[Édition Java] Histoire de la sérialisation
L'histoire de la création d'une version Java du serveur Minecraft avec GCP (et également de la création d'une liste blanche)
L'histoire du refactoring avec un assistant personnel pour la première fois dans une application Rails
Une histoire qui a eu du mal avec l'introduction de Web Apple Pay
[Illustration] Recherche de la somme des pièces avec une fonction récursive [Ruby]
L'histoire de l'écriture de Java dans Emacs
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Exprimons le résultat de l'analyse du code d'octet Java dans un diagramme de classes
L'histoire de rendre possible la construction d'un projet qui a été construit par Maven avec Ant
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
Je voulais écrire un processus équivalent à une instruction while avec l'API Java 8 Stream
L'histoire de la comparaison de chaînes de bas niveau en Java
Une histoire sur le JDK à l'ère de Java 11
L'histoire de l'apprentissage de Java dans la première programmation
Une histoire sur la compatibilité d'un Dockerfile existant avec le GPU
Mesurer la taille d'un dossier avec Java
L'histoire du réglage de l'application Android avec libGDX
Une histoire sur la création d'un Builder qui hérite du Builder
Calculer le score de similarité des chaînes de caractères avec JAVA
Une histoire confirmant l'implémentation de la bibliothèque Java SendGrid lorsque la livraison du courrier échoue
Valider le jeton d'ID d'un utilisateur authentifié par AWS Cognito en Java
[Jackson] Une histoire sur la conversion de la valeur de retour du type BigDecimal avec un sérialiseur personnalisé.
Ecrire un test en mettant en œuvre l'histoire de M. Nabeats dans le monde avec du rubis
Implémentons une fonction pour limiter le nombre d'accès à l'API avec SpringBoot + Redis
[Java] Découpez une partie de la chaîne de caractères avec Matcher et des expressions régulières
CI l'architecture des applications Java / Kotlin avec ArchUnit
[Débutant] Créez un jeu compétitif avec des connaissances de base sur Java
Surveillez l'état interne des programmes Java avec Kubernetes
Vérifiez le comportement de Java Intrinsic Locks avec bpftrace
[Java] Lors de l'écriture du source ... Mémorandum ①
Une histoire sur le développement de ROS appelé rosjava avec java
L'histoire de la création de Dr.Orchid avec LINE BOT
Une vue d'ensemble du framework Java natif de Kubernetes Quarkus
Une histoire de rendre catkin_make de rosjava compatible hors ligne
Remplacez seulement une partie de l'hôte URL par java
L'histoire du transfert d'un conteneur Docker vers le registre de packages GitHub et Docker Hub avec des actions GitHub
Une explication rapide des cinq types de statique Java
[Débutant] Essayez de créer un jeu RPG simple avec Java ①
20190803_Java & k8s sur Azure L'histoire d'aller au festival
Vérifier le fonctionnement de deux rôles avec une application de chat
Je veux créer une fonction avec kotlin et java!
Une note sur la fonction de départ de Ruby on Rails
[Java] Simplifiez la mise en œuvre de la gestion de l'historique des données avec Reladomo
Implémentation d'un analyseur de syntaxe mathématique par méthode d'analyse syntaxique descendante récursive (Java)
Une histoire à laquelle j'étais accro avec toString () d'Interface qui était proxy avec JdkDynamicAopProxy
Expliquez les mérites du modèle d'État avec le jugement de notation du film
À propos du comportement lors de la création d'un mappage de fichiers avec Java
L'histoire de la transmission de Java à Heroku à l'aide du pipeline BitBucket
Assurez-vous de comparer le résultat Java compareTo avec 0
[Trading automatique de Bitcoin] Histoire de fonctionnement avec Docker d'AWS, avec notification ON / OFF et ligne avec 1 TAP d'Apple Watch en déplacement