Estou tentando programar um jogo do tipo "Pong" no Godot 3.5. Em contraste com o clássico jogo Pong, quero estabelecer a possibilidade de girar ligeiramente as barras de Pong para obter mais variedade. Depois que o jogador define alguma rotação para a barra Pong, quero corrigi-la lentamente até o ponto inicial com uma rotação de 0. De alguma forma, minha função de correção só funciona em rotações_degrees negativas ("esquerda"). Se houver rotações_graus positivos ("direita"), nenhuma correção será aplicada.
Meu código é assim. Eu já estava procurando bugs no método print. A correção da função é definir a rotação_direção para -0,2 como deveria, mas de alguma forma a rotação_direção na linha acima (veja meu comentário sobre o bug) parece manter o valor 0.
extends KinematicBody2D
var rotation_direction = 0
var max_rotation = 10
func _physics_process(delta):
if Input.is_action_pressed("right"):
rotation_direction = 0.5
if Input.is_action_pressed("left"):
rotation_direction = -0.5
rotation_degrees += rotation_direction ##possible bug?
rotation_degrees = clamp(rotation_degrees, -max_rotation, max_rotation)
correction()
func correction():
if rotation_degrees > 0:
rotation_direction = -0.2
if rotation_degrees < 0.0:
rotation_direction = 0.2
else:
rotation_direction = 0.0
Rotação de embrulho
Esta não é a questão em questão. Como a questão que abordo aqui só aconteceria em grandes rotações. No entanto, ajudará outras pessoas com problemas semelhantes. E isso dissipará suas suspeitas sobre o bug.
O conselho geral é envolver seus ângulos, assim:
ou para graus:
Então você pode deixar o ângulo se acumular e, quando precisar verificar, você envolve-o, para que eles representem a rotação no sentido mais curto. Por exemplo, três quartos de volta tornam-se um quarto de volta negativo.
O que é importante se você pretende limitar a rotação a um intervalo:
O inseto
Em
correction
,rotation_direction
será0.2
ou0.0
:Sim, você tem esta
if
declaração:No entanto, não importa o que aconteça, a segunda instrução if será executada e o fluxo de execução entrará em uma de suas ramificações:
A mudança mínima seria usar
elif
:No entanto, eu encorajaria o uso
sign
(signf
em Godot 4):Aqui
sign
retornará-1
ou0
representando1
o sinal derotation_degrees
. Negamos para obter o sinal oposto. E uma vez multiplicados pelos0.2
valores possíveis são0.2
,,0.0
e-0.2
.Sim, você pode envolver o ângulo lá também:
E como isso é apenas uma linha, você pode considerar fazê-lo
_physics_process
em vez de ter umcorrection
método separado.