Estou lendo o tutorial do CharacterBody2D no Godot: https://docs.godotengine.org/en/4.2/tutorials/physics/using_character_body_2d.html
Afirma:
O que é um corpo de personagem?
CharacterBody2D serve para implementar corpos controlados by way of código. Os corpos dos personagens detectam colisões com outros corpos quando em movimento, mas não são afetados pelas propriedades físicas do motor, como gravidade ou atrito. Embora isso signifique que você terá que escrever algum código para criar seu comportamento, também significa que você terá um controle mais preciso sobre como eles se movem e reagem.
Além disso:
mover_e_collide
Este método utiliza um parâmetro obrigatório: um Vector2 que indica o movimento relativo do corpo. Normalmente, este é o seu vetor de velocidade multiplicado pelo intervalo de tempo do quadro (delta). Se o motor detectar uma colisão em qualquer lugar ao longo deste vetor, o corpo irá parar imediatamente de se mover. Se isso acontecer, o método retornará um objeto KinematicCollision2D.
move_and_collide é mais útil quando você deseja apenas mover o corpo e detectar colisão, mas não precisa de nenhuma resposta automática à colisão. Por exemplo, se você precisar de uma bala que ricocheteie em uma parede, poderá alterar diretamente o ângulo da velocidade ao detectar uma colisão. Veja abaixo um exemplo.
mover_e_slide
O método move_and_slide() tem como objetivo simplificar a resposta à colisão no caso comum em que você deseja que um corpo deslize ao longo do outro. É especialmente útil em plataformas ou jogos de cima para baixo, por exemplo.
O código de exemplo que acompanha (basic_movement.gd) demonstra:
Exemplos
Para ver esses exemplos em ação, baixe o projeto de amostra: character_body_2d_starter.zip
extends CharacterBody2D var pace = 300 func get_input(): var input_dir = Enter.get_vector("ui_left", "ui_right", "ui_up", "ui_down") velocity = input_dir * pace func _physics_process(delta): get_input() move_and_collide(velocity * delta)
Este objeto para o corpo quando atinge uma parede.
Nas aulas de física, frequentemente discutimos a velocidade (por exemplo, ao colidir com paredes, produzindo sons e convertendo energia que afeta a velocidade). No entanto, a documentação do Godot afirma:
“Os corpos dos personagens detectam colisões com outros corpos quando se movem, mas não são afetados pelas propriedades físicas do motor, como gravidade ou atrito.”
Quando tentei executar o código de exemplo, o objeto parou quando colidiu. Isso pode ser dito como a velocidade do objeto se tornando zero.
A velocidade não está relacionada à física em um motor de jogo? Parece intrigante.
Alternativamente, se o objeto parar sem qualquer impacto físico, o que o teria influenciado? A parede não é física?
Além disso, embora diga: “você precisa escrever algum código para criar o comportamento deles, isso também significa que você tem um controle mais preciso sobre como eles se movem e reagem”. sua velocidade torna-se automaticamente zero. O que exatamente eu preciso para me implementar?
Meta:
A documentação menciona apenas “propriedades físicas, como gravidade ou atrito”, então quero esclarecer o que constitui “física”.
Como não está claro o que se qualifica como física, não sei o que implementar. Por exemplo, não devo implementar nada porque a velocidade torna-se automaticamente zero? Ou devo lidar com o que acontece depois de parar?
Pretendo começar a programar para física, mas é ambíguo onde termina e onde não termina a funcionalidade integrada do mecanismo de jogo (devido a expressões vagas como “curtir”). Isso dificulta o início da programação, por isso quero deixar o ponto de partida mais claro.
O código de amostra bullet.gd parece calcular a velocidade de salto manualmente (exigindo que o desenvolvedor do jogo decide ele mesmo a velocidade de salto).
extends CharacterBody2D var pace = 750 func begin(_position, _direction): rotation = _direction place = _position velocity = Vector2(pace, 0).rotated(rotation) func _physics_process(delta): var collision = move_and_collide(velocity * delta) if collision: velocity = velocity.bounce(collision.get_normal()) if collision.get_collider().has_method("hit"): collision.get_collider().hit() func _on_VisibilityNotifier2D_screen_exited(): # Deletes the bullet when it exits the display. queue_free()