[# 1] Créez Minecraft avec Python. ~ Recherche préliminaire et conception ~

Part of pictures, articles, images on this page are copyrighted by Mojang AB.

minecraft.png

Aperçu

Il s'agit d'un projet visant à reproduire le célèbre jeu de bac à sable "Minecraft" dans le langage de programmation "Python".

Article suivant: [# 2] Créez Minecraft avec Python. ~ Dessin du modèle et implémentation du lecteur ~

Déclencheur

"Minecraft" était la première fois que je suis entré en contact avec la programmation.

C'était il y a plus de 4 ans. Je m'intéressais au contenu dit remodelé appelé "MOD" dans Minecraft, et je suis entré dans le monde de la programmation en disant "Je veux le faire moi-même!". Avec une durée de jeu totale de plus de dizaines de milliers d'heures, c'est l'un des nombreux jeux mémorables.

Depuis que je suis dans les classes inférieures de l'école élémentaire, j'ai fait des activités créatives, comme la création d'un site Web. Lorsque vous programmez une «chose» en utilisant un langage de programmation et que cela fonctionne réellement, l'impression est énorme.

Aussi, ma façon de penser la «programmation», comment l'assembler et les connaissances pour la réaliser. C'était un match parfait pour tout.

Dans cet esprit, maintenant que quatre ans se sont écoulés, reproduisons "Minecraft" lui-même au lieu de ** "MOD"! ** ** Je me suis levé.

Attitude

Cependant, reproduire un jeu de cette envergure n'est pas facile.

De nos jours, ils sont appelés ** moteurs de jeu ** tels que "Unity" et "Unreal Engine". C'est une époque où vous pouvez facilement créer des jeux de haute qualité sans aucun codage.

Même le codage est visualisé avec ce qu'on appelle un ** blueprint ** et assemblé avec une interface graphique. Il est possible de dire ça. Ceci est incroyable.

Cependant, ce projet n'utilise pas un tel moteur de jeu. ** Faites-le "à partir de zéro" dans le vrai sens du terme. ** **

Recherche préliminaire

Dans la production réelle, vous devez d'abord connaître l'ennemi.

Dessin dans Minecraft

Si la bibliothèque dite du "système de dessin" appelée bibliothèque d'infographie est célèbre Il existe "DirectX" et "OpenGL".

C'est le sujet principal. Comment Minecraft dessine-t-il en Java? ** Minecraft utilise l'une des bibliothèques de jeux en Java appelée "LWJGL (Lightweight Java Game Library)". ** ** C'est comme Wrapper dans OpenGL.

Existe-t-il une telle bibliothèque en Python? Ce n'est pas forcément le pire. ** Si vous ne l'avez pas, vous pouvez le faire. Si vous êtes à court, ajoutez-le simplement. ** **

Touchons LWJGL

lwjgl.png

Environnement de développement intégré ["Eclipse"](https://ja.wikipedia.org/wiki/Eclipse_(%E7%B5%B1%E5%90%88%E9%96%8B%E7%99%BA%E7% Touchez un peu LWJGL en utilisant 92% B0% E5% A2% 83)).

Téléchargement depuis Site officiel.

image.png

Nostalgique. Cet écran. Pour le moment, mes yeux se fatiguent, j'ai donc choisi un thème sombre. WindowPreferencesAppearance

image.png

Faites un projet de manière appropriée. 62bd73c3c6c553538f9cd37d5cd19263.png

Créez une classe de manière appropriée.

main.java


public class main 
{
	//constructeur
	public main() {}
	
	public static void main(String[] args)
	{
		System.out.println("Hello LWJGL!");
	}
}

Le contrôle de fonctionnement est terminé pour le moment.

image.png

Construction de l'environnement LWJGL

Pour utiliser LWJGL, "JDK (Java Development Kit)" est requis.

Article de référence: Comment installer JDK sous Windows

OK si vous passez avec javac -version. image.png

Installez Maven pour créer l'environnement LWJGL.

Article de référence: Comment installer Maven sur Windows

Vous pouvez le passer avec mvn -v. image.png

Cette fois, j'ai installé Maven 3.


prochain, mvn archetype:generate -DgroupId=test -DartifactId=test Créez un projet de manière appropriée avec Cette fois, je l'ai créé dans l'espace de travail de ʻEclipse`.

Article de référence: Memo of Maven3

Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
7: 1.3
8: 1.4
Choose a number: 8: 8

[INFO] Using property: groupId = test
[INFO] Using property: artifactId = test
Define value for property 'version' 1.0-SNAPSHOT: : 1.0-SNAPSHOT
[INFO] Using property: package = test
Confirm properties configuration:
groupId: test
artifactId: test
version: 1.0-SNAPSHOT
package: test
 Y: : Y

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  06:21 min
[INFO] Finished at: 2020-01-21T08:58:05+09:00
[INFO] ------------------------------------------------------------------------

Référence: Essayez Hello world avec LWJGL (Construction de l'environnement)

prochain, Lier LWJGL à pom.xml dans le projet créé

mvn nativedependencies:copy

Téléchargez la bibliothèque de liens dynamiques sur

mvn clean eclipse:eclipse -DdownloadSources=true -DdownloadJavadocs=true

Permet à Eclipse de charger le projet. Ouvrez Eclipse et importez depuis ʻImporter des projets existants`.

035c913206ba6d283300d9fcacdaaec8.png

La bibliothèque est en cours de construction.

image.png

Courir

Le code source est le suivant.

Main.java


package test;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;

import static org.lwjgl.opengl.GL11.*;

public class Main 
{
	public static final int screen_width = 800;
	public static final int screen_height = 500;
	
	public static void Initialize()
	{
		try 
		{
            Display.setDisplayMode(new DisplayMode(screen_width, screen_height));
            Display.setTitle("Hello LWJGL!");
            Display.create();
        } 
		catch(LWJGLException e) 
		{
            e.printStackTrace();
            return;
        }
		
        try 
        {
            glOrtho(0, screen_width, 0, screen_height, 0, depth);
            glMatrixMode(GL_MODELVIEW);
               
            while (!Display.isCloseRequested()) 
            {
                glClear(GL_COLOR_BUFFER_BIT);
                
                Render();
                
                Display.update();
            }
        } 
        catch(Exception e) 
        {
            e.printStackTrace();
        } 
        finally 
        {
            Display.destroy();
        }
	}
	
	public static void Render()
	{
        glBegin(GL_QUADS);

        glEnd();
	}
	
	public static void main(String[] args) 
	{
        Initialize();
    }  
}

Rien n'a été dessiné pour le moment, mais ça s'est bien passé. image.png


Tracer une ligne

Tracez une ligne rouge du coin supérieur droit au coin inférieur droit de l'écran.

Main.java


public static void Render()
{
    glBegin(GL_LINES);
        
    glColor3f(1.0f, 0f, 0f);
    glVertex2f(0, 0);
    glVertex2f(screen_width, screen_height);

    glEnd();
}

Vous pouvez voir que la ligne est dessinée. image.png

Dessiner en Python

À présent, nous savons que Minecraft utilise OpenGL. Il semble qu'OpenGL peut également être utilisé en Python.

Environnement

Utilisez un IDE appelé "PyCharm" (https://www.jetbrains.com/ja-jp/pycharm/).

Fichier ParamètreProjet: <nom du projet>Interpréteur de projet Ajoutez les bibliothèques requises. L'image chargeant Pillow sur le site de référence semble ne pas être compatible avec Python 3.8, je n'ai donc pas pu l'installer.

843d79107f26b0a03a748c8b80ca4686.png

Entrez en contact avec OpenGL en Python

Créez et exécutez main.py. Le code source est le suivant. Cette notation squishy Python semble prendre un certain temps pour s'y habituer. </ font>

main.py


from OpenGL.GL import *
import glfw


def main():

    if not glfw.init():
        return


    window = glfw.create_window(640, 480, 'Hello World', None, None)
    if not window:
        glfw.terminate()
        print('Failed to create window')
        return


    glfw.make_context_current(window)


    print('Vendor :', glGetString(GL_VENDOR))
    print('GPU :', glGetString(GL_RENDERER))
    print('OpenGL version :', glGetString(GL_VERSION))


    glfw.destroy_window(window)
    glfw.terminate()


if __name__ == "__main__":
    main()

Résultat de sortie:

Vendor : b'NVIDIA Corporation'
GPU : b'GeForce GTX 1080/PCIe/SSE2'
OpenGL version : b'4.6.0 NVIDIA 441.08'

Process finished with exit code 0

Ça va bien.

En fait dessiner dans la fenêtre

Le code source est le suivant.

L'argument pour «glClearColor» est «RGBA». Spécifiez chacun avec «float». (r / 255.f, g / 255.f, b / 255.f, a / 255.f)

  • Rouge Vert Bleu Alpha (transparence)

main.py


glfw.make_context_current(window)

glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 4)
glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 0)
glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)

while not glfw.window_should_close(window):

    glClearColor(0, 1, 0, 1)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glfw.swap_buffers(window)
    glfw.poll_events()

▼ Il est dessiné comme ça. Python est incroyable. Est-ce si facile à faire? Si vous le faisiez avec C # .NET WinForm, vous auriez vu l'enfer à ce moment-là. image.png

Conseils: tampon avant et tampon arrière

Si vous n'avez qu'un seul tampon frontal, il clignotera à chaque mise à jour et des problèmes se produiront. Par conséquent, nous préparons ce que l'on appelle un tampon arrière et le mettons à jour dans le tampon arrière. Il est affiché à l'écran en envoyant le tampon arrière vers le tampon avant avec SwapBuffer ().

renderbuffer.png

conception

Jusqu'à présent, je l'ai touché en considérant comment il est dessiné avec OpenGL.

Voici le problème principal. Si vous programmez de manière simple lors de la création d'un jeu, cela entravera la maintenabilité et la maintenabilité du programme. Par conséquent, il est normal de faire un croquis approximatif, alors créez en fait un dessin de conception du programme.

Gestion mondiale

Dans Minecraft, l'un des moyens de gérer World est appelé ** "chunk" **. Cela divise le vaste monde en morceaux de «16 (x) × 16 (z) × 256 (y)» et lit / dessine uniquement la plage requise pour minimiser la charge.

Ce qui s'est demandé

Normalement, dans le monde des jeux 3D, le concept de vecteurs 3D reconnaît que «Z» est défini comme la hauteur, mais dans Minecraft, «Y» est la hauteur. Je ne sais pas pourquoi. Le mystère est. ..

▼ «Z» en 3D de l'image ci-dessous est défini comme «Y» dans Minecraft. image.png

Source de l'image: 8th Basic Mathematics I

Gestion des blocs

Ensuite, à propos des blocs. En interne, il existe deux types de blocs dans Minecraft.

  • Un bloc normal qui n'a pas de fonction, comme un bloc «sol», est «Bloc». -TileEntity est un bloc spécial avec une interface graphique et des fonctions telles que le bloc "Kamado".

Est défini comme. L'entité du bloc avec la fonction telle que "Kamado" est "Block" et elle a pour objet "TileEntity". Il s'agit également d'une gestion mondiale de la réduction de la charge et de l'économie de ressources.

Block Block hérite de l'interface. L'interface contient également une instance de World, qui envoie et reçoit des événements tels que installé / détruit ... etc. du bloc vers World.

Par exemple, cela ressemble à ceci.

public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player)

