Bueno, y no se te vaya a olvidar que cada comentario ayuda muchísimo al canal, asi que pongan lo que gusten: Un saludo, una duda, si ven que alguien sabe algo y saben la respuesta, no esperen que yo responda, ayuden a sus compañeros, participen y colaboren para aumentar el alcance de los contenidos que comparto en el canal ¡GRACIAS! 💜
@GabrieCruz-l4z3 ай бұрын
@@Leedeoolí el video de shaders cual es?
@heenmancha Жыл бұрын
Al convertir la entrada en números del -1 al 1 te deja mapearlos cómodamente en los ejes x-y. Teniendo una condicional para cada botón igual tendrías que calcular la "intención de movimiento" del jugador. Por ejemplo si presiona izquierda y derecha se anularían en tu ejemplo sin necesidad de lógica extra.
@Leedeo Жыл бұрын
Eso es una buena respuesta digna de corazón, muy bien!. 😝
@antonioya Жыл бұрын
Tutorial prefecto. Conciso y directo. Como consejo general, estudiar geometría es algo super útil tanto para hacer games como para crear aplicaciones de diseño 3D como Blender. A mi no me gustaba inicialmente, pero cuando aprendes y comprendes la magia de los vectores y las matrices todo cambia y lo encuentras super útil.... y hasta divertido.
@Leedeo Жыл бұрын
Y es que era muy pedido, todo además, porque la gente no se pone de acuerdo jajaja - Javo, enséñanos más 2D - Javo, yo quiero 3D - Javo, ¿Y si hacemos 2.5D? ¡Pues con esta función cada quien que haga lo que quiera porque se hace igual! 😁 ¿Se podría hacer aún más corto? Sí, más corto sí, con velocity.get_vector(), pero más preciso no, este método que enseño te permite controlar con precisión que ejes quieres alterar y cuáles no para usarlo en cualquier situación.
@kafapia9390 Жыл бұрын
Jajajajaja, el final me mató, literalmente yo todavía no entendía bien y ya estaba pensando en como mover la vista jajajaja. Muy buen video y gran trabajo con los tutoriales.
@aitor451 Жыл бұрын
Buenísimos estos tutoriales de Godot 4. Me están resultando súper útiles. Gracias. Convertir a íntegros los valores booleanos nos permite obtener de forma muy sencilla tres valores: -1, 0 y 1 que multiplicados por la velocidad resultarán en el movimiento deseado.
@juanmintyXD Жыл бұрын
¡Esto me a salvado la vida! Mil gracias, un tutorial de excelente calidad.
@Leedeo Жыл бұрын
Me alegro de que te haya sido de ayuda!! 😁
@binplus8517 Жыл бұрын
Jaja como me haces reír... Sos un genio aprendí varias cosas en un plis plas.
@JuanGea-kr2li Жыл бұрын
@Leedeo me sumo a la felicitación de @antonioya, querido colega del Blender-Realm XD Esoty siguiendo muy atento tu curso, aunque ya se programar en Unity y Unreal Engine, con muchos años de experiencia, y aunque todo lo que veo es muy básico para mi experiencia, me encanta por dos razones: 1.- Está explicado de forma muy clara y sencilla 2.- Me permite comprender como funciona Godot, las bases de la programación no las necesito, pero como las utilizas en Godot sí, y con este cursillo estoy viendo claramente como funciona, está genial ¡FELICIDADES POR ESTE MAGNIFICO CURSO!
@Leedeo Жыл бұрын
Mil gracias!!! 😁 me da mucha alegría leer eso, de verdad, para mí es importante darme a entender y que lo que hago sea de ayuda para otros 🤘 no soy profesor, así que siempre tengo la duda de si me explico adecuadamente y procuro buscar las palabras adecuadas 😝 Tengo la esperanza de ir aumentando el nivel poco a poco (yo incluido, que tampoco me considero un experto, tiempo atrás he aprendido muchas cosas que no sabía para poder explicarlas, y eso para mí es un placer), de hacer y compartir cosas cada vez más complejas, pero tenía esa ilusión de servir como un punto de partida para todos los que saben poco o nada, y quieren empezar de cero. 👍
@JuanGea-kr2li Жыл бұрын
@@Leedeo pues yo si soy profesor 🤣 y te confirmo que te explicas muy bien, y el curso está muy bien estructurado. Como crítica constructiva a más simplemente metería algún conjunto de lecciones prácticas orientadas a generar un template de tipo de juego “el que sea” para que la gente que sabe menos pueda ver el proceso de primera mano, pero me parece que lo estás haciendo en otra lista así que, me reafirmo, está genial :)
@megabrunx9741 Жыл бұрын
Mi respuesta: Es preferible la función de convertir a enteros los ejes para no tener que hacer un condicional para cada movimiento, y con una sola (o dos dependiendo del caso) linea de código en el _process() del player más el siempre necesario move_and_slide() ya tenemos listo el movimiento. La otra forma de hacer el movimiento sería poner condicionales para cada tecla pulsada (manera en la que programe mi juego antes de especializarme más en Gdscript, y que ahora me da pereza cambiar algo que está funcionando.. xD) Gracias por tus vídeos, eres muy Grande. Sigue así Javo!
@Leedeo Жыл бұрын
Es una buena respuesta jajaja entendiste que al convertir a enteros los ejes se reduce el número de condiciones necesarias para sacar la dirección de movimiento y con eso me doy por satisfecho, así que merece un corazón. 😎
@vndraaverkazt Жыл бұрын
buen video , me encantan tus tutoriales, espero que algún día tengas la compensación que te mereces por el esfuerzo :D
@adrianimelml Жыл бұрын
Muy buen video profe, se aprecia un monton el laburo
@VonGalvez Жыл бұрын
es por el tipo de dato al hacer control+ click a la funcion is_action_just_pressed retorna bool, asumo q al castearlo con int lo transforma a false = 0 y true = 1 por eso al hacer la resta se obtiene la intencion, ahora que pasa si se presionan los dos, ahora hare esa prueba, muy buenos los tutoriales
@geordymontenegro652310 ай бұрын
Aaaa, muy bueno, me ha encantado el curso, muchas gracias, he asentado mejor muchas cosas que no entendia muy bien, en especial lo de moverse en diagonal, demasiado bueno
@santiagomoncada4752 Жыл бұрын
Gracias por el tutorial
@Leedeo Жыл бұрын
No hay por qué!! 😁 y no se les vaya a olvidar repasarlo con calma y responder la pregunta, que es importante para mi saber que tanto van desarrollando esa lógica de programación para ver que tan acertados o desacertados están, no importa, como sea si fallan puedo ir corrigiéndoles.
@andresjara16000301211 ай бұрын
Se hace necesariamente para el calculo de movimiento, si se presionan los dos botones del teclado al tiempo se anularía el movimiento, la conversión se hace para facilidad al momento de hacer los cálculos debido a que también se podría validar la inhesión de presionar el botón
@eliamzg3 ай бұрын
Muy interesante el video, me he topado con muchas maneras de hacer "Character Controllers" en mi honestamente errático camino al GameDev (que esperamos corregir) pero esta es la implementación más limpia que he visto me parece.
@josmarpinheiro2589 Жыл бұрын
gracias professor
@Leedeo Жыл бұрын
No hay porque, gracias por los comentarios!! 😁 hagan el ejercicio, asimilen lo aprendido e intenten responder la pregunta por cierto, quiero leer esas conclusiones que sacan, a ver que tan acertadas o desacertadas están y así de paso puedo corregirles.
@alemanydaniel9 ай бұрын
Ante todo, excelente tutorial. Para mi, creo que en tiempo de ejecución, es mucho más simple (en terminos de velocidad y procesamiento), resolver la situación mediante un cálculo simple de resta que aplicar un condicional
@aeleequis Жыл бұрын
Esta guapardo. Pero creo que para movimientos tipo cámara, es mejor usar un float. Con int te saltas pasos intermedios. Ejemplo: Int, la cámara pasa de 0,1,2,3 etc Con float, puede ser de 0,0.5,0.8,2.5,5,6.5, etc Para inputs tipo botón (teclado, cruceta), te sobra el int, pues lo que recoges del input es un 0 un 1, pero con joysticks, el ratón y algunos gatillos, los valores van desde -1 hasta 1, con decimales. Int está guay, pero pierdes precisión. Luego, el por qué usarlo, imagino que para que sea más fácil de usar, aunque no estoy del todo seguro
@Leedeo Жыл бұрын
Tache!!! 🤭 tienen que ser int, aquí no hay puntos intermedios, solo hay izquierda, punto muerto y derecha en el eje X, y arriba, punto muerto o abajo en el eje Y, delante, punto muerto y detrás en el eje Z. En todos los casos solo puede haber 3 opciones, no más, ya el tema de las velocidades es un tema aparte, no se pierde precisión en absoluto. ¡No hay corazoncito en esta ocasión! 😝
@amazing_videos3285 ай бұрын
Sin duda es la mejor forma que he visto de hacer el movimiento del jugador en godot sin escribir el peso de mi casa en letras😂
@clustersnake Жыл бұрын
en mi caso estan invertidos los valores up and down asi que tuve que invertir la resta. Uso godot 4.1.2 stable en linux. Muchisimas gracias por los tutoriales!
@Leedeo Жыл бұрын
Eso es una particularidad, déjame decir, en Blender yo lo trabajo como lo trabajarías tú en Godot, con lo que tú dices que es invertido, pero en realidad es correcto, y al pasarlo a Godot (también pasa en Unity y Unreal) se invierten ¿Por qué? Quién sabe, pero el que trabaja en 3D ya sabe esto e incluso Blender tiene la opción de importar los modelos con los ejes invertidos porque sabe que esto pasa en la mayoría de motores de videojuegos, al menos en Windows y hasta donde yo sé, también sucedía en MacOS. En tu caso dices que están invertidos, pero invertidos a como yo lo hago, así que sería correcto tal cual lo trabajarías en Blender, quizás al ser Linux así se manejen en la distribución que usas, o quizás así sea en Linux en general. No te sabría decir por qué tiene años que no uso Linux, pero es curioso saber ese dato. 👍
@clustersnake Жыл бұрын
@@Leedeo yo asumo que hace referencia al 4to cuadrante del plano cartesiano donde derecha y abajo son positivos por lo tanto la resta funciona derecha - izquierda y abajo - arriba
@zxydelyk3 ай бұрын
Gracias, excelente video
@DarielFenton10 ай бұрын
Nos ayuda para realizar tareas mucho mas cómodas y sencillas.
@FritoKeso Жыл бұрын
Respuesta de la pregunta de exámen: 1. Por que según el plano cartesiano en el eje X: 0 es el medio, y ya sea en 2D o 3D los personajes se mueven en un plano cartesiano de 2 o 3 ejes, cuándo uno presiona derecha, derecha es true pero se combierte en entero por lo que derecha es 1 e izquierda como no se pulsa es 0 (queda valiendo 1), esto si se le va sumando al plano, va aumentando x en 1 por lo que va avanzando poco a poco, cuando uno toca izquierda, al no precionarse la derecha, derecha pasa a ser 0 e izquierda 1 y 0-1=-1, se le resta a X 1 y por eso va a la izquierda. Resumen: Es necesario para decirle al nodo player cuanto debe sumar o restar al eje que le toca. 2. Para reutilizar el código, ya que al ser una función global, todo el que lo necesite puede acceder a ella de forma remota y sin tener que complicarse la vida escribiendo el mismo código para todo, más eficiente y más rápido.
@Leedeo Жыл бұрын
También es una buena respuesta, entendiste que es necesario convertir a enteros para multiplicar en realidad, porque todo número multiplicado por 1, da como resultado el mismo número, de la misma forma que todo número positivo multiplicado por -1 nos daría su inverso, y por eso es necesario un int y no un float, ya que lo que nos interesa en este caso es obtener un 1, 0 o -1 para realizar esa operación, y en realidad lo otro ya lo respondí yo mismo, por eso dije guiño guiño jajaja "para no hacer un if kilometrico" que tenga que evaluar cada una de las posiciones condiciones que se pudieran dar, pero si es cierto que se pone en una función global para reutilizar el codigo y todo el que lo necesite puede acceder a esta función. No iba mal encaminado y veo un buen razonamiento, así que mereces un corazoncito. 🤣
@the_oppa7v719 Жыл бұрын
Gracias a ti y a muchos tutoriales, tengo un nivel intermedio a la hora de programar en gdscript, necesito saber cosas avanzadas
@Leedeo Жыл бұрын
Poco a poco, ahorita van a tener que esperar ya que estoy comprometido con este curso de introducción precisamente pensando en las personas que recién están empezando a usar Godot en esta versión 4. No es imposible que suba cursos más avanzados al canal si el curso de introducción tiene buenos resultados, pero lo que sí podría decir es que en dado caso eso sucediera, sería hasta el próximo año, ya que después de este curso tengo que dedicar todos los meses que resten a terminar el juego que estoy haciendo, que eso es de vital importancia... no hay opción de no terminarlo, tengo que terminarlo sí o sí.
@superalexandrusco1727 Жыл бұрын
Hora de responder la pregunta: Es necesario convertir los valores a enteros por que o si no nos devolvería un booleano que no nos sirve para poder mover un personaje. Por que al presionar una tecla el valor es 1 y si no lo presionamos es 0 y obtenemos esos valores gracias a int() despues lo multiplicamos por la velocidad que es speed para que el personaje se mueva rápido Por que si presionamos una tecla nos devolvería 1 y al multiplicar 1 × velocidad" el personaje se moverá más rapido. Pero si no presionamos nada nos devolverá 0 y si multiplicamos 0 × velocidad siempre será 0. Este método es mejor por que es más optimizado y se puede usar en TODO Fin Mucho texto
@superalexandrusco1727 Жыл бұрын
Me falto decir que un booleano vale 1 cuando es verdadero y vale 0 cuando es falso. Como el lenguaje binario.
@Leedeo Жыл бұрын
Bueno, sí, eso es así... pero al convertirlos a enteros y obtener los ejes, siempre obtenemos la dirección exacta y evitamos tener que hacer if más complejos para evaluar opciones, como por ejemplo que pulsen izquierda y derecha al mismo tiempo, que en un control no es posible, pero si en un teclado... al pulsar los 2 al mismo tiempo 1-1 es 0, asi que es punto muerto. No desglose por completo para que no haya miradas curiosas, quiero que los demás discurran la respuesta. No hay respuestas incorrectas, me gustaría ver esas conclusiones, alguien dijo que es mejor a float para que el movimiento no sea a saltos, que tampoco desglose la respuesta, aunque la respuesta de porque eso no es correcto es porque multiplicamos por speed y a su vez, motion_and_slide multiplica por delta por default (no es necesario multiplicar por delta manualmente), así que 1*200*delta nos da un valor muy pequeño en formato float, pero la dirección es inamovible, jamás puedes ir "casi a la derecha" o "casi a la izquierda", vas a izquierda o derecha, no hay más, la velocidad de movimiento es un tema aparte. Está bien, es un buen intento, así que hay corazoncito, primer corazoncito. 😎
@franciscolopez-kw2xq Жыл бұрын
Tecnicamente si por que si no la resta no se da y tendrías un error en consola
@chloestudio9215 Жыл бұрын
muy buen video voy a empezar a aplicar esta función de movimiento en mi juego.
@Iscalej Жыл бұрын
¡ Excelente !
@Leedeo Жыл бұрын
Espero te haya sido de mucha utilidad!! 😁 es una buena lección, creo yo, realmente una lección fácil, pero de las que les gusta a todos: Con ejercicios prácticos y que además sirve en cualquier juego. 🤭
@raton_gamer1308 Жыл бұрын
Ok el parseo de bool a int es para saber el número y tomar el número para que el mismo juego haga como un bucle de if y nos ahorra código,y en forma de función sencillo,nos hace tener mayor control sobre posibles errores a futuros para evitar complicaciones cuando el código sea más extenso sea más legible para el programador
@pwolf936 ай бұрын
lo de convertir a numeros enteros es para poder moverte sobre las posiciones de los ejes x,y o z, dependiendo del tipo de juego de forma incremental o decremental, es eficiente.
@danielmesa57229 ай бұрын
Buen video, aunque la propio clase Input ofrece esa funcionalidad ya sea en 2 o 4 ejes: var direction = (Input.get_vector("left", "right", "up", "down") as Vector2).normalized() var direction = (Input.get_axis("left", "right") as Vector2).normalized()
@hugomengual43486 ай бұрын
Gran explicación
@franciscolopez-kw2xq Жыл бұрын
Eso de normalizar se puede explicar con el teorema de pitagora peri javo no les quiere volar la cabesa aunque luego de tanta practica se te hace intuitivo
@Leedeo Жыл бұрын
Básicamente, es difícil explicar estas cosas de forma simple, pero yo creo que diciendo básicamente lo que dije se hace entendible 🤣 aunque no es tan simple porque la normalización en matemáticas se utiliza por ejemplo en álgebra, en este caso sería álgebra lineal para dividir cada elemento del vector por su magnitud para que el resultado siempre de 1, aunque pensé que el ejemplo de que "si no se normaliza va a ir el doble de rápido en diagonal" sería más apto 🤣
@franciscolopez-kw2xq Жыл бұрын
@@Leedeo y lo es, para mi este video rosa lo complejo pero se supo explicar de manera correcta
@Leedeo Жыл бұрын
@@franciscolopez-kw2xq Repase el guion varias veces, creeme que lo intente simplificar tanto como pude, no encontré palabras más simples, pero una parte de mí decía "al final muchos ni se molestaran en entender y solo copiaran y pegaran" jajaja y por eso quise preguntar, pero me doy cuenta de que efectivamente la educación tradicional ha hecho mucho daño a la sociedad, ya que muchos no han respondido por miedo a fallar, está muy arraigado eso de que fallar no es admisible y siempre les estoy diciendo que fallen, yo no voy a regañar a nadie por fallar, al contrario... pero me interesaba leer esos razonamientos, fueran correctos o no, para saber si la gente está empezando a desarrollar más ese pensamiento lógico, y si he leído comentarios que dices “pues le falta, pero sí veo que hay cierta lógica en su argumento”, que hubiera muchos así para mí significaba que conseguí darme a entender 😝
@franciscolopez-kw2xq Жыл бұрын
@@Leedeo no es fallar si estar aprendiendo, es mejor ir lento, fallando y corrigiendo, que rapido y con errores
@cytanic6141 Жыл бұрын
Pregunta , si yo quiero que el player se mueva con un joystick , es decir que si el jostick esta en el centro es cero y si esta a la derecha es 1 y quier que si esta entre la derecha y el centro valla a una velocidad entre esos dos , comonpodria realizarlos mr
@frailinmatias9139 Жыл бұрын
Yo soy demasiado burro, para un corazon.
@Leedeo Жыл бұрын
Jajaja nah, pero no es necesario respuestas correctas, quiero ver como aplican la lógica para ver que tan encaminados o desencaminados van, yo no creo que nadie sea especialmente burro, cualquier persona con algo de paciencia puede llegar lejos. 😎
@antonioya Жыл бұрын
@Leedeo Recientemente he visto que hay una función `var input_dir = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")` que me devuelve un vector con el vector resultante de todos los inputs. La he probado con teclado y va super bien. ¿Que ventajas/diferencias hay con tu función? Yo estaba usando la tuya, pero ahora no sé si es mejor la función nativa.
@cfdavidfernandez Жыл бұрын
ahora mismo cual es la que usas ? la de leedeo o la nativa ?
@antonioya11 ай бұрын
@@cfdavidfernandez La verdad es que uso las dos. La solución de `get_vector` me parece mas intuitiva si es un movimiento en todas direcciones o necesito un vector con direcciones intermedias (por ejemplo 45 grados), pero la solución de Javo va genial también.
@Crandriel11 ай бұрын
La nativa permite controles analógicos por defecto, y es muchísimo más rápida de ejecutar (aunque esto es lo de menos ya que es una un función que en general se llama solo una vez por frame, pero bueno, existen casos bizzarros donde el programador podría usarlo por ejemplo en miles de sprites en cada frame.... el sabrá porqué, y ahí el rendimiento si que sería notable y decisivo a favor de la nativa, pero es algo que no sé si algún juego en el mundo hará)
@tommylin7722 Жыл бұрын
una pregunta, ahora en las señales de area2d aun necesito poner area2d en su funcion si quiero conectarlas desde codigo?
@Leedeo Жыл бұрын
Cómo, creo que no entendí la pregunta 😅 para conectar señales se sigue haciendo de 2 formas, una es desde el panel de señales y otra por código, por código solo cambia la forma de conectar, pero eso mejor repasa el tutorial de señales kzbin.info/www/bejne/eInOe5h7fL-latE
@tommylin7722 Жыл бұрын
@@Leedeo bueno en godot 3.5, cuando conectabas la señal area_entered tenias que poner en la funcion como parametro area2d, queria saber si era lo mismo en godot 4
@manuelgonzalez-sx3or Жыл бұрын
respondiendo a la pregunta, lo que ocurre es que si lo dejamos en números decimales no nos darían valores exactos y al momento de mover el personaje * velocidad no habría un control sobre el movimiento, haciendo que esto sea más propenso a errores.
@Leedeo Жыл бұрын
Pues creo que eres de los primeros en darse cuenta de que tenían que ser números enteros y no decimales 😁, varios han preguntado por esto, extrañándose que al ser enteros, ¿cómo podría moverse de forma fluida? Pero aunque lo explique, creo que no se percataron que la solución está en que la cifra retornada por la función get_axis es únicamente para multiplicarla por la velocidad de movimiento y el tiempo delta 😝 cualquier número multiplicado por 1, nos devuelve el mismo número, cualquier número multiplicado por -1 nos devuelve su negativo, y cualquier número multiplicado por 0 nos devuelve 0. 👍
@NameNull317 ай бұрын
Hola tengo una consulta ¿Cómo le agrego animaciones al CharacterBody desde código? Lo pregunto mas que nada al realizar algo como la acción de saltar o que el sprite se voltee si cambia la dirección
@Leedeo7 ай бұрын
Con Tween, pero con Tween haz cosas simples, cambiar una propiedad como la posición o rotación, por ejemplo, pero no quieras hacer una animación mucho más compleja porque eso además que provoca un desmadre de código innecesario (para eso está el AnimationPlayer) es que hasta penalizaría el rendimiento. De todos modos, todo eso puedes ver como se hace en el tutorial de plataformas 2D o 3D en la serie de "Hagamos Videojuegos", que es la que sigue a esta serie de introducción.
@hannahival6433 Жыл бұрын
Te explicas tan bien que siento que lo puedo hacer, spy animadora, iva a usar el motor de unity pero😢, gracias
@Leedeo Жыл бұрын
Mil gracias!! 💜 me alegra mucho saber que les gusta y se entiende bien lo que explico 😁 si a mí me preguntan, la verdad es que hoy en día desaconsejo totalmente empezar con Unity (o seguir trabajando siquiera, salvo casos de fuerza mayor), ya que lo sucedido es una señal clara de como es que funciona Unity Software, y viendo que existen alternativas libres como Godot, que están mejorando y se están popularizando no es necesario correr riesgos.
@torajirogertosio93129 ай бұрын
Gracias Genio...
@franciscolopez-kw2xq Жыл бұрын
El vector3 se usa para meter mecanica de salto y escalar cosas como un rpg 3d pero es algo muy abansando y es algo que pocos usan por que ya usando las colisiones se altera el valor en la 3ra dimencion, pero esto es avansado
@Leedeo Жыл бұрын
Exacto, el movimiento va a ser siempre en 2 ejes, en 3D te moverias en X y Z por ejemplo, y efectivamente el salto, que eso ya lo haríamos con un botón aparte, sería el eje Y, que es arriba y abajo. En lo único donde si reconozco que el 3D es mucho más complejo que el 2D es precisamente para la generación procedural, porque con mucho trabajo se puede reproducir una generación procedural en un juego 2D, ya sea para un juego top-down o un plataformas, pero en 3D ese eje Z complica el asunto una barbaridad... en un top-down 2D puedes decir que si hay 3 paredes la 4º tenga una puerta, para no generar una zona sin salida, pero en 3D... hay que evaluar a lo ancho, alto y profundo, hay prácticamente infinitas capas y tal vez en espacios abiertos es más factible para generar montañas, rios... pero una mazmorra honestamente yo ya no doy para eso jajaja lo intente por curiosidad, nunca di con un resultado óptimo y solo termine con dolor de cabeza. 🤣
@franciscolopez-kw2xq Жыл бұрын
@@Leedeo los programadores aman el masoquismo...
@Leedeo Жыл бұрын
@@franciscolopez-kw2xq Y curiosamente ni siquiera me considero programador jajaja llevo más de 15 años trabajando como programador, por eso me defiendo, muchas veces hice cosas tremendamente simples, en ocasiones algo más complejas, pero aunque al principio me gustaba me di cuenta de que no era lo que yo amaba, me faltaba algo, y era esto: Yo me interesé por la programación para hacer juegos, lo que me faltaba era eso, hacer juegos, plantearme retos que me divirtieran en verdad y es que en mi trabajo de las cosas más complejas que pueda recordar tal vez sea programar un calendario... y claro, puede sonar aburrido y realmente lo es, pero en el trabajo uno no hace lo que le gustaría, hace lo que le piden que haga y esa clase de cosas la hice hasta la saciedad... 😅
@franciscolopez-kw2xq Жыл бұрын
@@Leedeo pues lo mismo me pasa a mi solo que yo aun no trabajo nisiquiera salgo de la universidad se programar desde hace 6 años pero en python, busque de godot por que necesitaba mejores reto y ganar avilidades avilidades que solo puedes optener fallando como lo seria la programación de videojuegos que no puedes guardar el proyecto sin que tenga 4 o 5 bugs, aunque ya llebo 6 años, mucho menos que tu, yo aun me considero en un nivel bajo de programcion, en pañales podria decir, aunque hacer videojuegos me gusta mucho debo admitirlo
@Tulispf Жыл бұрын
Alguien sabe como hacer para elegir la tecla de mi preferencia, en vez de lo que son las flechas o direccionales?
@black_er5673 Жыл бұрын
Una duda para agregarle una animacion al objeto cuando camina con ese script como seria?
@Leedeo Жыл бұрын
Como en cualquier otro script: Se detecta la tecla de dirección pulsada y se llama a la animación correspondiente. 👍
@black_er5673 Жыл бұрын
@@Leedeo gracias
@JP-fg4bp10 ай бұрын
Ya llego con meses tarde, pero me gusta la idea de responder (además, sé que con un comentario apoyo a Leedeo :3) La respuesta es que sí usamos un condicional, pero no un "if". Al escribir "int(Input.is_action_pressed("tecla"))", estamos creando de alguna forma un tipo de booleana, el programa se pregunta si la acción se está ejecutando (apretar la tecla), y devuelve en retorno un "true" (verdadero) o "false" (falso/negativo), por defecto, el programa devuelve "false" ya que no presionamos ninguna tecla. Convertirlo a numero enteros, pasa esta información a "binario", donde "0" es falso y "1" es verdadero. Entonces, el código, si no presionamos ninguna tecla, está constantemente restando 0-0=0. Al presionar, por ejemplo, la tecla derecha, en el código del video estaríamos obteniendo 1-0=1. Caso contrario, presionar la tecla izquierda haría 0-1=(-1). Cuando usamos esta función con un valor del player, estamos multiplicando este valor por la velocidad que le cargamos. Por ejemplo, 200*1 para tecla derecha y 200 * (-1) para la tecla izquierda. (Apreciación personal antes de comentar sobre por qué es mejor este sistema que el clásico "if": Me encanta este sistema por que si presionamos ambas teclas, obtenemos un 1-1=0, por ende, ambos opuestos se anulan, en contraste con varios juegos inclusive algunos triple A, donde si hacemos esto alguna tecla tiene predominancia y el personaje SI se mueve) Usar este sistema en contraste con el "If" es mejor por que ahorra lineas de código, haciendolo más fácil de leer. Y quizá lo mas importante, si usaramos un condicional If, entonces tendríamos dos opciones, la primera donde simplemente obtenemos la booleana y trabajamos con ello, lo que ocupa aún más líneas de código en ambos scripts y puede entorpecer la conversión de velocidades, y la segunda donde aún así lo convertimos a numeros enteros, por lo que realmente sería inútil y solo añade lineas de código innecesarias.
@carloslara4704 Жыл бұрын
Para responder le pregunta lo investigue encontre un respuesta un poco vaga pero entendi masomenos el concepto que es poner un if puede ser tedioso y propenso a errores en lugar de eso se puede crear una funcion que convierta los ejes en numeros enteros y luego llamar a esa funcion en cada una de las funciones que requieran los ejes de dirección como nuneros enteros
@Leedeo Жыл бұрын
Muchos se atoran con lo de los números enteros jajaja no pasa nada, es normal... en realidad hacerlo como lo hacen otros, es peor sencillamente porque son if kilométricos, tienes que poner muchas posibles condiciones, cuanto más código necesites efectivamente más propenso es a fallos humanos, ahora bien, pero muchos caen en el error de pensar que al ser un entero tiene algo que ver con la velocidad o que va a ir a tirones, y no, lo que pasa es que tiene que ser un valor exacto porque no existe la “casi derecha”, es derecha, no existe la “casi izquierda”, es izquierda, no existe el “casi detenido”, porque si hay movimiento, por lento que sea, entonces estás moviéndote 🤣 (que por eso es imposible la gravedad 0 en la realidad, inclusive en el espacio, cada cuerpo es atraído por la gravedad ejercida por otros cuerpos físicos, así que aunque sea mínima, siempre hay gravedad... pero bueno eso es un tema a parte...) tiene que ser número entero para devolver en formato numérico la dirección, y esto si no es una teoría mía, de hecho esto lo dicta así las matemáticas y podemos verlo en la normalización, que es una operación matemática para convertir los valores de un Vector en 1, si es 0.7 lo convierte en 1, si es 1.3, lo convierte en 1, siempre devolverá 1 al normalizar y por eso es que con este procedimiento que enseño te puedes mover en cualquier dirección, en cualquier género y manteniendo siempre la misma velocidad independientemente de si estás moviéndote de izquierda a derecha o en diagonal, y todo ello sin if kilométricos propensos a fallos humanos, y aparte que se ve feo al momento de leer el código, que parece una tontería, pero lo digo en serio, que el código sea fácil de leer es importante tanto si trabajamos en equipo, como para nuestro "yo del futuro" que lea ese código y no lo tenga tan fresco como al momento de escribirlo. 😁
@carloslara4704 Жыл бұрын
@@Leedeo aaaah ya entendí jajaja Me acabas de iluminar por completo, lo entendí a la perfección, gracias mi estimado 🎉😊
@niar5428 Жыл бұрын
noc cual es la parte que no entendi , pero calcado de aca no me funciona , que puedo estar omitiendo ?
@cfdavidfernandez Жыл бұрын
el eje y está invertido? por eso se le pone: - speed? en func motion_ctrl
@Leedeo Жыл бұрын
Depende como se mire, el tema de los ejes parece ser que es algo a lo que no se llega a consenso en los distintos softwares. En unos hacia arriba es positivo, en otros es negativo, y en ambos casos tiene sentido, porque si fuera positivo hacia arriba, la lógica es que se aplica una fuerza positiva, sin más, pero en el caso de ser negativo, va en sentido de la fuerza de la gravedad, que se aplica de arriba hacia abajo, por lo tanto, para aplicar una fuerza inversa, debe ser un valor negativo. ¿Conclusión? Es mejor aceptar sin cuestionarse como se maneje en el software que estemos usando jajaja
@republicavictinera Жыл бұрын
¿No importa la cantidad de variables que se ponga en el autoload, consumiría lo mismo que ponerlo en un nodo normal? Claro, sin contar ese extra de que exista el autoload Tenía pensando poner las funciones de los ataques en un nodo y que los personajes extiendan ese nodo, ¿consumiría exactamente lo mismo si lo pongo en el autoload?
@Leedeo Жыл бұрын
Pues no, no importa, si realmente el refactorizar código y segmentarlo en distintas funciones no es por rendimiento, es por llevar un orden, por tener algo escalable que puedan abrir otras personas y no sentir que es imposible editar ese monstruo, o que lo abras tú dentro de 1 año o 2 para hacer una hermosa actualización que cobraras por supuesto como un DLC para pagar el gas del mes y al abrirlo digas ¿¡WTF!? 🤣 Pero puedes tener 1 millón de variables en un autoload si gustas, finalmente solo se accede a X variable cuando el programa lo requiera, así que al programa le da igual si tiene un script de 1 millón de líneas o son 4 contadas. No obstante, si tú autoload fuera extremadamente largo a un nivel que dices "ya molesta a la lectura", ahí sí sería cuando yo diría "pues voy a ver qué cosas tomo de acá para separarlo en 2 o 3 autoload", depende, yo por ejemplo diría que algo es largo cuando tiene unas mil líneas aproximadamente... si tiene 200 o 300 para mí es bastante razonable. ¿Entonces afectará al rendimiento? No, no afectará porque si declaras un script como autoload se crea como nodo en el árbol de escenas durante la ejecución y al llamar una de sus funciones accede a ella como si tuviera que acceder a un hijo directo, no hay diferencia de rendimiento en ambos casos, lo que a ti se te haga más cómodo para tu proyecto y consideres más práctico está bien.
@lordav5520 Жыл бұрын
Al convertirlo en valores positivos y negativos haría el movimiento porque serían int en cambio si son km serian de cadena String, me equivoco? Gracias maestro
@DevNoxy Жыл бұрын
Hola leedeo, el codigo esta todo bien y no marca ningun error, todos los autoloads estan bien configurados y el juego corre perfectamente, el problema es que por alguna razon, no me detecta el input de mi teclado, presiono las teclas y nada, no se mueve, sabes que podria estar pasando?
@MaicoooL11 ай бұрын
quisas no configuraste las teclas correspondientes en tu proyecto, como la W,S,D,A y espacio.
@xderen_xd11 ай бұрын
JAH BLESS, 1:59 qué sería un controlador omnidireccional y cuál es la razón específica por la cual no se podría?
@Leedeo11 ай бұрын
¿Qué porque no se podría hacer un controlador omnidireccional? Porque ya sea control con cruceta, joystick o teclado, solo se pueden evaluar 2 ejes, de forma que incluso en juegos como los simuladores de vuelo, la forma de conseguir un movimiento "omnidireccional" es utilizando 2 controladores independientes de forma simultánea, ya sea el teclado + mouse, cruceta + botón, o usando 2 joystick, que por algo se hicieron el estándar hasta para controlar drones. Si es una combinación de 2 controladores, ya no es "un control", son dos controladores. ¿Qué pasaría si por ejemplo hacemos un shooter sobre raíles donde el personaje va hacia adelante por sí solo? ¿No sería un controlador omnidireccional? No, porque solo controlamos 2 ejes, el avance no lo estamos controlando, así que no puede entrar en la definición de “controlador”. 😝 Siempre van a ser 2 ejes, mientras no puedas controlar los 3 en un solo controlador, no es un controlador omnidireccional, y lo que conocemos es un movimiento omnidireccional usando 2 controladores.
@JP0001_GP Жыл бұрын
Es necesario hacer una función debido a que el valor que retornan las teclas pulsadas es 0 o 1, por lo que hay que restar los valores para que nos diga en que dirección del eje está yendo el jugador, ya sea x y o z, y nos beneficia hacerlo en una función (y estando en un autoload), ya que nos permite reutilizar ese código en cualquier momento y en cualquier objeto
@Leedeo Жыл бұрын
Claro, pero previamente se tiene que haber creado esa función que retorna 0 y 1, realmente esa función es la clave de la función de movimiento, ya que cualquier número multiplicado por 1 devuelve el mismo número, cualquier número multiplicado por -1 devuelve el número en negativo, y al multiplicarlo por 0, devuelve 0. Esa es la clave que consigue reducir el código a su mínima expresión, manteniendo una función totalmente flexible y personalizable para cualquier tipo de videojuego. Te falto darle esa importancia a la multiplicación en tu explicación, aunque creo que lo has entendido, así que corazoncito tal vez no, ¿o sí? No sé... me lo pensaré... jajaja, pero sí te felicito por tus conclusiones, debo de hacer más esto en los videos, me gusta leeros para saber de qué forma lo entendieron, felicitarles si está bien, o corregirles si estuviera mal. 🤘
@piramedhead408919 күн бұрын
A mi me gustaria saber como agrego los controles de movimiento y la camara en primera persona pero en Godot Mobile
@EmbrioElDragon Жыл бұрын
es cierto que habra mil forma de hacer que se mueva personaje sin usar el if kilometrico, no se si se podria usar mas funciones como hace unity que tiene riggiding body que tiene por defecto gravedad y todo y yo opte mas en character controller y luego esta la personalizada por ti, quiere decir, no importa que body controlemos mientras tenemos las matematicas para hacer mover tanto en vectores 2 y 3 y usemos la gravedad o cualquier cosa cuando la función e igual como si programamos eso desde cero, mientras se aplique los valores numericos que hacen mover un personaje usando los ejes que corresponde el motor es suficiente
@Leedeo Жыл бұрын
Sip, de hecho existe RigidBody en Godot, e igual tiene sus modos y puedes ponerlo en Kinematic, de hecho cuando estaba haciendo Leedeo Backrooms en Godot 3 (antes de portearlo a Godot 4), así le hacía con los enemigos, y en Unity lo hacía porque no quedaba de otra, ya que es un único componente de tipo RigidBody que puede definirse como Kinematic o Static, pero agradezco que en Godot existan nodos como el CharacterBody o el StaticBody, que son cinemáticos sin necesidad de usar el tipo/clase RigidBody, que personalmente no me gusta demasiado salvo para ciertos casos... y es que no es solo que los afecten las físicas a los otros, sino que también tienen distintas formas de trabajar con ellos, de moverlos vaya, y una de las cosas que tiene CharacterBody que no tiene un RigiBody son los metodos move_and_slide y move_and_collide, que me parecen geniales.
@EmbrioElDragon Жыл бұрын
Yo por ejemplo en Unity preferia character comtroller porqie mi personaje no le afecta la gravedad a no ser que le programes tu una porque en cuesta resbalaba con el riggiding body y no me gustaba, por eso es mejor mas personalizarlo como lo hiciste tu que coger opciones que ya esta listan, yo intento mi juego 2.5 d usando el riggind 2d ya que mis personajes esta en 2d y se puede mover con huesos, con unity hice eso, cuando vi las polémica, estudie todo lo de unity detras y creme , el estudio esta lleno de una verdadera mafia que llegue mas profundo todavía donde esta el famoso elon musk de twitter, a preocuparme de este tipo quise estudiar mejor godot a ver que tal la herramienta ya que 3 amigos me decia vente a godot, y queria aprender todo sobre ello aunqie un estava aprendiendo a programar
@RetroElGamer666 Жыл бұрын
y como seria en c# lo de pasar el input a int?
@manuelgonzalez-sx3or Жыл бұрын
haces ver tus videos tutoriales demasiado faciles, tanto así que ando con el godot cerrado para hacerlos despues y ponerme creativo.
@stcpimus Жыл бұрын
Hola saludos desde Colombia. Muy buen video pienso que es la mejor forma para una función de movimiento optimizada. Siempre trabajo las escenas como objetos así que mi enfoque es tener todo lo del player como un objeto. En este momento tengo el player con funciones de movimiento que no dependen del teclado: pj: mov_right, mov_left, mov_up, move_down esto porque quiero tener muchas entidades en el plano y así seleccionar cual quiero mover, lo mismo para la camara no la coloco dentro del player sino que dependiendo de la entidad que seleccione hago que la cam tenga las coordenada de dicha entidad. Lo de la pregunta: ya lo respondieron abajo, es porque la dirección necesitamos que sea un numero entero y no un booleano para poderla multiplicar por el signo.. y así es una forma de simplificar el código nos ahorramos tener que poner un else por k si presionan las dos teclas al tiempo entonces daría cero.
@Leedeo Жыл бұрын
No copien!! no copien!!! No se vale copiar!! 🤣 aunque sí es correcto, pero admitiste que leíste de otro mensaje, ¿te doy el corazoncito por la honestidad entonces? A tu elección lo dejo... 😝
@dariochamorro2817 Жыл бұрын
@@Leedeo El fin justifica los medios profe XD, dele el corazón, al final si lo aprendió
@Leedeo Жыл бұрын
@@dariochamorro2817 Pero fue copia, 😤, pero por eso pregunto, puedo ser flexible 😏 si él considera que lo merece y que aprendió el motivo de porque esta función es así y no de otra forma, estoy dispuesto ¡ESTOY HECHO TODO UN SANTO! 🧐
@angellpichuuxd Жыл бұрын
Señor Javo Leedeo para los juegos con vista Topdown leí que es mejor usar move_and_collide y de paso porque mi código es tan enorme XD: extends CharacterBody2D var speed = Vector2(300, 300) func _physics_process(delta): var motion = get_input() motion = motion.normalized() * speed * delta move_and_collide(motion) func get_input() -> Vector2: var input_vector = Vector2.ZERO input_vector.x = int(Input.is_action_pressed("ui_right")) - int(Input.is_action_pressed("ui_left")) input_vector.y = int(Input.is_action_pressed("ui_down")) - int(Input.is_action_pressed("ui_up")) return input_vector
@Leedeo Жыл бұрын
Ni mejor ni peor, como todo depende siempre del caso. Tenemos 2 funciones: move_and_slide y move_and_collide Ok, de esas 2, move_and_slide tiene detrás muchísimo más código debido a que tiene muchas más funcionalidades, muchos más tipos de comportamiento, inclusive en move_and_slide no es necesario multiplicar por delta porque ya va implícito en la función. Por otro lado tenemos move_and_collide, menos código, menos funcionalidades y por lo tanto más ligero, más óptimo en casos como movimientos de balas, plataformas móviles, y sí, más optimo en casos con comportamientos simples. Sería muy imprudente que alguien llegara y te dijera ¿Sabes qué? en top-down siempre es mejor el move_and_collide ¿Pero por qué? ¿Conoce tu juego? ¿Los posibles comportamientos que vayas a darle a X elemento? ¿Qué tal si quieres que tu player se deslice por plataformas de hielo? ¿Qué podrías hacer eso con move_and_collide? posiblemente, con código ¿Ese código será más optimo que el de move_and_slide que basta con aplicarle un impulso? Eso es cuestionable. Así que si alguien dice que es mejor move_and_collide para juegos top down, yo digo: No, depende del caso. 😝 De todos modos esta función también sirve para move_and_collide, ya que la magia de esta función es sencillamente la capacidad de retornar el eje que estamos pulsando para multiplicarlo por la velocidad de movimiento del personaje.
@angellpichuuxd Жыл бұрын
@@Leedeo Valla ya me dejaste tarea para pensar e investigar, gracias Javo!
@samueljuega-zv3ww Жыл бұрын
si te da error el return ponlo arriba el funcion axis
@yoelmaximilianogalarza6137 Жыл бұрын
Por que los valores de entrada son booleanos y al convertir un booleano en int mayormente dan 1 o 0 por lo cual es mas facil de usar para interactuar con los ejes de movimiento, dato de color los booleanos y cada referencia en si es binaria ya que es el lenguaje que entienden las computadoras. Caso contrario tendriamos que usar booleanos con condiciones para restar 1 o sumar 1 y eso haria un uso excesivo de codigo sin sentido.
@Leedeo Жыл бұрын
Si por casualidad vienes de Unity es normal que lo entendieras mejor por qué de hecho esta función es como se trabaja en Unity jajaja y cuando yo pase de Unity a Godot me gustaba trabajar así, por lo que adapte esta función a Godot (que por cierto, ahora la que viene por default en los CharacterBody es muy parecida, pero me sigue gustando más como la hago yo... menos líneas, más versátil)
@yoelmaximilianogalarza6137 Жыл бұрын
@@Leedeo Confirmo, la uso actualmente y me soluciona muchos dolores de cabeza para escribir muchas veces el mismo codigo xD Gracias por los videos de verdad me sirvieron un monton
@marcosariellopez981810 ай бұрын
hice lo mismo para el 3d pero al mover se mueve como si fuera por bloques, siento que falta la propiedad delta en alguna parte pero en donde? tengo el codigo exacto
@Leedeo10 ай бұрын
move_and_slide ya va implícito el delta, vamos que no hay que ponerlo, se estaría multiplicando delta por delta y por optimización eso sería nefasto, pero no se lo que hicieras ni como lo hicieras así que no sabría decirte donde está el problema 😅
@JuanCarlosRetanaArce Жыл бұрын
Y el delta time ? Por qué no se tomó en cuenta para el ejemplo?
@Leedeo Жыл бұрын
En la función move_and_slide el tiempo delta ya va implícito, no es necesario ponerlo, de lo contrario sería como multiplicar delta * delta.
@mazorca751 Жыл бұрын
8:10 porque si movieras las direcciones en desimales te estarias moviendo a medio pixel por minuto xd? Y beneficia hacerlo asi pq es mas facil q hacerlo con el if kilometrico
@Leedeo Жыл бұрын
Sí, pero no, no es por eso, necesitamos que sean enteros porque es la única forma de retornar el valor indicado en speed de forma precisa, y la única forma de hacerlo es multiplicar por 1 o -1 para que devuelva el valor indicado a la inversa, igualmente el resultado se multiplica por delta así que igualmente el resultado ya nos devuelve un número mucho más pequeño con decimales del tipo float, pero no es por eso porque además si fuera un float provocaría fallos de comportamiento, normalized por ejemplo su función es retornar 1. Aunque sí es correcto que es para evitar un if kilométrico, guiño guiño jajaja eso es correctísimo, pero.... es media respuesta en general, no está mal, pero no del todo bien, no sé yo si debo ser generoso y dar el corazoncito... acepto sugerencias 🤭
@mazorca751 Жыл бұрын
@@Leedeo la verdad respondi lo que en mi cabesa tenia sentido Xd soy muy nuevo en esto de programar y todabia no entiendo del todo como funcionan las cosas, tus tutoriales me an ayudado mucho :> muchas grasias por eso Media respuesta no se merese el valido Xd pero me hace saber que por alli iba la cosa ajjssjjj
@krimzonlaift291 Жыл бұрын
para poder reciclarlo y usarlo de manera eficaz?
@Leedeo Жыл бұрын
Bueno yo para reciclar es hay mil formas de hacerlo y todas buenas, a mí me gusta por ejemplo el usar clases personalizadas, por ejemplo la clase Enemy, programo un comportamiento básico, y luego los enemigos los hago de la clase Enemy, heredando todo ese comportamiento y ya poniéndole yo los comportamientos únicos que pudiera tener en sus scripts. Eso es una forma de reutilizar, ya depende de cada uno como estructure su proyecto, por eso al principio de cualquier proyecto si me tomo el tiempo necesario en dar con una estructura adecuada.
@Big_Theft_Auto10 ай бұрын
Hola, quería comentar otra cosa: he copiado el código de tu video y no ha funcionado, al cambiar en el script del personaje la parte que pone algo así como"@export speed: float" por otra línea que vi en otro video que ponia algo asi como "const(int) speed: 1" funciona (digo "algo asi como" porque ahora no estoy frente al ordenador para mirarlo, pero en resumen el problema era esa línea del script pero no tengo ni idea por que no funcionó al principio como en tu ejemplo
@tottori_games Жыл бұрын
Hagamos esto: primero me das corazoncito Y entonces respondo la pregunta
@Leedeo Жыл бұрын
Así no funcionan las cosas, en la escuelita no te ponen tu estrellita hasta que respondes 😤 y además tú deberías saberlo o al menos intuirlo, esta función la llevo usando desde Godot 3 porque no me gustaba como se hacía en Godot y en realidad es una imitación de la función de movimiento de Unity, que es la que yo sabía usar en aquel entonces. 😝
@tottori_games Жыл бұрын
@@Leedeo Pues el cast a int es por el valor bool (0 o 1). El valor final de la operación matemática te dará la dirección a desplazarse en los ejes (izq/der o arriba/abajo). Esa magnitud lo multiplicas luego por la velocidad de desplazamiento y listo, se mueve a donde quieres. Gracias por asistir a mi ted talk
@Leedeo Жыл бұрын
@@tottori_games Ahora no te la doy por listo 🤣 fue una respuesta muy precisa, digna de Rei Tukosita 😝 (es que ese es el nombre completo de Rei 😑 literal...) Bueno, está bien, lo prometido es deuda, merecido es. 😤
@magister31172 ай бұрын
me descargue el proyecto pero no entiendo como ejecutarlo para probar. Me carga un sprite pixel art cuando ejecuto cada uno de los nodos de movimientos, siempre el mismo sprite. En la pantalla de precarga si se ve los assets de cada nodo pero al ejecutar me carga el sprite pixel art plataformero. Cómo hago para probar cada uno de los movimientos? 2d, 3d, fps.
@Leedeo2 ай бұрын
Es porque son diferentes escenas, con diferentes scripts 😝 para probarlo ejecuta la escena que tengas abierta, no el proyecto, que eso ejecuta la escena que esté definida como principal. De todos modos para usarlo, pues es entender la lógica detrás del proceso, tomar script e implementarlo en tu juego. 👍
@Perroenvenenado Жыл бұрын
buena javo gracias
@Leedeo Жыл бұрын
Jajaja eso eso, ayuda mucho, de verdad, que parece que no pero si, ojala todos dijeran un simple hola, no podria responderlos a todos ¡pero volvería loco a YT! 🤣
@Superkul-jy9pw6 ай бұрын
Hola javo tus videos son buenísimos pero tengo un problema con el auto load al momento de escribir el mismo código que tu me da error en la parte de func get_axis() me dice que escriba la función que realizara func pero ya lo escribí
@nefipena9951 Жыл бұрын
me han pasado un par de cosas: 1. Llevaba media hora peleando con el programa porque no se me movia el pj, ni se reproducía la escena siquiera. Había puesto input con minúsculas 2. Lograr el movimiento fue increíblemente más fácil que en un tutorial gringo que hice hace unos meses donde luego de unas 8 horas apenas y se movia el pj, por cierto nunca lo terminé Gracias por este curso de introducción!!!
@Leedeo Жыл бұрын
Mil perdones por la tardanza, pero voy respondiendo según los voy leyendo y ya cada vez son más 😑 claro, es que GDScript si identifica mayúsculas y minúsculas, entonces no es lo mismo input, que Input, que INPUT, y aparte de este hay otro método aún más sencillo, pero este que les muestro es mi favorito y es mucho más versátil, sirve para una mayor cantidad de casos. Mil gracias y me alegro de que te haya sido de ayuda!! 😁
@nefipena9951 Жыл бұрын
@@Leedeo Gran trabajo, gracias por tu respuesta
@magister3117Ай бұрын
probe el código de movimiento en un proyecto FPS que tengo pero cuando muevo la camara hacia atras y toco la "w" para ir adelante, en vez de girar hacia la dirección e ir hacia adelante, sigue yendo en dirección en donde arranque. No se si fui claro, pero si giro la camara, parece que va hacia adelante mientras miro hacia atras jajaja pero supongo que deberia mejorar el código para que no hiciera eso.
@LeedeoАй бұрын
Pues sí, tendrías que revisar el código para asegurarte que esté correcto, y con ojo clínico, porque a veces es un simple carácter, pero vamos, que no siempre es un fallo de código 😝 pueden ser otras cosas, como que la cámara no está bien colocada y de la impresión de moverse en una dirección que no es. Ambas cosas son bastante comunes en realidad, así que son las 2 cosas que siempre compruebo en primer lugar: Que el código sea correcto, ya que me pasa mucho que suelo invertir las operaciones (que eso me sucede porque trabajo más con Blender que con Godot, y en Blender se usa el eje Z como eje vertical, y en los motores de videojuegos se usa el eje Y, así que casi siempre se me olvida ese detalle por mucho que lo sepa), y que la cámara esté bien posicionada, mirando hacia adelante, no a lo que yo “creo” que es adelante, que para asegurarme siempre pongo como algún elemento de referencia para comprobar que mire donde tiene que mirar, ya después lo quito, obviamente.
@Big_Theft_Auto10 ай бұрын
Por que en el codigo a mi me sale el "int" en verde y a ti en rojo???
@Leedeo10 ай бұрын
Por el patrón de color, no hay que darle demasiada importancia a esos detalles, cada tema de color tiene también su patrón de colores de resaltado, e incluso se puede personalizar y poner del color que a uno se le antoje.
@Big_Theft_Auto10 ай бұрын
@@Leedeo gracias ❤️❤️❤️❤️❤️ es el mejor tutorial del mundo!!!
@aeleequis Жыл бұрын
Ole, ya está aquí. Grande, máquina. Por cierto, odio a Timmy. Sorry not sorry
@Leedeo Жыл бұрын
Es normal... es normal... yo además también odio a Rei, Timmy es Timmy Timón, pero Rei también tiene apellido 🤭 es Rei Tukosita 🤣
@aeleequis Жыл бұрын
@@Leedeo Rei también me da cosa xd. Sobretodo porque no me gusta el personaje de la serie de dónde sale. La idea de que una persona sea una vaga y Nini, pero luego saca dieces en los exámenes es irreal y me da mucha rabia xd
@cer0652 Жыл бұрын
@@aeleequis Yo conozco mucha gente así, uno de mis mejores amigos lo es. Igual, también me caen mal (sobre todo mi amigo).
@palomasentadaestoysentado90969 ай бұрын
Pues la pregunta esta dificultosa xd, pero lo que entiendo es básicamente: ¿Por qué no usamos otros números diferentes de 1 y 0? Pues porque de otra manera no seria escalable. La facilidad que otorga los 0 y 1 es que funcionan facilmente a la hora de cambiar las proporciones y encima de eso, podrian dar errores si los valores son distintos como presionar ambas direcciones e ir a la derecha.
@albertomolina50672 ай бұрын
Buenas gente, una cuestión, alguien sabe por qué poniendo @export no me aparece los datos de velocidad teniendo pinchado el nodo del personaje. No entiendo porque no aparece.
@Leedeo2 ай бұрын
Me ha pasado rara vez, pero me ha pasado que sé que lo he puesto bien, que tengo la escena abierta correcta y no aparece, pero cuando me ha pasado eso, simplemente he recargado el proyecto y listo. 👍
@j.e.s.u.d.a.n.e.1 Жыл бұрын
manoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ya mire tu video de solucionar errores pero no se como componer uno que me sale en velocity.x = GLOBAL.get_axis().x * speed velocity.y = GLOBAL.get_axis().y * -speed me pone Error at (15, 18): Identifier "global" not declared in the current scope. llevo horas y no se como componer esa cosa :/ porfa no me mandes un link a tu otro video de componer errores que ya lo vi un monton de veces
@Leedeo Жыл бұрын
Pues precisamente te voy a mandar a otro tutorial jajaja kzbin.info/www/bejne/sIDblKuOnadpeqs ¡te saltaste lecciones! 😝 y en este tutorial enseñe como aprender a leer errores kzbin.info/www/bejne/jKWtnqB7lKt6f80
@j.e.s.u.d.a.n.e.1 Жыл бұрын
@@Leedeo nais de lo wacho otra ves jeje
@Leedeo Жыл бұрын
@@j.e.s.u.d.a.n.e.1 Es que si te saltaste jajaja hasta lo puse con flechas y efecto sonoro el enlace a los tutoriales 🤣 digo que lo puse en un autoload, GLOBAL es un autoload ¿y qué está diciendo ese error? 😝
@j.e.s.u.d.a.n.e.1 Жыл бұрын
@@Leedeo por eso muchachos no miren los tutoriales mientras se andan durmiendo 🤣
@DLMP_prod2 ай бұрын
Tengo una duda... si descargo un asset especial o creado para la función de movimientos del Jugador eso quiere decir que no es necesario tocar el código? 0.o
@Leedeo2 ай бұрын
No, un motor de videojuegos es un framework, y un framework es un conjunto de librerías, los addons son librerías que a su vez pueden usar otras librerías, y eso significa que hay que aprender a usarlas, ya que son un conjunto de métodos/funciones que nosotros podemos usar en nuestro juego, y no necesariamente tenemos que usar todos. Claro, si descargas un proyecto funcional, y no tocas nada, pues funcionara, obviamente, pero tampoco habrás hecho nada en el proceso 😝 En este caso, en el tutorial muestro una función de movimiento básica, que es de cosecha propia, es muy legible y, por lo tanto, comprensible, de forma que es fácil de adaptar a muchos casos, mismamente es la que utilizo yo el 99.99% de las ocasiones.
@DLMP_prod2 ай бұрын
@Leedeo Agradecido con el de arriba por poner a personas como tu en nuestros caminos, de verdad muchas gracias por aclarar esa duda, eres increíble y aun no termino el curso sin embargo tus videos me han ayudado mucho :3 aunque aun sigo batallando para entender como funcionan o se implementan los shaders 3D y también que no se como arrastrar cosas ya que no hay muchos tutoriales que expliquen como hacerlo en godot desde Android así que es un poco limitante no saber eso :'3
@Leedeo2 ай бұрын
@@DLMP_prod Es normal que al principio sea complejo, no te preocupes, yo creo que nos ha pasado a todos sin excepción 👍 aunque si apenas empiezas no te recomendaría meterte mucho en el tema de los shaders jajaja eso es un infierno hasta para muchos que ya tienen experiencia 🤣 es MUCHA matemática, y matemática avanzada. Además hay muchos shaders que ya están hechos, y son buenos, yo no tengo ningún reparo en reconocer que no tengo ni idea de hacer shaders jajaja aprendí lo justo para saber modificar los que me descargo, y todo sobre la marcha según lo he ido necesitando. No aprendo de más porque siento que es meter información innecesaria en mi cabeza, y sé como funciono, yo no retengo información que considero irrelevante, pero aquello que me interesa o me es de utilidad, lo absorbo como esponja. Ahora bien, si te encantan las matemáticas, entonces es tu mundo, vas a disfrutar muchísimo con los shaders, y lo digo de verdad. Finalmente, si no existieran personas que aman las matemáticas, seguramente no habría shaders para descargar hechos por esas personas. 😝
@DLMP_prod2 ай бұрын
@Leedeo y yo que soy pésimo con las matemáticas jajaja pero tienes razón, trabajaré con lo que tenga y pueda sin importar donde me encuentre para hacer un buen juego, además apenas descargue y empecé Godot hace unos 4 o 3 días y jamas había usado un motor de video juegos, pero he aprendido cosas interesantes asi que haré un juego increíble, y de verdad gracias por toda tu ayuda nuevamente
@x278c5 ай бұрын
Profe! No me quedo claro algo, ¿por qué para definir la velocidad del eje x y la diferencia está en que el valor speed es positivo para x y negativo para y? Buen video!!
@Leedeo5 ай бұрын
No no, en ambos ejes afecta tanto el negativo como el positivo. X es horizontal pero positivo y negativo definen derecha o izquierda, de la misma forma que Y es vertical, pero positivo y negativo definen arriba o abajo.
@gadreel78768 ай бұрын
"Línea 11:Expected closing ")" after call arguments. Línea 11:Expected end of statement after expression, found "Identifier" instead." intente copiar el codigo pero me sale estos errores :( no se por que, ¿a alguien mas le pasa?
@Damian-rast8 ай бұрын
permite convertir un bool en un int: con esto tenemos control sobre 2 numeros. incluso convertirlos a decimal y llegas a jugar con esos rangos de -1,0,1
@rmagdiel10 ай бұрын
Nononono, sin preguntas de examen, aun estoy procesando el autoload
@CritickalTvRandom Жыл бұрын
Para empezar no entiendo porque tendrías que usar IFs, porque no estoy familiarizado con los vectores, pero los beneficios de usar el método int creo que son 3 1- Rendimiento 2- Legibilidad 3- Poder restarlos para convertirlos en vectores. Estoy casi seguro que la función "Is_action" devuelve bool y esos no admiten operaciones aritméticas, por lo que pasarlo vectores sería complicado y tardado
@Leedeo Жыл бұрын
A medias, pero no está mal 😝 más que rendimiento es por legibilidad, pues tratándose de rendimiento la diferencia en este caso sería inapreciable, pero en la legibilidad sí es algo muy notorio. Cuanto más sencillo y legible sea el código, mejor y más escalable es un proyecto. Pero el tercer punto especialmente tiene un gran “pero” en la parte donde indicas que los bool no admiten operaciones aritméticas, verás: bool tiene 2 valores, true o false, si un bool lo conviertes a tipo int, true es igual a 1, y false igual a 0, y convertir un tipo bool a int es tan fácil como usar el método int(VariableTipoBool) con el nombre de la variable como parámetro, en cuyo caso ya podríamos usar el valor de retorno de un bool en todo tipo de operaciones matemáticas. Que, por cierto, este truco aplica a cualquier lenguaje de programación (no la sintaxis del método int, pero sí la lógica), y de hecho también funciona a la inversa, podemos convertir 1 y 0 a true o false, así que considero que es un dato muy interesante. 🤘
@SeniorManteca2 ай бұрын
Ehh disculpa por molestar otra vez pero por algun motivo no me funciona el codigo , en la parte en donde pusiste velocity.x = GLOBAL.get_axis().x * speed Me aparece que : identifier "GLOBAL" not declared in the current scope. Por que pasa eso ? Estoy seguro que seguí el video tal cual
@Leedeo2 ай бұрын
Ahí Godot te está diciendo el problema, el identificador GLOBAL no ha sido declarado en el ámbito actual, scope es el ámbito, y por ámbito se refiere a la clase, ya que el script donde estás escribiendo el código hereda de una clase ¿Correcto? Por ejemplo, CharacterBody2D o 3D son clases. En el ejemplo, GLOBAL es un autoload, de forma que si no has declarado el autoload GLOBAL (así, en mayúsculas, porque así lo pusiste), pues es normal que te diga que ese identificador no existe.
@SeniorManteca2 ай бұрын
@Leedeo ya, muchas gracias, disculpa la molestia
@franciscolopez-kw2xq Жыл бұрын
En vectores sienpre el orden de los factores altera el producto
@kevinesguerracardona6129 ай бұрын
Respondiendo a la pregunta del final. Primero, podríamos matizar sobre el hecho de que tratar los ejes con números enteros y intrínsecamente más simple, como apuntó un comentario anterior. También, es importante sobresaltar que en términos de eficiencia, utilizar tipos de datos enteros siempre va a resultar más económico para las memorias y procesadores puesto que no se acarrean los complejos cálculos que suelen ser necesarios para mantener consistencia al usar números con partes decimales. Evitando así, posibles bugs o fallos que resulten en mecánicas rotas. Aún así, de ser necesario, es posible trabajar con datos de velocidades (movimientos) físicamente más precisos partiendo de esta base, ya que la componente speed que actúa como módulo vectorial para los ejes de movimiento nos permite un nivel de manipulación matemática bastante amplio. Por otro lado, trabajar con muchísimos condicionales siempre de desaconseja debido a que acarrea una fuerte carga a la hora de hacer mantenimiento y/o querer escalar nuestro código. Por ejemplo, si quisiésemos modificar el comportamiento de la mecánica de movimiento según un determinado conjunto de parámetros (ambientales, de estados y demás) sería extremadamente difícil gracias a la inmensa cantidad de código que sería necesario modificar. En conclusión, gracias Bro, que manejo de los conceptos de POO más bello.
@Leedeo9 ай бұрын
Hermosa respuesta!!! jajaja no hay mucho que añadir, di el corazón incluso antes de responder!! 😝
@axelcommucated8481 Жыл бұрын
Como muevo la camara 😭
@siegfriedsouls Жыл бұрын
hice ese codigo y no se mueve mi personaje, que puede ser :/
@Leedeo Жыл бұрын
No tengo idea la verdad... fíjate de haberlo hecho como en el tutorial, get_axis al global, y en el script del player (characterbody) el de movimiento, y no te olvides ponerle una velocidad en el export claro, que sin velocidad eso sería una buena razón para no moverse. Puedes declarar la variable speed como variable normal sin export, pero lo hago así para testear la velocidad hasta dar con un nivel que me agrade.
@siegfriedsouls Жыл бұрын
@@Leedeo dale bro ahi voy a fijarme
@FacundoHernandez-q8k7 ай бұрын
hola buenas, tus vídeos me hicieron entender muchas cosas que por otro método no comprendía. pero me sucedió un error y no sé cómo resolverlo. en otros juegos funciona perfecto pero cuando hago un juego e 3 d no hay forma de que el personaje se mueva ni siquiera es capas de funcionar la gravedad ya e visto tus vídeos mil veces y el código está bien pero sigue si funcionar el movimiento y no tira ningún error de consola si te surge una idea que me pueda encaminar lo agradecería . sos un genio
@nazar9160 Жыл бұрын
¿Qué diferencia hay entre poner: var axis : vector2 var axis = vector2() ? ¿Es lo mismo?
@Leedeo Жыл бұрын
No, no es lo mismo, porque los : determinan el tipo de la variable, por ejemplo var axis : Vector2 quiere decir que axis es del tipo Vector2, pero no le asigna ningún valor, mientras que = se usa para darle un valor a la variable, vamos que var axis : Vector2 = Vector2(245, 789) quiere decir que axis es del tipo Vector2 y que es igual a Vector2(245, 789) Vamos que : se utiliza para tipar variables, y tipar variables, casi siempre es una buena práctica, aunque insisto, siempre hay excepciones, y aunque haya gente que opine lo contrario, no voy a cambiar de opinión, siempre voy a decir lo mismo. 🤣
@nazar9160 Жыл бұрын
@@Leedeo Entiendo.
@nazar9160 Жыл бұрын
Con este sistema, las animaciones diagonales no se reproducen bien ¿Cómo se puede arreglar eso?
@Leedeo Жыл бұрын
Pero eso no tiene nada que ver con la función de movimiento, yo la uso en todos mis proyectos con sus respectivas animaciones sin problemas, pero la función de movimiento va por un lado, y las animaciones van por otro, son 2 temas aparte y no hay una forma genérica de añadir animaciones en cualquier caso, depende del proyecto y de las animaciones.
@nazar9160 Жыл бұрын
@@Leedeo Entiendo.
@aeleequis Жыл бұрын
Por cierto, tienes ya un server de discord?
@Leedeo Жыл бұрын
De Discord?? Existe desde que comencé el canal 😁 siempre dejo el enlace en la descripción de los videos.
@aeleequis Жыл бұрын
@@Leedeo Nadie lee la descripción de los vídeos lmao. Ahora lo miro
@pepevazquez8372 Жыл бұрын
Hola, quería hacerles una pregunta, ¿se puede poner publicidad en los juegos para Android? , desconozco esto ya qué soy nuevo ¡Saludos!
@Leedeo Жыл бұрын
Si claro, se puede usar sin problemas Google Admob en Godot.
@wichoori84035 ай бұрын
En la parte del script que mostraste despues del recordatorio del autoload, no se porque me aparece error en las lineas de velocity.x = GLOBAL.get_axis().x * speed velocity.y = GLOBAL.get_axis().y * -speed
@leonardomansilla59093 ай бұрын
Lo explico en el video de autoload
@maxiluaces505 Жыл бұрын
Se nota que sabes exprimirle el jugo al motor, yo hace poco estoy intentando 3D y admito que me he mareado con los nodos, pero entiendo que es algo ordenado y POO. Aun así puede que intente primero con 2D. Y si, debo ser paciente con el engine...no estaré vendiendo un producto en steam en solo 2 dias (?. Gracias Leedeo por tu contenido!
@Leedeo Жыл бұрын
Yo es que donde mejor me muevo es en 3D, salvo ciertas cosas por supuesto 😅, pero todavía hay muchas cosas que me gustaría aprender. Siempre procuro mantener la sencillez en el código y mecánicas, pues no pretendo convertirme en un programador todoterreno, ni saber hacer cualquier tipo de juego, yo prefiero centrarme en los juegos que a mí me gustan, pero lo que haga, hacerlo bien.😁 Hacer un juego comercial, pues sí, requiere tiempo y paciencia, la verdad, pero creo que eso es precisamente una de las cosas más satisfactorias, yo me crezco ante los retos 😝
@joseantonioca87635 ай бұрын
holaa, quiero mover el personaje con el click, pero no encuentro un tutorial actualizado, porfaaa
@Leedeo5 ай бұрын
Pues es una buena idea para un tutorial, me lo apunto!!
@facundodelossantos151711 ай бұрын
mi código es el mismo pero al iniciar no se mueve TT
@Leedeo11 ай бұрын
Entonces no es el mismo o falta algo, asegúrense bien. En estos casos siempre les recuerdo lo siguiente: No se puede hacer lo mismo, obteniendo resultados distintos.
@Crandriel11 ай бұрын
No estoy de acuerdo que esta función sea mejor que la que trae por defecto Godot. Con la que trae por defecto, si utilizamos por ejemplo un pad, traduce automáticamente la fuerza con la que se está moviendo el stick analógico. Además tiene más rendimiento (usa rutinas en C++ para obtener los resultados y no varias llamadas a instrucciones GDSCript que son lentísimas), aunque eso es lo de menos, ya que es despreciable en la mayor parte de los casos en los que se suele utilizar. Se me ocurre alguno que no, en plan controlas decenas de miles de sprites con las acciones pero no es lo habitual. Pero el principal problema es que la función nativa vale tanto para controles analógicos como digitales, mientras que esta no.
@Leedeo11 ай бұрын
Esta también 😝 solo hay que usar InputEventJoypadMotion para controles analógicos. Sigue siendo más sencilla y solo vas a usarlo si lo necesitas, si no, pues no.
@gustavoalmunadesign8 ай бұрын
Porque no podemos operar valores booleanos, y en una función: para poder incluir el sistema a cualquier personaje que queramos usar como player, o agregar los players que deseemos dentro del juego == sistema reutilizable
@eduardovidales Жыл бұрын
no se ami me aparece un error en get_axis necesito ayuda
@Leedeo Жыл бұрын
Justo el video anterior es el aprender a leer errores 😝 kzbin.info/www/bejne/jKWtnqB7lKt6f80
@eduardovidales Жыл бұрын
@@Leedeo ya lo arregle muchas gracias pa cuando nos enseñas hacer un boss fight este que tengo un proyecto y necesito esa mecánica o la que si respondes mal una pregunta te devuelva al principio