Hasta ahora el mejor tutorial que vi respecto a "maquina de estados". Programo por hobby y cuando que el personaje tenia que hacer cosas complejas no conseguía mantener el código claro y limpio, cada vez que quería agregar alguna característica nueva o interacción tenia que reescribir mucho código hasta que me ganaba la frustración. Gracias por tu aporte.
@fertakusM3 ай бұрын
Me pasaba lo mismo con el codigo Insostenible... Con maquina de estados la vida cambia a mejor!! 🤣🤣🤣😍😍👏👏
@gp7753Ай бұрын
Grandes tus videos como siempre, aunque para un completo principiante en programación (como yo) de repente son algo confusos, primero estamos en un nivel basico y luego salta a modo hard! y ya otra vez regresa a basico y luego pasa por un intermedio, etc. jajaja Ojalá pudieras sacar una serie de videos en modo basico, otra serie en intermedio y otra en avanzado, para que los que llegamos aqui a programar desde cero no de repente choquemos contra esto jajaja Una vez mas mil gracias por tus videos, son muy buenos!! Ya que sepa más regresaré sin duda!
@dandorf229 ай бұрын
Justo el tutorial que necesitaba! Estoy empezando con Godot 4 y me vienen super bien tus vídeos. Muchísimas gracias por compartir tu conocimiento 😊😊
@fertakusM9 ай бұрын
Gracias crack, espero que te sirvan de ayuda! Un saludo!
@davidemanueldedio93344 ай бұрын
tremendo tutorial has compartido! tu manejo de godot es magistral! felicitaciones! estoy muy agradecido contigo por compartir tus conocimientos! un Abrazo grande! 👏
@dobstedpanopo2 ай бұрын
Yo hice hace mucho una similar, pero el mio era mas bien tener todos los metodos en el characterBody, y estos se ejecutaban en los estados individuales, al menos me servia asi
@manuelmartin82372 ай бұрын
Muchas gracias por este video, vengo de unity y aun no sabia como crear unas maquinas de estado bien chulas, pero con tu video problema solucionado, eso si yo el control de movimiento del personaje no me gusta dejárselo al player en si, sino que me gusta metérselo al State de movimiento (Creo que podría ser mejor de esta manera, no estoy seguro)
@jaredhy10 ай бұрын
Por fin llego el dia😂 Esto me podria servir para hacer jefes junto con variables que decidan que estado ejecutar aleatoriamente usando una version del sistema de dropeo de armas aleatorias que hiciste?
@D_06. Жыл бұрын
No pude 😵, tengo mi codigo pero me hice una bola tratando de hacer una maquina de estados para mi proyecto en 3D. Osea, tengo estados dentro de mi gdscript pero no lo puedo separar en varios gdscript y que quede funcional como antes 😓 gracias por compartir tu conocimiento 12 hrs después: Lo logré 🎉 no como lo muestras tu, pero la idea es la misma. En vez de agregar los gdscript a cada nodo. Los volví una Clase y los llamo directamente de mi script principal sin necesidad de agregarlos a nodo alguno. Solo el principal que va ligado a mi personaje jugable. Y lo mejor es que pude hacer llamados en el código de mi enemigo y me ahorre trabajo 😁. Gracias por la orientación de tu vídeo 🦾
@fertakusM Жыл бұрын
Olé! No entiendo exactamente como cuentas que llamas a los "script de classe" en cada nodo (entiendo que cada nodo te refieres a una classe no?). Pero lo importante es que funcione, y si al final conseguiste éso pues genial! La idea es que quede el código mucho más ordenado y repartido en diferentes scripts para que sea más fácil modificar y escalar a futuros! Un saludo!
@alfredogodoy6854 Жыл бұрын
Estos temas son oro! me gustaria ver Utility AI, vi un video de introducción en otro canal famoso de godot y me quedé con ganas de verlo implementado 🤖
@fertakusM Жыл бұрын
Pues no he implementado IA en godot (hice algunas IA experimentales con python años atrás) pero la verdad es que debe de tener mucha relacion con la state machine. Al final debes (creo) entrenar a la IA en busca de un resultado y ella solo debe de ir cambiando de estado (o no) cada cierto tiempo. Tambien es posible hacerlo con los imputs, que al final no son tantos (movimientos, disparo, salto.. Etc) Algun dia lo traeré al canal, pero no puedo decir cuándo ya que primero debo aprenderlo bien yo antes de aventurarme a explicarlo (claro). Un saludo, gracias por el comentario
@lordav55209 ай бұрын
Sería interesante un video de IA de training. Mira el canal warehouse IA. A ver si te interesa crack!
@elmega23 Жыл бұрын
muy buen video este era el tutorial q buscaba sigue adelante pd: nuevo subs
@fertakusM Жыл бұрын
Muchas gracias crack!
@MaritoRelax Жыл бұрын
Nooo acá me fui a la mierda jajaja iba como avión, pero esto me abrumó y según vi, seguirás usando la máquina de estados en tus otros videos por lo que tendré que hacerla. Voy a tardar un poco así que te dejaré las preguntas que tengo en este video, pero antes muchas gracias por el tiempo que inviertes para enseñar y en responder los comentarios. Preguntas: 1. ¿Hay alguna manera de crear un sector secreto? Me refiero a cuando atraviesas una pared y al hacerlo se hacen visibles los item y cosas que antes no se veían. Es un recurso que se usa mucho en juegos plataformeros y me dio curiosidad. 2. ¿Puedes crear un "dash" o un deslizamiento apretando dos veces la flecha (o el botón que sea)? 3. ¿Hay algo después de la muerte? 4 ¿Por qué los que leen esto son tan geniales e inteligentes? ¡Eso! Gracias de nuevo y quedo atento a tus comentarios.
@fertakusM Жыл бұрын
Si, es un pelín más complejo esto pero es más que necesario para mantener un orden en nuestro código por que se nos estaba complicando ya demasiado. Claro esta que, dependiendo del juego que quieras hacer, puedes seguir como hasta ahora sin la maquina de estados. Aunque cuando hagamos un enemigo autómata, nos irá también muy bien tener este concepto ya mas-o-menos claro.
@fertakusM Жыл бұрын
A tus preguntas las respuestas son todas: Si! Excepto la 4rta pregunta, donde la respuesta es: Hemm.. ¿que? xD eing?
@oscarraido865 Жыл бұрын
Gracias por el video, la verdad es que queda chulo, en Unity vi como hacerlo y quizás quedaba algo mas "limpio" al usar clases para definir Acciones y Decisiones, pero me ha gustado como lo has hecho. También probé en Unity lo ML, si algún día te interesa tratarlo en Godot me encantaría.
@fertakusM Жыл бұрын
ML Te refieres a MachineLeraning no? Tengo muchas ganas de trastear con eso pero me da miedo que se vuelva demasiado inteligente, se converta en Skynet y nos aniquile a todos... Pero si, la verdad es que tengo muchas ganas de ello. De echo, la maquina de estados esta es un primer paso para una ML. Ahora faltaría la "chicha" que sería un algoritmo capaz de aprender en base a ir cambiando de estados y tal... Explicado así mira que fácil no? solo me ha costado 2 líneas.. pero bien se sabe que tiene su "cosa"(aunque tampoco es extremadamente complejo). Fuera del mundo de los videojuegos, tiempo atrás, aprendí y realice una I.A. capaz de aprender en base a un entrenamiento programado. Seguí unos papers que compartió dotCsv en su canal, en algún video. (te hablo de varios años atrás). Él es un crack de las inteligencias artificiales, sus algoritmos y tal y distintos métodos de entrenamiento. Su canal es este: www.youtube.com/@DotCSV No se si hoy en día sigue haciendo los videos más así prácticos y tal. Si buscas en sus videos viejunos o encontrarás seguro... Y lo explica de esa manera que dices: Joder, pues lo entiendo! Espero que sirva de ayuda, Un saludo!
@oscarraido86511 ай бұрын
Gracias tío, le echaré un ojo. También voy a probar RL Agents, cuando avance ya te contaré. @@fertakusM
@tumas00 Жыл бұрын
Veo que lo de la fruta, lo mencionas pero no lo modificas. Para quien le pueda servir explico lo que yo he hecho: Primero he puesto al Ninja frog en el grupo "player". No se si este existía ya porque yo he estado haciendo modificaciones sobre la marcha. Yo lo tenía en el grupo "characters", por si existían más personajes que pudieran interectuar con el portal, que tuviera un nombre más generico. Luego he creado un AudioStreamPlayer2D en el nodo de la fruta al que he llamado "SfxCollect". Entonces en el codigo de la fruta, he modificado esto: func _on_area_2d_body_entered(body): if body.has_method("collect_fruit"): body.collect_fruit(fruit_type) animated_sprite_2d.play("collected") Por esto: func _on_area_2d_body_entered(body): if body.is_in_group("player"): var aux_string = fruit_type + "_points" var gained_points = GeneralRules[aux_string] body.fruit_count += gained_points $SfxCollect.play() animated_sprite_2d.play("collected") *No se si Fertakus lo hizo así en su día, porque como digo he ido cambiando cosas, pero por si acaso "animated_sprite_2d" hace referencia a: @onready var animated_sprite_2d = $AnimatedSprite2D
@fertakusM Жыл бұрын
Se ve genial! Se me olvidó esto de la fruta pero ya creo que no lo haré por que se ve de lujo el codigo! Mchas gracias catacrack!
@sebastianwolff21759 ай бұрын
hola, que tal? a ti te funciono en general la mecanica del video? me dejo sin poder usar el salto....
@SlowHush9 ай бұрын
@@sebastianwolff2175es porque de borro la línea de "ui, accepts", solo vuelve la a escribir y listo
@diegosayago81308 ай бұрын
minuto 4:07 escelente mensaje subliminal... se merece una suscripcion
@fertakusM8 ай бұрын
así, como el que no quiere la cosa, no hace falta (suscribete) interrumpir ningún flujo de información. :)
@jhdev98210 ай бұрын
Gracias carck muy buen video, yo intente implementar la maquina de estados de un sistema de combos con rotacion del mouse, y no se solo me pasa a mi pero en cada funcion que hereda de la clase state no puedo poner mas de un condicional (solo uno ) dato interesante
@fertakusM10 ай бұрын
Hola crack, es muy rato esto que comentas, no tiene ningún sentido! 🤣🤣 Dale un buen vistazo al codigo por que seguro que hay algo que se te escapa por que no puede ser eso! No hay ninguna restricción al sobreescribir una función de una clase. Un saludo!
@lordav55209 ай бұрын
Gracias por tus conocimientos!!! A ver si me pongo ya con la machine, el problema es que lo hicimos con otra version de godot y ahora en el bomberman use la ultima... xD quiero implementar en ambos la maquina de estado. Porque hay varios bugs, que igual se podrian corregir. A los enemigos tqmbien se les puede añadir machinestate no?
@sebastianwolff21759 ай бұрын
se puede realizar un scripts par ataque? ya que no vi nada en relación a los ataque melee. un abrazo!
@truenincillo8059 ай бұрын
Hola , me gustaria saber si se podria crear state_machine de nadar ?
@neomartscp594410 ай бұрын
Muchas gracias por el tutorial,pero tengo una duda y es: ¿como puedo acceder a "direction" dentro de los estados para usarlo dentro de otras funciones como "state_input"?
@fertakusM10 ай бұрын
Hola crack, Como siempre: hay mil maneras. Pero a cada estado en el tutorial ya le pasamos, desde el script de machine state, la referencia de character. Entonces puedes acceder a todas las variables, funciones y métodos de character desde cualquier estado con un simple: character.direction (por ejemplo) Un saludo!
@Rolan_Dot8 ай бұрын
Puedes hacer un tutorial de como hacer un boss que siga un patrón de moviento pero con ataques al azar
@jhovala9 ай бұрын
mmm asi si me anime a usar godot xD
@tumas00 Жыл бұрын
O-key! Tengo pendiente el tuto, es muy largo y no encuentro el tiempo. Putas responsabilidades.
@fertakusM Жыл бұрын
No passa res, tens tota la eternitat per veure'l (o fins que youtube vagi a la bancarrota i desendollin els servidors xDD). Ara, aquest tuto crec que es el més interessant que he fet, amb diferencia!
@tumas00 Жыл бұрын
@@fertakusMja, però tinc ganes de veure aquest tema. Algo he vist a altres llocs però crec que no tenen molt clar de que va el tema😂 X cert, t'he escrit per Patreon
@AlexTrajanus6 ай бұрын
35:30
@sebastianwolff21759 ай бұрын
Hola, correción el boton de "jump" (espacio) no funciona, al parecer dejo de funcionar cuando se borro codigo de (ui_accepts)
@davidjacobs2533 Жыл бұрын
no deberia verse tan asi el codigo tan spagueti. a veces siento que las personas que hacen video juegos estaban movidas por su pasion por los video juegos pero la mayoria salto directo a un motor o un lenguaje. pero jamas aprendieron a programar bien. por ejemplo haciendo funciones que realicen una sola tarea y despues usar la composicion de funciones, usandolas como funciones auxiliares para crear funciones mas grandes. no tantas anidaciones de condicionales. o almenos definir bien lòs metodos del objeto. es bien imperativo el codigo de la mayoria de tutoriales de godot. pero bueno de todas maneras se agradece la inspiracion y la enseñanza de algunas cuestiones especificas de godot que aun estoy aprendiendo
@fertakusM Жыл бұрын
Si! Me que da mucho por aprender! (por suerte!) Muchas gracias crack! Un saludo
@tumas00 Жыл бұрын
Fer, creo que lo del tiempo en el wall_jump es paranoia tuya! A mi me pasa una cosa bastante rara, tengo 5 piezas de oro en linea, la quinta y solo la quinta, funciona solo a veces...
@fertakusM Жыл бұрын
Lo del tiempo te refieres a ese momento en que le fuerzo la velocidad.y = 0 en el AirState para que se ejecute antes de entrar en el WallJumpState? Igual si es paranoia, pero me parecía que se frenaba algún pixel demasiado tarde. nu se. Lo del fallo con las 5 piezas en línea es curioso no? Cual falla de las cinco? la de más abajo o la de más arriba? Le has visto ya algún "porque" ? Saludos!
@tumas00 Жыл бұрын
@@fertakusM, la que falla es la de arriba del todo. Que por cierto no es la 5a sinó la 6a. Me confundí porque antes era la 5a, y ya fallaba entonces. Mis bloques pegables son de 3 casillas, que no influye en nada, pero te lo cuento. ¿Porque falla? Se escapa a toda logica. Pues no sigue un patrón ni nada. Falla le entres por arriba y entonces es el 1o o le entres por abajo y entonces es el último. Pero, a veces no falla. Misterio.
@ene52278 ай бұрын
@@tumas00buenas, estos errores son comunes en los , corta y pega, en los que copias un trozo de código, luego modificas un trozo y el otro no,y dan esos errores,comportamientos aleatorios. No digo que sea este el caso, pero suele pasar por eso.
@tumas008 ай бұрын
No hay aquí ningún corta y pega modificado.
@AgriasOaks9910 ай бұрын
Do you have english version? 😅
@fertakusM10 ай бұрын
Hey! Sorry but no.. At least not yet! Can't you find this kind of content in english? Thanks!
@AgriasOaks9910 ай бұрын
@@fertakusM I can...but most are not this long
@TzNatzuky Жыл бұрын
Una pregunta se que no tiene que ver cómo el vídeo pero e preguntado en todos lados y todos me respondieron que nunca avían intentado eso estoy desarrollando un juego VR para dispositivos móviles ya tengo los controladores de la cámara del jugador usando giroscopio y acelerómetro pero quiero agregar la interacción basada en la mirada te doy un ejemplo el jugador se queda mirando un objeto O un botón 3D por 1.5 segundos luego loque aria es activar una pequeña animación de carga y luego activar el botón o el objeto Ya e creado muchos scripts pero no funcionan como yo quiero o se activan muy rápido o me dan error de igual manera gracias por el vídeo e aprendido un par de cosas que no sabía
@fertakusM Жыл бұрын
Hola, Preguntas algo muy específico sobre un código que no puedo ver ni interpretar donde puede ser el problema. Nunca he hecho nada con VR. Nunca e hecho nada con 3D. Pero al final, un algoritmo es un algoritmo. Dices que has conseguido que te funcione pero que se activa muy rápido? Si es así solo quedaría retrasar la activación de la función que interesa para conseguir lo deseado. Si crees que puedes simplificar el problema y mostrar unas líneas de código... podemos intentar echar un vistazo y aprender cosas nuevas. Cuando dices "basada en la mirada" entiendo que re refieres "basa en la dirección en la que está apuntando en el espacio el dispositivo", ¿no? Entonces, si ya has conseguido detectar la dirección en la que apunta y además saber si está o no está apuntando hacia el botón 3D o la zona que te interesa.... a partir de aquí ¿ya esta todo echo no? Un Timer que empiece a contar y mientras la mirada no se aparte y llegue al final del timeout() -> accionas la función que quieras o emites la señal etc. Si aparta la mirada -> timer.stop() y nunca llegará la señal timeout() Espero te sirve de algo, un saludo
@TzNatzuky Жыл бұрын
@@fertakusM gracias si me sirvió me dio unas advertencias pero igualmente funcióna com los demás scripts extends Spatial var raycast : RayCast var timer : Timer func _ready(): raycast = $Camera/RayCast timer = $Timer timer.connect("timeout", self, "_on_Timer_timeout") func _process(delta): var target : Object = raycast.get_collider() if target: timer.start() else: timer.stop() func _on_Timer_timeout(): var detected_target : Object = raycast.get_collider() if detected_target and detected_target.is_instance_valid() and detected_target is Button: detected_target.pressed() Ise un par más pero me dan error y no funcionan bien y bueno cuando decía interacción basada en la mirada básicamente loque Ace es seguir la vista de la cámara del jugador lo quise crear porque mí juego son para la gafas VR box y puse un par de cosas para simular el entorno VR en dispositivos móviles ya que no ay soporte para VR en móviles use el acelerómetro y giroscopio para simularlo
@fertakusM Жыл бұрын
Hola de nuevo. El problema esta en que no puedes (o no debes) tirar de gratis en el process la funcion get_collider() del raycast. Por que cuando no está colisionando, ahí será un null siempre y te puede dar problemas. Primero assegurate de que está colisionando con algo, para entonces hacer el get_collider(). Te ahorrarás muchos problemas. Es decir: if raycast.is_colliding(): rycast.get_collider()
@TzNatzuky Жыл бұрын
@@fertakusM gracias de nuevo de apoco voy aprendiendo más cuando termine mí juego te lo enviaré a ti primero para que lo pruebes será para dos plataformas PC y dispositivos móviles