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.