TileEntity Puisque l'entité de «TileEntity» est «Block», il est nécessaire de lier «Block» et «TileEntity». Par conséquent, Minecraft crée un objet de TileEntity à partir de la fonction d'interface d'un bloc spécifique comme celui-ci. MyTileEntityClass hérite de l'interface TileEntity.

public TileEntity createNewTileEntity(World world)
{
   return new MyTileEntityClass();
}

conception

Sur la base des informations fournies jusqu'à présent, je vais assembler légèrement le dessin de conception. Puisque l'échelle est trop grande, nous ne pensons pas aux détails pour le moment, et la conception en fonction de ce que nous savons actuellement et de ce que nous voulons mettre en œuvre.

▼ Cela ressemble à ceci. Les événements tels que l'échange d'informations avec le monde sont définis dans l'interface. diagram_pycraft.png

De quoi s'inquiéter

Je n'ai pas réellement vu le code source de Minecraft, j'ai donc pu faire une conception approximative basée sur l'expérience et les connaissances que j'ai cultivées dans le développement de MOD, mais je dois penser aux détails et l'implémenter moi-même. .. Ça va être une bataille difficile.

Surtout, le sujet de préoccupation est le dessin. Comment effectuez-vous réellement le rendu du dessin à partir de "World"? Quand. D'autant qu'il s'agit d'un espace 3D, cela semble compliqué contrairement à un espace 2D. Chargement des textures ..etc Il y a beaucoup de problèmes.

