Part of pictures, articles, images on this page are copyrighted by Mojang AB.
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 ~
"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é.
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. ** **
Dans la production réelle, vous devez d'abord connaître l'ennemi.
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. ** **
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.
Nostalgique. Cet écran.
Pour le moment, mes yeux se fatiguent, j'ai donc choisi un thème sombre.
Window
▶Preferences
▶Appearance
Faites un projet de manière appropriée.
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.
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
.
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
.
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`.
La bibliothèque est en cours de construction.
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é.
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.
À présent, nous savons que Minecraft utilise OpenGL. Il semble qu'OpenGL peut également être utilisé en Python.
Utilisez un IDE appelé "PyCharm" (https://www.jetbrains.com/ja-jp/pycharm/).
Fichier
▶ Paramètre
▶ Projet: <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.
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.
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)
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à.
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 ()
.
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.
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.
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.
Source de l'image: 8th Basic Mathematics I
Ensuite, à propos des blocs. En interne, il existe deux types de blocs dans Minecraft.
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();
}
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.
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?
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.