No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Aprende todo un fin de semana sin pagar una suscripción 🔥

Aprende todo un fin de semana sin pagar una suscripción 🔥

Regístrate

Comienza en:

4D
1H
7M
47S

Dando vida a la pelota

10/16
Recursos

Aportes 18

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

Seguro el profe no lo quiso explicar para mantener el video simple, pero quería aclarar que la función randi SI funciona sin usar el randomize(), lo que pasa es que por default Godot usa la misma ‘seed’ de randomización para cada vez que ejecutamos el juego.
Si la primera vez la pelota salió para la derecha, sin usar randomize(), saldrá siempre para la derecha cada vez que lo ejecutemos (esto es util para debuggear)

Ejecutar randomize() genera una nueva ‘seed’ y nos permite tener diferentes resultados en cada ejecución.

Creo que al detectar la colisión se debería recalcular la dirección 🤔 basadose en cuál de los StaticBody2D haya colisionado.

Le adicione un giro a la bola con lo siguiente:

var angular_speed = PI 

func _physics_process(delta):
	if is_moving:
		var collide = move_and_collide(direction * speed * delta)
		rotation += angular_speed * delta
		
		if collide:
			direction = direction.bounce(collide.normal)

Para descargar la imagen pueden entrar aqui https://www.pngwing.com/en/search?q=ball y escogen la que quieran ❤️

ya puse la pelota 😃

func _physics_process(delta):
if is_moving:
var collide = move_and_collide(direction * speed * delta)
if collide:
direction = direction.bounce(collide.normal)
if collide.collider.has_method(“hit”):
collide.collider.hit()
Yo lo hice de esta forma y funciona, lo hice leyendo la documentacion en gadot pero realmente no me quedo muy claro como es que funciona.

Arreglado, la pared inferior necesitaba ser colocada en los limites del tablero.

La solución al problema planteado es que la pelota rebote al hacer contacto con la superficie inferior o superior. Imagino que esa característica se debe configurar desde las propiedades de la pelota.

Para todos aquellos que esten haciendo este tutorial con Godot 4.0, deben utilizar el metodo get_normal() en vez de acceder al parametro normal directamente. Esto es por los cambios de convencion que ocurrieron de una version a otra.

Por ende tu codigo, dependiendo de la version en la que estas trabajando, quedaria:

// PARA GODOT 4.0 
func _physics_process(delta):
	if is_moving:
		var collide = move_and_collide(speed * direction * delta);
		if collide:
			direction = direction.bounce(collide.get_normal()); //AQUI ESTA EL CAMBIO 

// PARA VERSIONES ANTERIORES
func _physics_process(delta):
	if is_moving:
	var collide = move_and_collide(speed * direction * delta);
	if collide:
		direction = direction.bounce(collide.normal);

Yo lo primero que pense para el rebote fue invertir la dirección pero claro solo servía para las paredes superiores no para el player

if collide:
			direction.y *= -1

La solucion al problema de porque no se mueve cuando colisiona, es porque esta intentando ir siempre en la misma direccion, es como si chocaramos contra una pared y intentamos seguir caminando, hay que decirle que de la vuelta y siga su trayectoria jajaja

Para poder probarlo usé a un “jugador 2” del largo de la pantalla 😅.
Por cierto, no encontré el sprite para la pelota así que usé un rectángulo con textura de ruido jaja.

Yo lo hice de la siguiente forma, si el proceso que hay dentro de la función _ready() hace que la pelota se mueva en una dirección aleatoria y la variable collide almacena el objeto con el que colisiona el balón, entonces, aisló todo ese proceso de _ready() en una función diferente que llame mover() y luego llamo a esta función en _ready() para que se ejecute una vez cargado el balón y en _physics_process() después de validar que la variable collide sea diferente a null.

La pelota ha chocado con otro objeto y ya no se mueve

No hemos cambiado el valor de is_moving, entonces creo que la pelota se quiere mover en cada nuevo frame, pero como su direccion sigue apuntando hacia el objeto, entonces no vemos cambio en su posicion (no se mueve)

Imagino que la funcion move_and_collide retorna un valor cuando el objeto choca o quiere moverse y el resultado de este movimiento es una colision

Podemos entonces, con un condicional en respuesta al choque, cambiar la direccion del movimiento en la pelota para que en el siguiente frame la pelota pueda moverse

De esta manera se podria hacer el efecto del rebote, que creo buscamos

Yo creo que para resolver el problema de la pelota se debe preguntar contra que elemento colisiono y dependiendo de esto cambiar la dirección de la pelota .

del reto del piso flotante es que al principio lo movio arriba de borde y tenia que moverlo debajo

yo pienso que si chocamos rebote dependiendo de la pared que choque:
Por ejemplo:
If collide:
direction = y que cambie a la derecha o izquierda

Bien, entiendo, entonces hicimos paredes con Collision Shape para que cuando la pelota se mueva y colisione con algo, lo detectemos y cambiemos su dirección, es interesante 😄