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 鈥榮eed鈥 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 鈥榮eed鈥 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(鈥渉it鈥):
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 鈥渏ugador 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 馃槃