Pour le moment, est-ce la production de l'écran de menu?

Continuer à la prochaine fois

En raison de la grande échelle, j'ai décidé de diviser le projet en plusieurs parties. Le nom du projet est-il ... ** "PyCraft" ** ok? ** Nous recherchons quelqu'un pour créer un logo comme celui-là. Je vous remercie. ** **

La prochaine fois, je viserai à créer un écran de menu et à résoudre les problèmes de rendu.

Merci d'avoir regardé jusqu'à la fin.

Recommended Posts

[# 1] Créez Minecraft avec Python. ~ Recherche préliminaire et conception ~
[# 2] Créez Minecraft avec Python. ~ Dessin du modèle et implémentation du lecteur ~
Fractal pour faire et jouer avec Python
[# 3] Créez Minecraft avec Python. -Amélioration du mouvement du joueur (concept d'inertie) et jugement de collision-
Essayez de créer un jeu simple avec Python 3 et iPhone
Créez des tweets ordinaires comme une flotte avec AWS Lambda et Python
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Python et matériel - Utilisation de RS232C avec Python -
Créez Puyopuyo AI avec Python
Faites une loterie avec Python
python avec pyenv et venv
Fonctionne avec Python et R
Veriloggen et cocotb sont utilisés pour concevoir et tester Verilog en Python uniquement.
Associez Python Enum à une fonction pour la rendre appelable
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
Communiquez avec FX-5204PS avec Python et PyUSB
Briller la vie avec Python et OpenCV
Créez un bot LINE avec Python + heroku
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Créer Apache Log CSV avec Python
Scraping avec Node, Ruby et Python
Faisons une interface graphique avec python.
Grattage avec Python, Selenium et Chromedriver
Grattage avec Python et belle soupe
Encodage et décodage JSON avec python
Introduction à Hadoop et MapReduce avec Python
Créer un système de recommandation avec python
Lire et écrire NetCDF avec Python
Faisons un graphe avec python! !!
Lire et écrire du CSV avec Python
Intégration multiple avec Python et Sympy
Coexistence de Python2 et 3 avec CircleCI (1.0)
Jeu Sugoroku et jeu d'addition avec Python
Modulation et démodulation FM avec Python
[Apprentissage automatique] Essayez d'exécuter Spark MLlib avec Python et faites des recommandations
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Créez un simple OMR (lecteur de feuille de marque) avec Python et OpenCV
Créez une application de scraping avec Python + Django + AWS et modifiez les tâches
Jetez quelque chose dans Kinesis avec python et assurez-vous qu'il est dans
Faites en sorte que les vidéos floues ressemblent à des caméras à point fixe avec Python et OpenCV
Communiquez entre Elixir et Python avec gRPC
Rendre la console Python couverte d'UNKO
2.Faites un arbre de décision à partir de 0 avec Python et comprenez-le (2. Bases du programme Python)
Calculer et afficher le poids standard avec python
Surveiller les pannes de Mojo avec Python et Skype
Faisons un jeu de shiritori avec Python
Modulation et démodulation FM avec Python Partie 3
[Automation] Manipulez la souris et le clavier avec Python
Authentification sans mot de passe avec RDS et IAM (Python)
Utilisation de Python et MeCab avec Azure Databricks
POSTER diversement avec Python et recevoir avec Flask
Un mémo contenant Python2.7 et Python3 dans CentOS
Utilisez PIL ou Pillow avec Cygwin Python
Créer et décrypter du code César avec python