Mecánicas para implementar un juego de plataformas en el motor de juego GodotEngine

Hola, he estado desarrollando juegos en Godot Engine durante aproximadamente 2 años, así que decidí crear una colección de código de programa para implementar la mecánica básica de plataformas. Esta colección está diseñada para nuevos usuarios que utilizan el motor Godot.



Y sí, se proporcionarán más enlaces a artículos posteriores.



Código base



Para que el personaje obedezca a la física, debes llamar a move_and_slide () en el método _process () o _physics_process ().



A lo largo del siguiente código, usaré escritura estática.



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


Este código será suficiente para hacer que cualquier objeto KinematicBody2D se mueva dependiendo de las colisiones con otros objetos, pero es imposible controlar este objeto, especialmente en plataformas este objeto todavía no puede caer. Para que el objeto comience a caer, debe aumentar el valor de self.velocity.y en un valor positivo. El hecho es que Godot Engine calcula ambas coordenadas desde la esquina superior izquierda a la inferior derecha en modo 2D. Para que el objeto caiga, debes agregar algo a la aceleración. Normalmente utilizo la constante GRAVITY, que se da al principio del programa. A continuación, el código se presentará con cambios para que el objeto caiga.



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


El control de movimiento debe implementarse en un método separado, para no complicar demasiado 1 método. Además, nadie puede soportar la repetición del mismo código en un artículo 33 veces.



Moviente



Recientemente aprendí una forma interesante de controlar un personaje, que se convirtió en una alternativa al primer método que dominé. A continuación, mostraré ambos métodos:



  • La primera, nueva forma para mí
  • 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
    
  • Segunda forma
  • 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
    


Rebotar



El salto se realiza casi tan fácilmente y sin ambigüedades como el primer método de movimiento. Para hacer esto, debe crear una constante para la fuerza del salto, como la velocidad de movimiento al principio y establecer un valor mayor que el valor de la gravedad. Vayamos directamente al código del programa:



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


Solo queda dibujar un mapa, agregar colisiones y otras cosas que no están directamente relacionadas con el código principal y para el personaje del juego finalmente será posible organizar un recorrido por las ubicaciones, pero sobre esto en otra ocasión, porque hasta ahora no he descubierto cómo explicar otros fragmentos de código de manera más correcta. , y esto está más allá del alcance del mensaje.



All Articles