Mecânica para implementação de plataforma no GodotEngine Game Engine

Olá, venho desenvolvendo jogos no Godot Engine há cerca de 2 anos, então decidi criar uma coleção de código de programa para implementar a mecânica básica da plataforma. Esta coleção é projetada para novos usuários que usam o mecanismo Godot.



E sim, mais links para artigos subsequentes serão fornecidos.



Código Base



Para que o personagem obedeça à física, você precisa chamar move_and_slide () no método _process () ou _physics_process ().



Em todo o código a seguir, usarei a digitação 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 fazer qualquer objeto KinematicBody2D mover-se dependendo de colisões com outros objetos, mas é impossível controlar este objeto, principalmente em plataformas este objeto ainda não pode cair. Para que o objeto comece a cair, você precisa aumentar o valor de self.velocity.y por um valor positivo. O fato é que Godot Engine calcula ambas as coordenadas do canto superior esquerdo para o inferior direito no modo 2D. Para que o objeto caia, você precisa adicionar algo à aceleração. Eu geralmente uso a constante GRAVITY, que é fornecida no início do programa. A seguir, o código será apresentado com alterações para que o objeto caia.



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


O controle de movimentação deve ser implementado em um método separado, para não complicar muito 1 método. Além disso, ninguém pode suportar a repetição do mesmo código em um artigo 33 vezes.



Em movimento



Recentemente, aprendi uma maneira interessante de controlar um personagem, que se tornou uma alternativa ao primeiro método que dominei. A seguir, mostrarei os dois métodos:



  • A primeira e nova maneira para mim
  • 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 via
  • 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
    


Pulo



O salto é realizado quase tão facilmente e sem ambigüidade quanto o primeiro método de movimento. Para fazer isso, você precisa criar uma constante de força de salto, como a velocidade do movimento no início, e definir um valor maior que o valor da gravidade. Vamos direto ao código do 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...          


Resta apenas desenhar um mapa, adicionar colisões e outras coisas que não estão diretamente relacionadas com o código principal e para o personagem do jogo será finalmente possível organizar uma corrida pelos locais, mas isso ainda será uma outra hora, porque até agora não descobri como explicar mais corretamente. , e isso está além do escopo da mensagem.



All Articles