Mechanik für die Platformer-Implementierung auf der GodotEngine Game Engine

Hallo, ich habe ungefähr 2 Jahre lang Spiele auf Godot Engine entwickelt, daher habe ich beschlossen, eine Sammlung von Programmcode zu erstellen, um die grundlegenden Plattformmechaniken zu implementieren. Diese Sammlung wurde für neue Benutzer entwickelt, die die Godot-Engine verwenden.



Und ja, weitere Links zu nachfolgenden Artikeln werden bereitgestellt.



Basiscode



Damit der Charakter der Physik gehorcht, müssen Sie move_and_slide () in der Methode _process () oder _physics_process () aufrufen.



Im folgenden Code werde ich statische Typisierung verwenden.



extends KinematicBody2D
#     gdscript   ,    python

var velocity: Vector2 = Vector2.ZERO 	#   .
					#     
					#   

func _physics_process(_delta: float) -> void:
	#     
	
	
	self.velocity = self.move_and_slide(self.velocity, Vector2(0, -1)) 
	#        .
	#   -  ,    .
	#      .


Dieser Code reicht aus, um jedes KinematicBody2D-Objekt in Abhängigkeit von Kollisionen mit anderen Objekten zu bewegen. Es ist jedoch unmöglich, dieses Objekt zu steuern, insbesondere bei Plattformspielern kann dieses Objekt immer noch nicht herunterfallen. Damit das Objekt zu fallen beginnt, müssen Sie den Wert von self.velocity.y um einen positiven Wert erhöhen. Tatsache ist, dass Godot Engine im 2D-Modus beide Koordinaten von der oberen linken Ecke zur unteren rechten berechnet. Damit das Objekt fallen kann, müssen Sie der Beschleunigung etwas hinzufügen. Normalerweise verwende ich die GRAVITY-Konstante, die zu Beginn des Programms angegeben wird. Als nächstes wird der Code mit Änderungen angezeigt, damit das Objekt fallen kann.



extends KinematicBody2D

const GRAVITY: int = 40
#    40   ,     


var velocity: Vector2 = Vector2.ZERO 	#  


func _physics_process(_delta: float) -> void:
	#     

	#     
	self.velocity.y += GRAVITY
	#   _delta  ,     self.move_and collide
	self.velocity = self.move_and_slide(self.velocity, Vector2(0, -1))
	#  ,      .    .


Die Bewegungssteuerung sollte in einer separaten Methode implementiert werden, um eine Methode nicht zu kompliziert zu machen. Darüber hinaus kann niemand der Wiederholung desselben Codes in einem Artikel 33 Mal standhalten.



Ziehen um



Ich habe kürzlich einen interessanten Weg gelernt, einen Charakter zu kontrollieren, der eine Alternative zu der ersten Methode war, die ich beherrschte. Als nächstes werde ich beide Methoden zeigen:



  • Der erste, neue Weg für mich
  • func move_character() -> void:
    	var direction: float = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left") 
    	#         
    	#  (+  x,  0  1)  (-  x,  0  1).
    	#   = 0,   < 0  ,     
    	# ,    .
    	self.velocity.x = direction * MOVE_SPEED #   .
    #  const MOVE_SPEED = #      const GRAVITY
    
  • Zweiter Weg
  • func move_character() -> void: #  
    	var direction: float = 0
    	if Input.is_action_pressed("ui_left"):
    		direction = -1
    	elif Input.is_action_pressed("ui_right"):
    		direction = 1
    	else:
    		direction = 0
    	self.velocity.x = direction * MOVE_SPEED
    #  const MOVE_SPEED = #   #  const GRAVITY
    


Prallen



Der Sprung ist fast so einfach und eindeutig zu realisieren wie die erste Bewegungsmethode. Dazu müssen Sie eine Sprungkraftkonstante als Bewegungsgeschwindigkeit zu Beginn erstellen und einen Wert einstellen, der größer als der Wert der Schwerkraft ist. Gehen wir direkt zum Programmcode:



func jump() -> void:
	if self.is_on_floor(): # ,    .
	#     ,      
		if Input.is_action_pressed("ui_jump"): #    
				#  ui_jump      .
				#   "ui_up"
			self.velocity.y -= JUMP_POWER
# const JUMP_POWER...          


Es bleibt nur eine Karte zu zeichnen, Kollisionen und andere Dinge hinzuzufügen, die nicht direkt mit dem Hauptcode zusammenhängen, und für den Spielcharakter wird es möglich sein, endlich einen Lauf durch die Orte zu arrangieren, aber dies noch ein anderes Mal, weil ich bisher nicht herausgefunden habe, wie andere Codefragmente korrekter erklärt werden können , und dies geht über den Rahmen der Nachricht hinaus.



All Articles