Atracción de objetos


Vamos a hacer un efecto de atracción: cuando el jugador se acerque, las monedas se moverán a su posición. Como con un imán.

Puedes descargar el proyecto desde: Aquí

Y desde aquí lo puedes descargar y colaborar con el desarrollo de éste y los próximos tutoriales: Aquí

Creando los nodos.



Para probar el efecto, vamos a necesitar dos nodos principales: el jugador y la moneda.


Como podemos ver, el jugador no tiene nada en especial. Prácticamente toda la acción es realizada por la moneda, que es un RigidBody2D. Tiene dos colisiones diferentes, la primera es el CollisionShape que se encuentra como hijo directo del RigidBody y la segunda es del "Area_Col" un área2D que esta dentro del RigidBody, esto es así porque es más fácil detectar las colisiones desde un área, que desde la moneda, ya que los cuerpos de RigidBody tienen métodos distintos que un Kinematic normal.

Es obligatorio que un cuerpo físico (Kinemaic, Static, Rigid) tenga un CollisionShape como hijo directo, por eso es que no dejamos solamente la colisión del Area2D.

No me detengo a explicar el movimiento del jugador o la animación de la moneda, ya que pueden verlo en los siguientes artículos:

Creando el Script de la moneda.


Necesitamos que el código se compruebe en todo momento, entonces, desde la función para procesos, vamos a comprobar que la posición de la moneda este a una distancia menor a los 90 pixeles del jugador. Es decir: con el "global_position.distance_to()" estamos declarando que al estar a una distancia en especifico, de la posición global de una moneda, vamos a hacer algo. Esa posición en especifico es la global del personaje, la podemos obtener usando el $"../player".global_position.

Cuando el jugador se encuentra a una distancia menor de 90 pixeles, la moneda va a recibir una velocidad con la que se desplaza en cualquier dirección. Toma como ejemplo la resta de la posición del jugador menos la posición de la moneda y desde ese punto agarra la velocidad del 400 cada segundo (400*delta). El delta es el tiempo... y el 400 puede ser reemplazado por una variable. Para que sea más sencillo su cambio.

Añadiendo la señal del área.


El Area2D de la moneda tiene una señal, para que se conecte con el script cada vez que un cuerpo físico entre en el área, determinada por el CollisionShape dentro del Area2D. Cuando conectamos la señal, se nos crea lo siguiente:

Y sólo tenemos que completarlo:

El parámetro en la función (body), determina al cuerpo que entró en el Area2D, puede que sea un enemigo, una nave, un perro o cualquier cuerpo físico. Por eso tenemos que comprobar qué es lo que entró, preguntando si el "body" se encuentra dentro del grupo "Jugadores". En caso de que sea el jugador, destruiremos la moneda, pero también pueden hacer que se sumen puntos o cualquier otra cosa.

Para añadir al jugador en el grupo "Jugadores", tienen que ir al nodo del player y hacer clic en la parte de "Nodo" seguido de la pestaña "Gupos" y escribir el nombre "Jugadores".

Para aprender más sobre los grupos, puedes ver Aquí.

Espero que esta información les sea útil. Cualquier duda la pueden dejar en los comentarios.

Comentarios