Swipe-Management in einem Spielprojekt auf Godot Engine

Grüße an alle! Heute möchte ich darüber sprechen, wie man das Swipe-Management in einem Spielprojekt für Android auf der Godot Engine implementiert.

Bild

Mein Name ist Peter und ich bin einer der aktiven Benutzer der Godot Engine-Game-Engine.
Im russischsprachigen Segment gibt es einen großen Materialmangel bei diesem Tool, was mich sehr überrascht, da es eine der am schnellsten wachsenden Spiel-Engines ist.
Natürlich ist es Engines wie Unity, UE und dergleichen in vielerlei Hinsicht unterlegen, und Sie werden kein AAA-Klassenspiel daraus machen.

Jedoch! Es ist kostenlos (voll), plattformübergreifend (voll) und wiegt im Gegensatz zur gleichen Einheit etwa 60 Megabyte.

Der Motor läuft auf den meisten Geräten, auch wenn letztere aus einer sehr günstigen Linie stammen. Außerdem ist "out of the box" bereits russifiziert, verfügt über alle erforderlichen Tools an Bord, benötigt keine zusätzliche Software und verbraucht nicht den gesamten Arbeitsspeicher in laufender Form.

Ich habe bereits ein paar Artikel über Habré gesehen, und das ist sehr klein, da es für den Entwickler so freundlich ist, dass es eine große Lücke ist, daran vorbeizukommen und es nicht zu versuchen.

Das Thema dieses Beitrags ist die Implementierung der Swipe-Verwaltung (Gesten) in einem Android-Projekt.
Im Allgemeinen ist die Erfahrung mit dem Einsatz des Motors sehr umfangreich, und wenn das Thema eine Antwort erhält, kann ich einen gesamten Schulungskurs arrangieren. Mit diesem Beitrag möchte ich zumindest Ihre Aufmerksamkeit auf den Motor lenken.

Als Programmiersprache können Sie wieder zwei Optionen verwenden: GDScript und C #. Ich werde den ersten verwenden.

Die Oberfläche des Haupteditors sieht folgendermaßen aus:

Bild

Sie können gleichzeitig mit 3D, 2D, Skripten und im Allgemeinen mit allem arbeiten, was ein Entwickler möglicherweise benötigt.

Die Engine verwendet einen Ansatz, bei dem Ihr Spiel aus einer Reihe von ineinander verschachtelten Szenen besteht. Und es kann einige Verwirrung geben, weil ich den Begriff "Szene" für Knoten verwende, die Spielszenen sind (Situationen, Fenster, Spielzustände (Menüs, Spiele usw.)), und für andere Fälle verwende ich den Begriff "Prefab" von Unity ausgeliehen.

Da ich in diesem Beitrag einen Sonderfall betrachten werde, werde ich auf einige Themen nicht näher eingehen. Wenn etwas unklar ist, gibt es Kommentare.

Also, die Hauptszene für die Demonstration, wir werden ein Spiel haben.

Seine Struktur sieht folgendermaßen aus:

Bild

Der Wurzelknoten des Spiels speichert in sich verschachtelte:
- Welt, - speichert Level-Daten darin
- - Ebene, - eine Reihe von Umgebungsobjekten (Blöcke, Ringe, Hindernisse)
- - Spieler, - Spielerobjekt
- - InterpolatedCamera, - glatt Die Kamera, die die Player-
GUI-Schnittstelle überwacht , ist nicht beteiligt.

Namen von Objekten und Strukturen sind willkürlich und dies ist nur ein Sonderfall.
In der Nähe einiger Objekte sehen Sie Symbole, die besagen, dass es sich bei diesem Objekt um ein Fertighaus (verschachtelte Szene) handelt, und dass auch ein Skript hinzugefügt werden kann.

Wenn Sie also auf das Symbol "Skript" klicken, gelangen Sie in den Skripteditor. Der Betriebsmodus der Engine wechselt einfach.

Bild

In dieser Betriebsart können Sie das Verhalten von Objekten bearbeiten. In diesem Fall handelt es sich tatsächlich um ein Skript des Weltobjekts, das beim Laden eines Objekts in das Spiel das Kameraobjekt (InterpolatedCamera) als Ziel für die Verfolgung festlegt.

extends Spatial

func _ready():
	$InterpolatedCamera.target = '../player/camera' #  , ,         (  ).   player  "camera"   pivot.   .         .

Syntaktisch ähnelt GDScript Python. Hier können Sie eine kurze Schulung zu GDScript in russischer Sprache absolvieren: GDScript-Buch

