[# 1] Mach Minecraft mit Python. ~ Vorforschung und Design ~

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

minecraft.png

Überblick

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 ~

Auslösen

"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.

Einstellung

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. ** ** **

Vorläufige Nachforschung

In der tatsächlichen Produktion müssen Sie zuerst den Feind kennen.

Zeichnen in Minecraft

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. ** ** **

Berühren wir LWJGL

lwjgl.png

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.

image.png

Nostalgisch. Dieser Bildschirm. Vorerst werden meine Augen müde, deshalb habe ich ein dunkles Thema gewählt. WindowPreferencesAppearance

image.png

Machen Sie ein Projekt entsprechend. 62bd73c3c6c553538f9cd37d5cd19263.png

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.

image.png

LWJGL Umgebungsbau

Zur Verwendung von LWJGL ist "JDK (Java Development Kit)" erforderlich.

Referenzartikel: So installieren Sie JDK unter Windows

OK, wenn Sie mit javac -version bestehen. image.png

Installieren Sie Maven, um die LWJGL-Umgebung zu erstellen.

Referenzartikel: So installieren Sie Maven unter Windows

Sie können es mit mvn -v übergeben. image.png

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".

035c913206ba6d283300d9fcacdaaec8.png

Die Bibliothek wird gebaut.

image.png

Lauf

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. image.png


Zeichne eine Linie

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. image.png

Zeichnen in Python

Inzwischen wissen wir, dass Minecraft OpenGL verwendet. Es scheint, dass OpenGL auch in Python verwendet werden kann.

Umgebung

Verwenden Sie eine IDE namens "PyCharm" (https://www.jetbrains.com/en-us/pycharm/).

Datei EinstellungProjekt: <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.

843d79107f26b0a03a748c8b80ca4686.png

Nehmen Sie Kontakt mit OpenGL in Python auf

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.

Eigentlich im Fenster zeichnen

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)

  • Rot Grün Blau Alpha (Transparenz)

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. image.png

Tipps: Frontpuffer und Backpuffer

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.

renderbuffer.png

Design

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.

Weltmanagement

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.

Was hat sich gefragt?

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. image.png

Bildquelle: 8. Grundlegende Mathematik I

Blockverwaltung

Als nächstes über Blöcke. Intern gibt es in Minecraft zwei Arten von Blöcken.

  • Ein normaler Block, der keine Funktion hat, wie z. B. ein "Boden" -Block, ist "Block". -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();
}

Design

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. diagram_pycraft.png

Worüber man sich Sorgen machen muss

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?

Fahren Sie mit dem nächsten Mal fort

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

[# 1] Mach Minecraft mit Python. ~ Vorforschung und Design ~
[# 2] Mach Minecraft mit Python. ~ Modellzeichnung und Player-Implementierung ~
Fraktal zum Erstellen und Spielen mit Python
[# 3] Mach Minecraft mit Python. -Verbesserung der Spielerbewegung (Konzept der Trägheit) und Kollisionsbeurteilung-
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
Machen Sie mit AWS Lambda und Python gewöhnliche Tweets flottenartig
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python und Hardware-Verwenden von RS232C mit Python-
Erstelle Puyopuyo AI mit Python
Machen Sie eine Lotterie mit Python
Python mit Pyenv und Venv
Funktioniert mit Python und R.
Veriloggen und Cocotb werden nur zum Entwerfen und Testen von Verilog in Python verwendet.
Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Leuchtendes Leben mit Python und OpenCV
Erstelle einen LINE-Bot mit Python + Heroku
Roboter läuft mit Arduino und Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Machen Sie Apache Log CSV mit Python
Scraping mit Node, Ruby und Python
Lassen Sie uns eine GUI mit Python erstellen.
Scraping mit Python, Selen und Chromedriver
Kratzen mit Python und schöner Suppe
JSON-Codierung und -Decodierung mit Python
Hadoop-Einführung und MapReduce mit Python
Erstellen Sie ein Empfehlungssystem mit Python
Lesen und Schreiben von NetCDF mit Python
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Lesen und Schreiben von CSV mit Python
Mehrfachintegration mit Python und Sympy
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Sugoroku-Spiel und Zusatzspiel mit Python
FM-Modulation und Demodulation mit Python
[Maschinelles Lernen] Versuchen Sie, Spark MLlib mit Python auszuführen, und geben Sie Empfehlungen ab
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Erstellen Sie mit Python und OpenCV ein einfaches OMR (Mark Sheet Reader)
Erstellen Sie mit Python + Django + AWS eine Scraping-App und wechseln Sie Jobs
Wirf etwas mit Python in Kinesis und stelle sicher, dass es drin ist
Mit Python und OpenCV lassen Sie Unschärfevideos wie Festkommakameras aussehen
Kommunizieren Sie mit gRPC zwischen Elixir und Python
Machen Sie die Python-Konsole mit UNKO bedeckt
2. Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (2. Grundlagen des Python-Programms)
Berechnen Sie das Standardgewicht und zeigen Sie es mit Python an
Überwachen Sie Mojo-Ausfälle mit Python und Skype
Lassen Sie uns mit Python ein Shiritori-Spiel machen
FM-Modulation und Demodulation mit Python Part 3
[Automatisierung] Bearbeiten Sie Maus und Tastatur mit Python
Passwortlose Authentifizierung mit RDS und IAM (Python)
Verwenden von Python und MeCab mit Azure Databricks
POST verschieden mit Python und empfange mit Flask
Ein Memo mit Python2.7 und Python3 in CentOS
Verwenden Sie PIL oder Pillow mit Cygwin Python
Erstellen und entschlüsseln Sie Caesar-Code mit Python