Programando el movimiento y sus controles
Clase 9 de 16 • Curso Introductorio de Desarrollo de Videojuegos con Godot
Contenido del curso
Clase 9 de 16 • Curso Introductorio de Desarrollo de Videojuegos con Godot
Contenido del curso
Tomas Pucutay
Lucio Negrello
Maryoli Mosqueda
Franco Moreira
Lautaro Maidana
Santiago Sandino
N40 M10
Jorge Alejandro Thomas Luy
N40 M10
Belman Alexis Marin Franco
Bruno Ignacio Cardemil Sepúlveda
Juan Antonio Delgadillo Carrillo
Lucio Negrello
German Pérez Wolber
Cuauhtemoc Becerril
Lautaro Sebastián Alomar
Oscar Alberto Serna Moran
francisco lira
Cuauhtemoc Becerril
Cuauhtemoc Becerril
Jesús García
María González
Gustavo Ghioldi
Lucio Negrello
Ramón Puentes
Lucio Negrello
Ramón Puentes
Facundo Lopez
Platzi
Martín Jiménez Vázquez
Lucio Negrello
Carlos Arturo Rivas Manzanares
Lucio Negrello
Antonio Mesa Casares
Lucio Negrello
Luigi Alberto Suarez Vera
Luis Pablo Canul García
Hola, vengo del futuro. Estamos usando Godot 4 y tiene algunas peculiaridades importantes. Es broma, pero si es cierto que decidí usar la Beta de Godot 4 para aprender con ello a medida que se desarrollan las clases, por supuesto esto implica mucha lectura de la comunidad en Discord para ir entendiendo cada paso del proceso. GDScript cambia en algunos de sus métodos. . En particular el método usado en esta clase move_and_slide ya no acepta argumentos, entonces move_and_slide (direction * speed) es inválido. En su lugar se puede manejar de este modo (Nota: El nodo CharacterBody2D es el KinematicBody2D de Godot 3.x)
extends CharacterBody2D const SPEED = 400.0 func _physics_process(delta): var direction = Vector2.ZERO # Handle up movement. if Input.is_action_pressed("ui_up"): direction.y -= direction * SPEED # Handle down movement. if Input.is_action_pressed("ui_down"): direction.y += direction * SPEED move_and_slide()
De igual forma hay un modelo más simple de escribirlo. Esto lo aprendí a prueba y error, por medio del template que trae por defecto CharacterBody2D y descomponiéndolo en sus bloques. La pieza de código a continuación hace lo mismo.
extends CharacterBody2D const SPEED = 400.0 func _physics_process(delta): var direction = Input.get_axis("ui_up", "ui_down") velocity.y = direction * SPEED move_and_slide()
Espero que les sirva por si alguien también se aventuró a hacerlo por medio de Godot 4. La clave está en experimentar, probar, romper y mejorar. Nunca paren de aprender
Excelente aporte, Tomás! No quiero adelantarme, pero seguramente cuando salga la versión 4 de Godot, armemos un nuevo curso para actualizarlos. Saludos!
yo tambien vengo de godot 4 :P
con lo de hizo Unity es necesario actualizar los cursos de godot urgente
apoyo el comentario
Por eso llegue aca lol
Todo bien avanzando sin inconvenientes,
Linux?
Exacto akrista.
Listo el movimiento! :D
Para los que estén usando las ediciones más nuevas de Godot (yo estoy usando 4.4.1) move_and_slide() usa una propiedad interna del nodo que se llama velocity Asi que sin modificar mucho el código que se hizo en la clase, este es el resultado
extends CharacterBody2D var speed = 400 func _physics_process(delta): var direction = Vector2.ZERO if Input.is_action_pressed("ui_up"): direction.y -= 1 if Input.is_action_pressed("ui_down"): direction.y += 1 velocity = direction * speed move_and_slide()
Por que razon no se puede mover para arriba lo puse igual y leei otrso comentarios
Hola Juan, cómo estás?
El problema más común es usar Input.is_action_just_pressed("ui_up") en lugar de Input.is_action_pressed("ui_up").
La primera se ejecuta solo al detectar la presión y la segunda todo el tiempo que está presionada.
Supongo que con eso vas a poder resolverlo. Si el problema sigue, por favor compartinos tu código para revisarlo.
Saludos!
Gracias Profe. Había tenido el mismo problema. Una pavada y cambia todo...
Godot 4.1.2
extends CharacterBody2D @export var speed = 400.0 func _get_input(): var input_direction = Input.get_axis("ui_up", "ui_down") velocity.y = input_direction * speed func _physics_process(_delta): _get_input() move_and_slide()
No me gusto mucho que este tan desactualizado, me costo bastante encontrar las soluciones, ya quedo viejo este video, hoy en día Godot cambio bastante.
Hay varias cosas que cambian en godot 4, de casualidad no tendra ya un curso de godot 4?
me toco modificar unas cositas```js extends CharacterBody2D
godot v 4.4.1
var speed = 10 func _physics_process(_delta): var direction = Vector2.ZERO
if Input.is_action_pressed("ui_up"): direction.y -= 1* speed if Input.is_action_pressed("ui_down"): direction.y += 1* speed # no funciona #direction = direction.normalized() * speed #move_and_slide() move_and_collide(direction)
\# godot v 4.4.1 var speed = 10 func \_physics\_process(\_delta): 	var direction = Vector2.ZERO 	if Input.is\_action\_pressed("ui\_up"): 	 direction.y -= 1\* speed 	if Input.is\_action\_pressed("ui\_down"): 	 direction.y += 1\* speed 	\# no funciona 	\#direction = direction.normalized() \* speed 	\#move\_and\_slide() 	move\_and\_collide(direction)
Godot 4.2.1
extends CharacterBody2D const SPEED = 400.0 func get_input(): var input_direction = Input.get_axis("ui_up", "ui_down") velocity.y = input_direction * SPEED func _physics_process(_delta): get_input() move_and_slide()
En pysics_proces(), creo que ahora lo correcto es usar float, en lugar de delta
Así
func _physics_process(float):
Hola, estuve batallando con algo diferente que el código, por que vi ejemplos de los compañeros para versiones más recientes y en la documentación usé uno para movimientos en 4 se direcciones, y nada. El problema es que no me detectaba las teclas, solo abrí y cerré el programa, como todo buen técnico en mtto, y ya funciono, por si alguien tiene ese problema. Dejo el link de la parte de la documentación.
Movimiento en 2D — Documentación de Godot Engine (4.x) en español
Hola!! Por si les sirve, yo estoy utilizando actualmente la versión 4.3 de Godot y cuando utilizo el código que se realiza en el video no se mueve el objeto y saltan algunos errores, sin embargo, estas son las líneas de código que utilice para poder moverlo solo en las direcciones de arriba y abajo sin problemas:
extends CharacterBody2D const SPEED = 300.0 func _physics_process(delta: float) -> void: var direction := Input.get_axis("ui_up", "ui_down") if direction: velocity.y = direction * SPEED else: velocity.y = move_toward(velocity.x, 0, SPEED) move_and_slide()
Como puedo hacer para loggear datos por consola?? Actualmente estoy unsando print pero no se si existe algun logger. Gracias!
Hola Gustavo, cómo estás? No conozco si hay algún plugin de la comunidad para loggear, pero dentro de las herramientas nativas se suele usar el print. No lo había pensado, pero podría ser un buen agregado una mejor herramienta de logging. Saludos!
Hola profesor Lucio, tenía una pregunta: en el script del player me sale en rojo la sintásis eso a ¿qué se deberá? y al darle play no se me reproduce.
extends KinematicBody2D
var speed = 400
func _physics_process(delta): var direction = Vector2.ZERO
if Input.is_action_just_pressed("ui_up"): direction.y -= 1
if Input.is_action_just_pressed("ui_down"): direction.y += 1
move_and_slide(direction * speed)
Hola Ramón, cómo estás? En el print puedo ver que están modificadas las identaciones de las línes. Fijate que te quedaron los dos IF anidados y la función move_and_slide dentro del segundo IF. Todo eso debería quedar en el mismo nivel de identación para que funcione correctamente. Saludos!
Hola Profesor Lucio, es un placer caludarle. Si ya lo logré resolver, gracias por su amable y pronta respuesta. Se lo agradezco, sigo avanzando 😃
extends KinematicBody2D
var speed = 400
func _physics_process(delta):
var direction = Vector2.ZERO
if Input.is_action_pressed("ui_up"):
direction.y -= 1
if Input.is_action_pressed("ui_down"):
direction.y += 1
move_and_slide(direction*speed)
El problema puede estar en el código de input. Verifica que las acciones 'ui_up' y 'ui_down' estén correctamente configuradas en el proyecto.
Tengo una duda, mi código está igual, pero la barrita no avanza de corrido, sino que tengo que apretar varias veces la tecla, ¿cómo lo puedo solucionar?
Hola Martín, cómo estás?
El problema es que estas usando Input.is_action_just_pressed("ui_up") en lugar de Input.is_action_pressed("ui_up").
La primera se ejecuta solo al detectar la presión y la segunda todo el tiempo que está presionada.
Saludos!
func _physics_process(_delta):
Tuve que cambiar el código a _delta para que cambiara el marco de advertencias de la parte inferior ¿por qué pasa eso? y también me aparece el mensaje de que move and slide está tomando un valor, pero que nunca se usa ¿alguien sabe que significa?
Hola Arturo, cómo estás? Revisá el identado del código y la versión de Godot que estes usando, porque puede estar relacionado con eso. Sino, en todo caso subí el código a un repo y lo revisamos para ver qué puede estar pasando. Saludos!
En el vídeo se indica que se va a compartir ciertos links a cursos y/o información pero aparece vacío. No se si es por que no me sale a mi o por que no se han subido. Gracias. Por lo demás muy bien el curso y bien explicado.
Hola Antonio, cómo estás? En la pestaña de Recursos, podés encontrar los diferentes links a los que hago referencia en las clases. Saludos!
Hola escribi tal cual el codigo del profe pero no me sale, entonces trate de multiplicar el 1 * la const y nada, estoy en la version 4 de godot agredeceria ayuda
Hola compañero me paso lo mismo utilizando la versión 4 de godot, la cual ya cuenta con una propiedad llamada "velocity" y esa es la que tendríamos que usar aquí te dejo el código que me funcionó:
extends CharacterBody2D var speed = 400 func _physics_process(delta): velocity = Vector2.ZERO if Input.is_action_pressed("ui_up"): velocity.y -= 1 if Input.is_action_pressed("ui_down"): velocity.y += 1 velocity = velocity.normalized() * speed move_and_slide()
Espero que te funcione, esto es utilizando move_and_slide pero igual aquí te dejo otra forma utilizando move_and_collide. Aquí si puedes declarar la variable direction ya que al final esta variable es la que pasas como parámetro, te dejo el código:
extends CharacterBody2D var speed = 50 func _physics_process(delta): var direction = Vector2.ZERO if Input.is_action_pressed("ui_up"): direction.y -= 1 * speed if Input.is_action_pressed("ui_down"): direction.y += 1 * speed move_and_collide(direction)