Mit dem Weltobjekt ist klar, dass es nur das Ziel der Kamera für die Verfolgung festlegt. Das nächste Objekt (bereits ein Kind der Welt) ist eben. Die Struktur sieht folgendermaßen aus:

Bild

Tatsächlich handelt es sich lediglich um angeordnete Objekte mit physikalischen Eigenschaften, die keine Skripte oder Verhaltensweisen aufweisen. Zusätzlich zu den "Zellen" -Objekten. Dies sind sich drehende Ringe, die im Kontakt mit dem Objekt des Spielers verschwinden.

Das derzeit interessanteste Player-Objekt, das die Swipe-Steuerlogik für Touchscreens enthält.

Dieses Fertighaus sieht folgendermaßen aus:

Bild

Das Stammobjekt verfügt über ein Skript, auf das wir später noch eingehen werden .
Betrachten Sie zunächst verschachtelte Objekte.

  • camera, — , , . player.
  • CollisionShape, — . «» . , , . .
  • MeshInstance, — . , . Blender 3D , .
  • Tween, . .

Nun betrachten wir das Skript selbst im Stammobjekt. Es stellt sich heraus, dass es das umfangreichste im ganzen "Spiel" ist.

Bild

Nun, seine Beschreibung und Dekodierung.


extends KinematicBody #       

#  
const GRAV = 0.5 #   (      Y, ..       ,     )
const SPEED = 2 #  
const SWIPE_SPEED = 30 #       
const JUMP_SPEED = 10 #     

onready var ball = $MeshInstance #        
onready var tween = $Tween #      
var vel = Vector3() #     
var swipe = '' #       


func _ready():
	pass #        ;    


#       (60FPS)  
func _physics_process(delta): # delta -  Delta Time ,  ,    
	vel.y -= GRAV #      (  )
	vel.z = -SPEED #     .   
	ball.rotate_x(-delta * SPEED * 2) #     ,   ""

	if swipe && swipe != 'swiped': #         
		if swipe == 'up' && is_on_floor(): #        ()
			vel.y = JUMP_SPEED #     ,   -  
		elif swipe == 'left' || swipe == 'right': #     
			tween.interpolate_property(self, "translation", #      
				translation, translation+Vector3(-2 if swipe == 'left' else 2,0,0), 0.2, #    ,         X.      . -2  ,  2
				Tween.TRANS_CUBIC, Tween.EASE_IN_OUT) #     "" 
			tween.start() #   
		swipe = 'swiped' #   ,   

	vel = move_and_slide(vel, Vector3.UP) #       ,                  

#       
func _input(e):
	if e is InputEventScreenDrag: # ,       
		if !swipe: #       
			if e.relative.y < -SWIPE_SPEED: #       Y
				swipe = 'up' #     (     )    ( ,          ),     " (UP)"
			elif e.relative.x < -SWIPE_SPEED: #      ,     X.     -  
				swipe = 'left'
			elif e.relative.x > SWIPE_SPEED: #  ,
				swipe = 'right' #  

	elif e is InputEventScreenTouch: #     
		if !e.pressed: #      
			swipe = '' #   

Ich hoffe, ich habe jede Zeile beschrieben, mit Skripten ist alles Plus oder Minus klar.

Wenn auf Russisch, dann registrieren wir, wenn wir unseren Finger über den Bildschirm bewegen, die Bewegungsrichtung und die Geschwindigkeit. Wenn sich der Finger mit der gewünschten Geschwindigkeit bewegt, zählen wir den Schlag. Basierend auf welcher Achse und in welche Richtung die Bewegung ging, haben wir drei Möglichkeiten: AUF, LINKS, RECHTS.
Wir schreiben den empfangenen Wert in eine Variable, die sofort vom Ereignis der Aktualisierung des Status des Objekts erfasst wird, und führen damit die erforderlichen Aktionen aus. Danach markiert es das Ereignis als erfüllt und erwartet das nächste.

Ich habe nicht den einfachsten Weg gewählt, um ein Wischen zu implementieren, aber es ist ziemlich zuverlässig und funktioniert in den meisten Situationen. Natürlich hängt es vom Genre und der Art des Spiels ab.

Als Ergebnis der geleisteten Arbeit erhalten wir ein Beispiel dafür, wie einfach es ist, das Swipe-Management in buchstäblich zehn Minuten zu implementieren.

Insgesamt habe ich ungefähr 30 Minuten gebraucht, wobei die Erstellung von Modellen in Blender berücksichtigt wird.

Nun, nach der Tradition ...

Entwicklungsvideo


Quellcode

All Articles