Mécanique d'implémentation de Platformer sur le moteur de jeu GodotEngine

Bonjour, je développe des jeux sur Godot Engine depuis environ 2 ans, j'ai donc décidé de créer une collection de code de programme pour implémenter les mécanismes de base de la plateforme. Cette collection est conçue pour les nouveaux utilisateurs utilisant le moteur Godot.



Et oui, d'autres liens vers des articles ultérieurs seront fournis.



Code de base



Pour que le personnage obéisse à la physique, vous devez appeler move_and_slide () dans la méthode _process () ou _physics_process ().



Tout au long du code suivant, j'utiliserai le typage statique.



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)) 
	#        .
	#   -  ,    .
	#      .


Ce code suffira à faire bouger n'importe quel objet KinematicBody2D en fonction des collisions avec d'autres objets, mais il est impossible de contrôler cet objet, en particulier dans les plates - formes, cet objet ne peut toujours pas tomber. Pour que l'objet commence à tomber, vous devez augmenter la valeur de self.velocity.y d'une valeur positive. Le fait est que Godot Engine calcule les deux coordonnées du coin supérieur gauche au coin inférieur droit en mode 2D. Pour que l'objet tombe, vous devez ajouter quelque chose à l'accélération. J'utilise généralement la constante GRAVITY, qui est donnée au début du programme. Ensuite, le code sera présenté avec des modifications afin que l'objet tombe.



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))
	#  ,      .    .


Le contrôle de déplacement doit être implémenté dans une méthode distincte, afin de ne pas trop compliquer 1 méthode. De plus, personne ne peut résister à la répétition du même code dans un article 33 fois.



En mouvement



J'ai récemment appris une manière intéressante de contrôler un personnage, qui est devenue une alternative à la première méthode que j'ai maîtrisée. Ensuite, je vais montrer les deux méthodes:



  • La première, nouvelle façon pour moi
  • 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
    
  • Deuxième voie
  • 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
    


Rebondir



Le saut est réalisé presque aussi facilement et sans ambiguïté que la première méthode de mouvement. Pour ce faire, vous devez créer une constante de force de saut, comme la vitesse du mouvement au début, et définir une valeur supérieure à la valeur de la gravité. Passons directement au code du programme:



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


Il ne reste plus qu'à dessiner une carte, ajouter des collisions et d'autres choses qui ne sont pas directement liées au code principal et pour le personnage du jeu, il sera possible d'organiser enfin une course à travers les emplacements, mais à ce sujet encore une autre fois, car jusqu'à présent, je n'ai pas compris comment expliquer plus correctement d'autres fragments de code , et cela dépasse la portée du message.



All Articles