Part of pictures, articles, images on this page are copyrighted by Mojang AB.
Dies ist ein Projekt zur Reproduktion des weltberühmten Sandbox-Spiels "Minecraft" in der Programmiersprache "Python".
Nächster Artikel: [# 2] Mach Minecraft mit Python. ~ Modellzeichnung und Player-Implementierung ~
"Minecraft" war das erste Mal, dass ich mit Programmierung in Kontakt kam.
Es war vor über 4 Jahren. Ich interessierte mich für den sogenannten umgestalteten Inhalt namens "MOD" in Minecraft und betrat die Welt des Programmierens mit den Worten "Ich möchte es selbst machen!". Mit einer Gesamtspielzeit von über Zehntausenden von Stunden ist es eines von vielen denkwürdigen Spielen.
Seit ich in der unteren Klasse der Grundschule war, habe ich einige kreative Aktivitäten durchgeführt, wie zum Beispiel das Erstellen einer Website. Wenn Sie tatsächlich ein "Ding" mit einer Programmiersprache programmieren und es tatsächlich funktioniert, ist der Eindruck enorm.
Auch meine Art, über "Programmieren" nachzudenken, wie man es zusammenbaut und das Wissen, um es zu realisieren. Es passte perfekt zu allem.
In diesem Sinne, jetzt, da vier Jahre vergangen sind, wollen wir "Minecraft" selbst anstelle von ** "MOD" reproduzieren! ** ** ** Ich stand auf.
Es ist jedoch nicht einfach, ein Spiel dieser Größenordnung zu reproduzieren.
Heutzutage werden sie ** Game Engines ** wie "Unity" und "Unreal Engine" genannt. Es ist eine Ära, in der Sie problemlos hochwertige Spiele ohne Codierung erstellen können.
Sogar die Codierung wird mit einem sogenannten "Blueprint" visualisiert und mit einer GUI zusammengestellt. Das kann man sagen. Das ist großartig.
Dieses Projekt verwendet jedoch keine solche Spiel-Engine. ** Machen Sie es "von Grund auf neu" im wahrsten Sinne des Wortes. ** ** **
In der tatsächlichen Produktion müssen Sie zuerst den Feind kennen.
Wenn die sogenannte "Zeichensystem" -Bibliothek, die als Computergrafikbibliothek bezeichnet wird, berühmt ist Es gibt "DirectX" und "OpenGL".
Dies ist das Hauptthema. Wie zeichnet Minecraft in Java? ** Minecraft verwendet eine der Spielbibliotheken in Java mit dem Namen "LWJGL (Lightweight Java Game Library)". ** ** ** Es ist wie Wrapper in OpenGL.
Gibt es eine solche Bibliothek in Python? Es muss nicht das Schlimmste sein. ** Wenn Sie es nicht haben, können Sie es machen. Wenn Sie ausgehen, fügen Sie es einfach hinzu. ** ** **
Integrierte Entwicklungsumgebung ["Eclipse"](https://ja.wikipedia.org/wiki/Eclipse_(%E7%B5%B1%E5%90%88%E9%96%8B%E7%99%BA%E7% Berühren wir LWJGL ein wenig mit 92% B0% E5% A2% 83)).
Download von Offizielle Website.
Nostalgisch. Dieser Bildschirm.
Vorerst werden meine Augen müde, deshalb habe ich ein dunkles Thema gewählt.
Window
▶Preferences
▶Appearance
Machen Sie ein Projekt entsprechend.
Erstellen Sie eine geeignete Klasse.
main.java
public class main
{
//Konstrukteur
public main() {}
public static void main(String[] args)
{
System.out.println("Hello LWJGL!");
}
}
Die Funktionsprüfung ist vorerst abgeschlossen.
Zur Verwendung von LWJGL ist "JDK (Java Development Kit)" erforderlich.
Referenzartikel: So installieren Sie JDK unter Windows
OK, wenn Sie mit javac -version
bestehen.
Installieren Sie Maven
, um die LWJGL-Umgebung zu erstellen.
Referenzartikel: So installieren Sie Maven unter Windows
Sie können es mit mvn -v
übergeben.
Diesmal habe ich Maven 3
installiert.
Nächster,
mvn archetype:generate -DgroupId=test -DartifactId=test
Erstellen Sie ein Projekt entsprechend mit
Dieses Mal habe ich es im Arbeitsbereich von "Eclipse" erstellt.
Referenzartikel: 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] ------------------------------------------------------------------------
Referenz: Versuchen Sie Hello World mit LWJGL (Environment Construction)
Nächster,
Verknüpfen Sie LWJGL mit pom.xml
im erstellten Projekt
mvn nativedependencies:copy
Laden Sie die Dynamic Link Library unter herunter
mvn clean eclipse:eclipse -DdownloadSources=true -DdownloadJavadocs=true
Ermöglicht Eclipse das Laden des Projekts. Öffnen Sie Eclipse und importieren Sie aus "Vorhandene Projekte importieren".
Die Bibliothek wird gebaut.
Der Quellcode lautet wie folgt.
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();
}
}
Vorerst wurde nichts gezeichnet, aber es lief gut.
Zeichnen Sie eine rote Linie von rechts oben nach rechts unten auf dem Bildschirm.
Main.java
public static void Render()
{
glBegin(GL_LINES);
glColor3f(1.0f, 0f, 0f);
glVertex2f(0, 0);
glVertex2f(screen_width, screen_height);
glEnd();
}
Sie können sehen, dass die Linie gezeichnet ist.
Inzwischen wissen wir, dass Minecraft OpenGL verwendet. Es scheint, dass OpenGL auch in Python verwendet werden kann.
Verwenden Sie eine IDE namens "PyCharm" (https://www.jetbrains.com/en-us/pycharm/).
Datei
▶ Einstellung
▶ Projekt: <Projektname>
▶ Projektinterpreter
Fügen Sie die erforderlichen Bibliotheken hinzu.
Das Laden des Bildes "Pillow" auf der Referenzseite scheint keine Python 3.8-Unterstützung mehr zu haben, daher konnte ich es nicht installieren.
Erstellen Sie "main.py" und führen Sie es aus. Der Quellcode lautet wie folgt. Diese matschige Python-Notation scheint einige Zeit in Anspruch zu nehmen, um sich daran zu gewöhnen. </ 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()
Ausgabeergebnis:
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
Es läuft gut.
Der Quellcode lautet wie folgt.
Das Argument für "glClearColor" ist "RGBA".
Geben Sie jeweils mit float
an.
(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()
▼ Es wird so gezeichnet. Python ist unglaublich. Ist das so einfach? Wenn Sie es mit C # .NET WinForm gemacht hätten, hätten Sie zu diesem Zeitpunkt die Hölle gesehen.
Wenn Sie nur einen Frontpuffer haben, flackert dieser jedes Mal, wenn Sie ihn aktualisieren, und es treten Probleme auf.
Daher bereiten wir einen sogenannten Backpuffer vor und aktualisieren ihn auf den Backpuffer.
Es wird auf dem Bildschirm angezeigt, indem der hintere Puffer mit SwapBuffer ()
an den vorderen Puffer gesendet wird.
Bisher habe ich es tatsächlich berührt, als ich überlegte, wie es mit OpenGL gezeichnet wird.
Hier ist das Hauptproblem. Wenn Sie beim Erstellen eines Spiels auf einfache Weise programmieren, wird dies die Wartbarkeit und Wartbarkeit des Programms beeinträchtigen. Daher ist es in Ordnung, eine grobe Skizze zu erstellen, also tatsächlich eine Konstruktionszeichnung des Programms zu erstellen.
In Minecraft heißt eines der Mittel zur Verwaltung der Welt ** "Chunk" **. Dies unterteilt die weite Welt in Blöcke von 16 (x) × 16 (z) × 256 (y) und liest / zeichnet nur den erforderlichen Bereich, um die Last zu minimieren.
Normalerweise erkennt das Konzept der 3D-Vektoren in der Welt der 3D-Spiele, dass "Z" als Höhe definiert ist, in Minecraft jedoch "Y" als Höhe. Ich weiß nicht warum. Geheimnis ist. ..
▼ Z
in 3D des folgenden Bildes ist in Minecraft als Y
definiert.
Bildquelle: 8. Grundlegende Mathematik I
Als nächstes über Blöcke. Intern gibt es in Minecraft zwei Arten von Blöcken.
TileEntity
ist ein spezieller Block mit GUI und Funktionen wie "Kamado" -Block.Ist definiert als. Die Entität des Blocks mit der Funktion wie "Kamado" ist "Block" und hat das Objekt "TileEntity". Dies ist auch eines der weltweiten Managements für Lastreduzierung und Ressourceneinsparung.
Block
Block
erbt die Schnittstelle.
Die Schnittstelle enthält auch eine Instanz von "Welt", die Ereignisse wie "Installiert / Zerstört ..." usw. vom Block an "Welt" sendet und empfängt.
Zum Beispiel sieht es so aus.
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player)
TileEntity
Da die Entität von "TileEntity" "Block" ist, müssen "Block" und "TileEntity" verknüpft werden.
Daher erstellt Minecraft ein Objekt von "TileEntity" aus der Schnittstellenfunktion eines bestimmten Blocks wie diesem.
MyTileEntityClass
erbt von der Schnittstelle TileEntity
.
public TileEntity createNewTileEntity(World world)
{
return new MyTileEntityClass();
}
Basierend auf den bisherigen Informationen werde ich die Konstruktionszeichnung leicht zusammenstellen. Da der Maßstab zu groß ist, denken wir vorerst nicht an Details und das Design basiert auf dem, was wir derzeit wissen und was wir implementieren möchten.
▼ Es sieht so aus. Ereignisse wie der Informationsaustausch mit der Welt werden in der Benutzeroberfläche definiert.
Ich habe den Quellcode von Minecraft noch nicht gesehen, daher konnte ich basierend auf den Erfahrungen und Kenntnissen, die ich in der MOD-Entwicklung gesammelt habe, ein grobes Design erstellen, aber ich muss über die Details nachdenken und es selbst implementieren. .. Es wird ein harter Kampf.
Besonders besorgniserregend ist das Zeichnen. Wie rendert man die Zeichnung tatsächlich aus "Welt"? Wann. Insbesondere da es sich um einen 3D-Raum handelt, scheint er im Gegensatz zu einem 2D-Raum kompliziert zu sein. Laden von Texturen usw. Es gibt viele Probleme.
Ist es vorerst die Produktion des Menübildschirms?
Aufgrund des großen Umfangs habe ich beschlossen, das Projekt in Teile zu teilen. Ist der Projektname ... ** "PyCraft" ** in Ordnung? ** Wir suchen jemanden, der ein solches Logo erstellt. Vielen Dank. ** ** **
Das nächste Mal werde ich versuchen, einen Menübildschirm zu erstellen und Renderingprobleme zu lösen.
Danke, dass du bis zum Ende zugesehen hast.
Recommended Posts