[# 3] Mach Minecraft mit Python. -Verbesserung der Spielerbewegung (Konzept der Trägheit) und Kollisionsbeurteilung-

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

** Vorheriger Artikel: "[# 2] Mach Minecraft mit Python.-Modellzeichnung und Player-Implementierung-" **

Was ist diesmal zu tun?

Beim letzten Mal haben wir alles getan, vom Zeichnen eines Modells mit Testtexturen bis zur Implementierung einer Spielerperspektive.

Verbesserte Spielerbewegung

sq6py-82p4x.gif Denken Sie nicht, dass die Bewegung des Spielers, den Sie das letzte Mal implementiert haben, unnatürlich ist? Dies liegt daran, dass ** "nur bewegen, wenn eine Taste gedrückt wird" **. In den meisten 3D-Spielen bewegen sich die Spieler reibungslos, aber intern wurden die Bewegungen von Spielern und Objekten entwickelt. bo5ie-4w21m.gif

Warum ist die Bewegung unnatürlich?

Wenn Sie ein Objekt oder eine Entität im Laufe der Zeit verschieben möchten, z. B. wenn Sie mit einer "for" -Anweisung oder einer "while" -Anweisung iterieren, ** hängt die Geschwindigkeit jedes Frames von der Leistung des Computers ** ab, was wahr ist. In gewissem Sinne kann es nicht als "tatsächliche Zeit" bezeichnet werden. Schwer zu erklären. Es tut mir leid, wenn es schwer zu verstehen ist.

Die unnatürliche Bewegung ist wahrscheinlich darauf zurückzuführen, dass ** die Geschwindigkeit des Spielers konstant ist ** und ** nicht verrutscht **. Selbst wenn Sie gegen einen Karton treten, hört er normalerweise nicht mit "Kyu!" Auf, es sei denn, es ist ein Ort, an dem Reibungskraft wirkt.

Lösung

** DeltaTime ** genannt " dt (DeltaTime) " ist der Schlüssel zur Verbesserung der Bewegung des Spielers. Die Delta-Zeit gibt an, ** wie viele Sekunden zwischen der Verarbeitung des letzten Frames und der Ausführung dieses Frames vergangen sind **.

Insbesondere werden wir die Deltazeit nutzen, um den Spielern das Konzept der Trägheit vorzustellen. Die Funktion on_key_press () übergibt Informationen vom Drücken der Taste auf der Tastatur bis zum Loslassen an den Player. Wenn also beim Drücken der Taste ein Wert als ** n ** definiert ist, dann n Es erhöht sich proportional zu der Zeit, die Sie gedrückt halten.

Im Programm haben wir "n" als "Geschwindigkeit_x" bzw. "Geschwindigkeit_z" definiert. * Geschwindigkeit = Geschwindigkeit </ font>

#Spieleraktualisierungsereignis
def update(self, dt, keys):
    if keys[key.W]:#front
        self.position[0] += dx #Normale Verschiebungsverarbeitung
        self.position[2] -= dz #Normale Verschiebungsverarbeitung
        self.velocity_x += dt * 10 #dt ist ein sehr kleiner Wert, also multiplizieren Sie ihn mit 10

Bei dieser Geschwindigkeit erhöht sich die Geschwindigkeit unbegrenzt proportional zu der Zeit, die Sie darauf drücken. Daher wird zum Zeitpunkt der "Aktualisierung" der Wert der "Geschwindigkeit" um eine bestimmte Regel verringert.

Stellen Sie dann die Höchstgeschwindigkeit ein und prüfen Sie, ob der Wert negativ ist oder die Höchstgeschwindigkeit überschreitet. Wenn der Wert negativ ist, kehrt er zu "0" zurück, und wenn er die Höchstgeschwindigkeit überschreitet, kehrt er zur Höchstgeschwindigkeit zurück.

player.update()In der Funktion


#Subtrahieren Sie den aktuellen Wert geteilt durch 50
self.velocity_x -= self.velocity_x / 50
self.velocity_z -= self.velocity_z / 50

#Wenn es sich um einen negativen Wert handelt, wird er auf 0 zurückgesetzt.
if self.velocity_x < 0: self.velocity_x = 0
if self.velocity_z < 0: self.velocity_z = 0

max_inertia_speed = 0.2 #Proportional zur Größe des Wertes gleiten

#Wenn die Höchstgeschwindigkeit überschritten wird, kehren Sie zur Höchstgeschwindigkeit zurück
if self.velocity_x > max_inertia_speed: self.velocity_x = max_inertia_speed
if self.velocity_z > max_inertia_speed: self.velocity_z = max_inertia_speed

#Trägheit, die sich vorwärts bewegt
self.position[0] += self.velocity_x * dx #Fügen Sie die aktuellen Koordinaten unter Berücksichtigung der Rotation hinzu
self.position[2] -= self.velocity_z * dz #Subtrahieren Sie von den aktuellen Koordinaten unter Berücksichtigung der Rotation

Wenn Sie es versuchen, können Sie sehen, dass es Trägheit hat, wie unten gezeigt. Sie können auch sehen, dass die Geschwindigkeit im oberen linken Debug-Fenster proportional zur Zeit abnimmt. p8r6m-2cy1g.gif Damit ist die Unnatürlichkeit endgültig verschwunden. Ich konnte die ursprüngliche Bewegung von Minecraft reproduzieren.

Problem

Es unterstützt keine diagonale Bewegung.

Umsetzung des Kollisionsurteils

p4xs6-53ohi.gif Dies ist die größte Herausforderung bei der Realisierung von Minecraft ohne Verwendung von Tools wie Unity. Wenn alle Blöcke "1,0" × "1,0" sind, kann dies relativ einfach implementiert werden (es scheint möglich), wobei jedoch berücksichtigt wird, dass für jeden Block eine benutzerdefinierte Kollisionsbeurteilung (z. B. Treppenblock oder Tür) implementiert wird. Ich fühle mich wie eine sehr große Mauer.

In Minecraft können Sie mit ** AABB (Axis-Aligned Bounding Box) ** die Beurteilung von Blockkollisionen und den Begrenzungsrahmen nur für das Erscheinungsbild frei definieren. Ich möchte es auch in Python implementieren. Ist es hart für den Stein? Persönlich kann ich nur daran denken, Minecraft zu dekompilieren und den verschleierten Quellcode mit Mut zu lesen.

Wenn jemand mit dem Kollisionsurteil vertraut ist, geben Sie uns bitte im Kommentarbereich einige Ratschläge. image.png

Fortsetzen

Die aktuelle Situation ist so. * Das GIF konnte aufgrund der Videogröße nicht hochgeladen werden. </ font> Wenn das Kollisionsurteil erfolgreich ist, codiert der Rest nur.

Recommended Posts