En este tutorial aprenderás, paso a paso, cómo hacer que tu personaje de Scratch salte. Repasaremos distintas maneras posibles de implementar el salto, cada una con distintos niveles de complejidad. También nos encargaremos de solucionar algunos errores (bugs) frecuentes que pueden surgir.
Introducción al movimiento en Scratch
En Scratch, los objetos se encuentran en dos dimensiones. Esto quiere decir que sólo pueden moverse hacia arriba/abajo o derecha/izquierda. El movimiento de los objetos en Scratch se gestiona usando los bloques de Movimiento, que se caracterizan por su color azul.
Encontrarás una lista de todos los bloques a la izquierda en la interfaz de Scratch. Primero, asegúrate de tener seleccionada la pestaña Código. Luego, haciendo clic en el icono correspondiente de Movimiento, encontrarás todos los bloques necesarios.
Nivel básico: salto sencillo
Para este salto, vamos a hacer que el perrito (nuestro personaje) suba, pase un momento en el aire, y luego baje.
Para ello haremos uso de los siguientes bloques:
Bloques de evento
En primer lugar, haremos uso del bloque “al presionar tecla […]”. Este bloque pertenece a la categoría de Eventos, que se encargan de detectar cuando algo ocurre (el evento) y así activar la secuencia de bloques a la que está unido.
Para ello, elegiremos una tecla de salto. Al presionar esta tecla, nuestro personaje saltará. En mi caso, voy a utilizar la barra espaciadora, pero tú puedes escoger la tecla que quieras. Incluso puedes utilizar otro bloque de evento si lo prefieres, como por ejemplo “al hacer clic en este objeto”.
Ahora que ya tenemos la manera de activar el salto, es hora de programar el salto en sí. Hay muchas maneras de hacer esto, encontrarás varias en este mismo artículo, pero esta es una de las más sencillas.
Bloques de movimiento
Para hacer que nuestro personaje salte haremos uso del bloque “sumar a Y […]”. Encontrarás este bloque en la sección de Movimiento. En Scratch, la coordenada Y representa arriba y abajo. Los valores positivos de Y representan arriba, mientras que los valores negativos representan abajo.
Este bloque toma las coordenadas de nuestro objeto, es decir, su posición actual, y suma a su coordenada Y una determinada cantidad. A pesar de que el bloque se llama “sumar”, también podemos usarlo para restar. Para ello, basta con introducir un número negativo en la cajita.
Para el salto, queremos que nuestro personaje suba y luego baje. Primero, sumaremos cierta cantidad a Y; luego, le restaremos la misma cantidad, así volverá a la misma altura desde la que saltó. Recuerda: sumar a Y quiere decir subir, mientras que restar a Y quiere decir bajar.
Yo he utilizado 30, pero puedes cambiar esta cantidad a tu gusto. Dependiendo del tamaño de tus objetos o de lo alto que quieres que salten, quizá quieras usar un número más pequeño o más grande.
¡Probemos nuestro salto! Basta con pulsar la barra espaciadora (o la tecla que hayas elegido).
Como verás, parece que no funciona. El bloque se ilumina cuando pulsamos espacio, pero el personaje no parece moverse. Veamos cómo podemos arreglarlo. Lo que está ocurriendo es justo lo que hemos indicado que haga el personaje. Primero sube y luego baja. Entonces, ¿por qué no lo vemos moverse?
Bugfixing #1: el personaje no parece moverse
El problema es que el bloque “sumar a Y […]” funciona de forma completamente instantánea. Nuestro personaje se teletransporta hacia arriba en un instante e inmediatamente vuelve a teletransportarse hacia abajo. Es por ésto que no lo vemos moverse. Para arreglarlo, vamos a añadir una pequeña espera entre que sube y baja.
Aquí es donde entra en acción el último bloque que vamos a usar: el bloque “esperar […] segundos”. Este bloque pertenece a la categoría Control y sirve para retrasar la ejecución de los bloques que se colocan debajo. Colocaremos este bloque justo entre el bloque de subida y el bloque de bajada. De este modo, el personaje subirá, esperará un pequeño tiempo, y luego bajará.
¡Ahora sí funciona! Nuestro personaje ya puede saltar. No obstante, al programarlo de esta manera el salto se ve un poco artificial. Veamos cómo podemos hacer que se vea un poco más suave.
Extra: suavizar el salto
El problema es que el movimiento no es progresivo, nuestro personaje se teletransporta arriba y abajo, lo que se ve muy poco realista. Para suavizarlo, vamos a utilizar otro bloque de Control: el bloque “repetir […]”.
Te habrás fijado en tiene una forma un poco rara, distinta de los otros bloques. Esto es porque puedes colocar bloques no solo arriba y abajo, sino dentro de él, así:
Este bloque es un bucle. Lo que hace es repetir lo que haya dentro de él un determinado número de veces. Una vez se haya repetido esa cantidad de veces, pasará al siguiente bloque. En este ejemplo, lo repetirá 3 veces antes de continuar. Cuando se ejecute, primero dirá “¡Hola!” tres veces, y después dirá “¡Adiós”.
Usaremos este bloque para hacer que la animación de salto sea progresiva. En lugar de hacer que nuestro personaje se mueva una gran distancia de golpe, haremos que se mueva una distancia pequeña muchas veces seguidas.
Para ello, colocaremos cada uno de los bloques de movimiento dentro de un bucle “repetir […] veces”. Puedes experimentar con la cantidad de repeticiones, cuantas más pongas, más lento será el salto.
¡Eso se ve mucho mejor! Recuerda disminuir la cantidad en los bloques de movimiento ya que ahora los repite muchas veces, de otro modo tendrás un salto mucho más grande de lo que esperabas. Ahora que utilizamos este método, ya no necesitamos el bloque de esperar, así que lo he quitado.
¡Ya tienes una manera de hacer que tu personaje salte! Si estás interesado en aprender maneras alternativas o algo más avanzadas de programar el salto, continúa leyendo.
Nivel intermedio: salto con gravedad
Para darle un poco más de realismo a nuestro juego, podemos implementar un sistema de físicas que utilice la gravedad. Ésto no solo nos será útil para tener saltos más realistas, sino que también viene muy bien, por ejemplo, para programar el comportamiento de nuestro personaje cuando cae de una plataforma a otra.
Veamos cómo hacerlo.
Explicación física
En primer lugar, un pequeño resumen de lo que vamos a hacer. Como ya sabrás, la gravedad tira hacia abajo de todas las cosas. Esto hace que los objetos que están subiendo (por ejemplo, una pelota lanzada hacia arriba) suban cada vez más lento. Decimos que su velocidad vertical decrece constantemente.
Llega un momento en el que la gravedad hace que esta velocidad se haga cero, que es en el punto más alto de su trayectoria. Entonces, la velocidad se vuelve negativa y la pelota comienza a bajar cada vez más rápido hasta chocar con el suelo.
Explicación en el código
Vamos a implementar un sistema parecido utilizando dos variables que nos ayudarán a controlar el movimiento (salto y caída) de nuestro personaje. Son las variables VelocidadY y Gravedad.
VelocidadY servirá, como su nombre indica, para establecer la velocidad a la que nuestro personaje debería moverse en el eje Y, es decir, arriba o abajo. Utilizaremos un bucle “para siempre” para mover a nuestro personaje constantemente en base al valor de esta variable. Cuando sea positiva, nuestro personaje se moverá hacia arriba. Cuando se vuelva negativa, se moverá hacia abajo.
Crear una variable
Para crear una variable, dirígete a la sección Variables de la pestaña código. Allí encontrarás el botón Crear una variable, que te permite escoger un nombre. Crearemos primero VelocidadY.
Verás aparecer tu nueva variable junto a una pequeña checkbox. Marcar esta cajita sirve para mostrar el valor de la variable en la pantalla del juego. Puedes dejarla marcada por ahora.
Para asegurarnos de que nuestro personaje comienza el juego con velocidad 0, lo estableceremos al iniciarlo con el siguiente bloque. Puedes encontrarlo en la sección Variables:
Después de eso, utilizaremos un bucle “para siempre” que moverá nuestro personaje en base a VelocidadY. Recuerda, cuando la velocidad sea positiva, se moverá hacia arriba; cuando sea negativa, se moverá hacia abajo.
Cómo programar el salto
Ahora mismo, nuestro personaje no se moverá, ya que VelocidadY se mantendrá en 0 desde el principio, y aún no hemos programado ningún bloque que la cambie. Programemos ahora nuestro salto haciendo uso de esta nueva variable:
Cada vez que pulsemos espacio (o la tecla de salto que escojas), esto hará que la VelocidadY de nuestro personaje se haga 5, es decir, comenzará a moverse a esa velocidad hacia arriba (porque usamos un número positivo). Pero esto tiene un problema:
Claro, nuestro personaje se moverá hacia arriba sin parar, porque no hay nada que lo pare. Aquí es donde entra en juego la segunda parte de este sistema: la Gravedad.
Cómo programar la gravedad
La variable Gravedad nos servirá para “tirar hacia abajo” de nuestro personaje. Dentro de un bucle “para siempre”, restaremos a la VelocidadY el valor de Gravedad. De este modo, VelocidadY decrecerá constantemente.
En primer lugar, para utilizar Gravedad, tenemos que darle un valor. Lo haremos al iniciar el juego (al clicar la bandera verde), así que podemos usar la misma secuencia de bloques del paso anterior:
Una vez más, el valor que he usado yo es solo un ejemplo. Puedes experimentar con él y usar el que te parezca más cómodo. Eso sí, asegúrate de hacerlo negativo, ya que tenemos que restarle este valor a la velocidad de nuestro personaje, no sumárselo.
Ahora que ya hemos declarado nuestra Gravedad, hay que añadir el bloque que se la resta a nuestra VelocidadY. Vamos a colocarlo dentro del mismo bucle “para siempre” en el que movemos a nuestro personaje:
He añadido al bucle el bloque “si toca un borde, rebotar”, para evitar que el personaje se siga hundiendo al llegar al suelo. Probémoslo:
¡Ya lo tenemos! Como ves, se comporta como la pelota del GIF de antes: al saltar, sube cada vez más lento (su velocidad se está reduciendo), para eventualmente comenzar a bajar caer (su velocidad se vuelve negativa).
Sin embargo, hay un par de problemas:
- En primer lugar, no hay nada que nos impida saltar mientras estamos en el aire, por lo que nuestro personaje puede saltar sin parar. Esto podría ser intencional, dependiendo del juego, pero para este tutorial vamos a aprender a corregirlo.
- En segundo lugar, si te fijas en la VelocidadY (arriba a la izquierda), sigue decreciendo sin parar mientras estamos en el suelo. Esto puede plantear a su vez dos problemas:
- Si después de un rato parado, nuestro personaje cae de una plataforma a otra, lo hará rapidísimo, con toda la velocidad que tiene acumulada.
- Si la partida dura mucho, la velocidad podría volverse tan grande que procesarla ralentice el juego, o incluso lo rompa.
Bugfixing #1: velocidad en el suelo
La solución a estos dos problemas está algo relacionada: usaremos la detección del suelo para arreglarlos. Usaremos un bloque condicional “si […] entonces / si no”. Este bloque evalúa una condición; si se cumple, ejecuta una secuencia de bloques; si no se cumple, ejecuta una secuencia distinta.
En primer lugar, vamos a hacer que la actualización de la velocidad ocurra sólo cuando no estamos tocando el suelo. Para comprobarlo, utilizaremos el bloque “¿tocando […]?” que puedes encontrar en la sección de Sensores. Colocaremos el código que se encarga de actualizar la velocidad dentro del si no, que se ejecuta solo si no se cumple la condición (tocar el suelo):
El bloque que queremos meter dentro del condicional es el que actualiza la variable VelocidadY, es importante dejar el que mueve a nuestro personaje (sumar a y) fuera del condicional.
Lo que necesitamos no es dejar de mover a nuestro personaje. Necesitamos mover a nuestro personaje incluso si toca el suelo, de otro modo no podría despegarse al saltar. Lo que necesitamos es dejar de aplicarle la gravedad.
Esto servirá para que la velocidad deje de aumentar mientras tocamos el suelo, pero la velocidad que teníamos acumulada sigue guardada. Tenemos que encargarnos de reiniciarla a 0 cuando estemos tocando el suelo. Para ello, lo colocaremos dentro de la primera parte del condicional:
Por el orden en que se actualizan las colisiones, es necesario poner el bloque que mueve nuestro personaje antes del condicional. Si ahora inicias el juego, verás que la velocidad ya no sigue creciendo sin control mientras el personaje está en el suelo:
Es posible que veas el valor de VelocidadY oscilando rápidamente entre 0 y un número pequeño. Esto ocurre sólo temporalmente, entre que la velocidad y se actualiza y el juego se da cuenta de que está en el suelo. Pero no te preocupes, esto es solo visual, la velocidad se reinicia a 0 antes de usarla, por lo que el personaje no se moverá.
Ahora que ya hemos solucionado ese problema, pasemos al problema de los saltos en el aire.
Bugfixing #2: saltos en el aire
Para solucionar el problema de saltar en el aire, utilizaremos el mismo condicional, y una nueva variable, PuedeSaltar. Esta variable será de tipo booleana, es decir, almacena un valor binario, de sí (1) o no (0).
La utilizaremos de la siguiente forma: cuando el jugador toque el suelo, haremos que la variable sea 1 (es decir, que pueda saltar). Una vez el jugador salte, la haremos 0, y se mantendrá así hasta que vuelva a tocar el suelo.
Cuando el jugador intente saltar, primero comprobaremos si esta variable es 1 utilizando el bloque Operador “=”. Si lo es, le dejaremos saltar. Si no lo es, se lo impediremos. De este modo, solo podrá saltar si ha tocado el suelo desde la última vez que saltó. Es decir, no podrá encadenar saltos.
Modificaremos el código del salto:
Resultado final
No importa cuántas veces presione salto en el aire, no me deja saltar hasta haber vuelto al suelo.
¡Espero que te haya gustado el tutorial y nos vemos en el próximo!
Comentarios recientes