Fundamentos de Programación

1

Bienvenida a Platzi: ¿qué necesitas para tomar el curso?

2

¿Cómo aprender programación?

3

Crea tu primer sitio web

4

Sitios web con HTML

5

Estructura de árbol en HTML

6

Instalando tu primer editor de código

7

Cómo declarar variables y usar prompt

8

Algoritmo de piedra, papel o tijera

9

Algoritmo avanzado de piedra, papel o tijera

10

Aleatoriedad

11

Refactor del código usando funciones

12

Ciclos

13

Gana 3 veces

14

Archivos de HTML y JavaScript

15

¿Qué es el DOM?

Quiz: Fundamentos de Programación

Desarrollando un juego con HTML y JavaScript

16

Maquetación con HTML

17

Sección de elegir mascota

18

¿Dónde ubicar la etiqueta script? Conectando HTML con JavaScript

19

Escuchando eventos con JavaScript

20

addEventListener

21

Manipulación del DOM

22

Enemigos aleatorios

23

Ataques en JavaScript

24

Ataques aleatorios del enemigo

25

Imprimiendo ataques del enemigo

26

¿Ganaste, perdiste o empataste?

27

Tablas de verdad

28

Creando el contador de vidas

29

¿Quién ganó el juego?

30

Reiniciando el juego

31

Ocultando elementos HTML con JS para mejorar la UX del juego

Quiz: Desarrollando un juego con HTML y JavaScript

Estilos con CSS

32

Anatomía de CSS

33

Tipos de display

34

Flexbox

35

Modelo de caja

36

Imágenes para los Mokepones

37

Estilos del botón

38

Adaptando HTML al diseño del juego

39

Layout: título y ataques

40

Adaptando JavaScript al diseño del juego

41

CSS Grid

42

Responsive Design

43

Detalles finales

Quiz: Estilos con CSS

Optimización de código

44

Revisión de código

45

Don't repeat yourself (DRY)

46

Clases y objetos

47

Clases y objetos de Mokepon

48

Arrays o arreglos

49

Objetos vs. arreglos

50

Ciclos: manipulando el DOM con iteradores

51

Declaración lenta de variables

52

Una sola fuente de la verdad

53

Mascotas aleatorias con arreglos

54

Ataques dinámicos por cada mascota: extraer

55

Renderizado dinámico en HTML

56

Eventos de click dinámicos

57

Secuencia de ataques del enemigo

58

Iniciando el combate

59

Resolviendo el reto de condicionales

60

Optimizando el frontend del juego

Quiz: Optimización de código

Mapa con canvas

61

Introducción a canvas: dibujando con JavaScript

62

Moviendo a Capipepo hacia la derecha

63

Movimiento hacia todas las direcciones

64

Movimientos con el teclado

65

Imágenes y personajes de fondo

66

Métodos en las clases

67

Obstáculos y colisiones

68

Combate entre mokepones colisionados

69

Mapa responsive

70

Botones bonitos y viewport

Quiz: Mapa con canvas

Backend: videojuego multijugador

71

¿Qué es backend?

72

Instalación de Node.js y NPM

73

Terminal de comandos y Node.js

74

Servidor web con Express.js

75

HTTP, localhost, servidores y puertos

76

Express.js y fetch: API REST con JavaScript

77

JSON y POST: mokepon online

78

Transmisión de coordenadas

79

Mokepones dinámicos en el mapa

80

Optimizando el mapa del juego

81

Batalla entre jugadores

82

Consumiendo la API de ataques del enemigo

Quiz: Backend: videojuego multijugador

Próximos pasos

83

Probando el juego en varios dispositivos

84

¿Y ahora qué curso tomar?

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Movimiento hacia todas las direcciones

63/84
Recursos

Aportes 88

Preguntas 43

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En el tiempo 5:12 la profesora colapsa algunas funciones para ganar espacio en la pantalla y trabajar más cómodamente.
En vscode se pueden utilizar atajos de teclado que permiten esto mismo
Ctrl+Shift+P y después tecleamos >Fold All y por último tecleamos intro o enter.
Acá pueden ver todas mis funciones colapsadas:

Rapipepo

Con cada clase que pasa me siento más como un niño con un juguete nuevo 🎈

En el minuto 3:58 la profe se pone la 10 y explica como es para seleccionar rápido varias lineas que dicen lo mismo, se lo vi hacer a los otros profesores y nunca me entere como se hacia xD Gracias profe! ❤️
(Spoiler: es ctrl + d)

Si a alguien le paso que onmousedown no le funciona como a mi siempre pueden usar los pointer Events (onpointerdown, onpointerup) que en resumen Chrome movió su compatibilidad desde onmousedown to pointer events para ser mas compatibles con todos los tipos de inputs que hay (touch, pencil, mouse) etc.

Según he visto este cambio se efectuó desde Chrome Version 55.
https://www.w3.org/TR/pointerevents/

10:24, estamos asignando una velocidad a Rapipepo

![](

También se puede capturar la tecla, así lo intenté.

function capturaTecla() {
    document.addEventListener('keydown', e=> {
        if (e.key==='ArrowUp') {
            capipepo.y-=5
            pintarPersonaje()
        } else if (e.key==='ArrowDown') {
            capipepo.y+=5
            pintarPersonaje()
        } else if (e.key==='ArrowLeft') {
            capipepo.x-=5
            pintarPersonaje()
        } else if (e.key==='ArrowRight') {
            capipepo.x+=5
            pintarPersonaje()
        }
    })
}

Jajajajaja me dio mucha risa cuándo Capipepo fue para arriba y desapareció.
Excelentes clases profe Estefany

Yo utilizo flechas:

        <button onmouseup="detenerMovimiento()" onmousedown="moverArriba()">↑</button>
        <button onmouseup="detenerMovimiento()" onmousedown="moverIzquierda()">←</button>
        <button onmouseup="detenerMovimiento()" onmousedown="moverAbajo()">↓</button>
        <button onmouseup="detenerMovimiento()" onmousedown="moverDerecha()">→</button>

Yo descargué las flechas en svg, hay muchas páginas en las que podemos encontrar imagenes gratuitas.

Después les apliqué un poco de CSS

Por fin un profe que explica los atajos que usa ☹️💚

Para los que quieran camabiar los nombres de las direcciones a donde va el Mokepon:
↑ = Alt+24
↓ = Alt+25
→ = Alt+26
← = Alt+27.

Un pequeño spoiler de cómo hacerlo con teclas

var teclas = {
    UP : 38,
    DOWN : 40,
    LEFT : 37,
    RIGHT : 39
};

function moverDerecha(){
    Capipepo.velocidadX = 5;
}
function moverIzquierda(){
    Capipepo.velocidadX = -5;
}
function moverArriba(){
    Capipepo.velocidadY = -5;
}
function moverAbajo(){
    Capipepo.velocidadY = 5;
}

function moverTeclas(evento){
    switch (evento.keyCode) {
        case teclas.DOWN:
            moverAbajo()
            break;
        case teclas.UP:
            moverArriba()
            break;
        case teclas.LEFT:
            moverIzquierda()
            break;
        case teclas.RIGHT:
            moverDerecha()
            break;
        default:
            break;
    }
}

function detenerMovimiento(){
    Capipepo.velocidadX = 0;
    Capipepo.velocidadY = 0;
}

document.addEventListener("keydown", moverTeclas);
document.addEventListener("keyup", detenerMovimiento);

AMAZING THIS CLASS.

Para que la imagen de la mascota elegida sea dinámica, es decir, que no por defecto salga Capipepo sino la que se elija

Dios mío me como la cabeza buscando errores en el anterior código y en la siguiente clase lo borramos…!

Ahora corres que flipas.


para mi siento que ella va muy rapido xd pero lo bueno esque uno puede bajarle la velocidad a la clase e ir a su propio ritmo

Hola, mi mokepon no se mueve en ninguna dirección, no sé si sea porque los eventos onmousedown y onmouseup no son compatibles con mi chrome, o no sé como solucionarlo ya que en console no me arroja nada, ningún error, nada… A alguién mas le ha sucedido, gracias por cualquier ayuda

Me rompió la cabeza un rato esta línea de código. intervalo = setInterval(pintarPersonaje, 50), no lograba entender, en los movimientos, en qué momento pintábamos al personaje.

function moverIzquierda() {
    // asignamos un valor pero no movemos nada
    capipepo.velocidadX = -5
}

Hasta que puse un console.log("Estamos pintando al personaje...") dentro de pintarPersonaje y vi dentro de la consola después de seleccionar la mascota. Todo el tiempo estamos pintándola aunque no la estemos moviendo. Por eso cuando llamamos a las funciones de mover, al cambiar el valor de la velocidad, nos parece que lo moviéramos, pero en realidad solo asignamos un valor, y aun cuando no la movemos la mascota se esta redibujando una y otra vez en su misma posición.

function pintarPersonaje() {
    console.log("Estamos pintando al personaje...")  // algo así
    capipepo.x = capipepo.x + capipepo.velocidadX
    capipepo.y = capipepo.y + capipepo.velocidadY
    lienzo.clearRect(0, 0, mapa.width, mapa.height)
    lienzo.drawImage(
        capipepo.mapaFoto,
        capipepo.x,
        capipepo.y,
        capipepo.ancho,
        capipepo.alto
    )
}

Muy chevere trabajar con los clicks. Todo un reto asignar dinámicamente los eventos a los botones desde JavaScript y detener el serInterval.

Lo que se me ocurrió fue crear una función para cada sentido de movimiento (Derecha, Izquierda, Arriba y Abajo). Por supuesto también tuve que crear 4 botones.

EL JS

function pintarPersonaje() {
    lienzo.clearRect(0, 0, mapa.clientWidth, mapa.height )
    lienzo.drawImage(
        capipepo.mapaFoto,
        capipepo.x,
        capipepo.y,
        capipepo.ancho,
        capipepo.alto
    )
}

function moverCapipepoDerecha() {
    capipepo.x += 5
    pintarPersonaje()
}
function moverCapipepoIzquierda() {
    capipepo.x -= 5
    pintarPersonaje()
}

function moverCapipepoArriba() {
    capipepo.y -= 5
    pintarPersonaje()
}

function moverCapipepoAbajo() {
    capipepo.y += 5
    pintarPersonaje()
}

EL HTML:

 <section id="ver-mapa">
            <h1 id="titulo">Recorre el mapa con tu Mokepón</h1>
            <canvas id="mapa"></canvas>
            <button onclick="moverCapipepoDerecha()">Derecha</button>
            <button onclick="moverCapipepoIzquierda()">Izquierda</button>
            <button onclick="moverCapipepoArriba()">Arriba</button>
            <button onclick="moverCapipepoAbajo()">Abajo</button>
        </section>
<code> 

Conforme avanza el curso hay una cosa que me preocupa, y es que este curso es de Programación Básica, no puedo ni imaginar lo que le va a pasar a mi cerebro al llegar al curso avanzado!!! 😧😧😧

una forma de reducir codigo

codigo de la profe:
capipepo.x = capipepo.x + capipepo.velocidadx
capipepo.y = capipepo.y + capipepo.velocidady

la forma de reducir codigo:
capipepo.x += capipepo.velocidadx
capipepo.y += capipepo.velocidady

Pensé que no era necesario crear la función de onmouseup ya que por lógica cuándo soltas el click deja de ejecutarse el evento onmousedown y se debería detener el movimiento

Al añadir la llamada a la funcion pintarPersonaje en intervalo, la llamada posterior ya no sería necesaria al resultar redundante.
Yo la comenté e igual funciona.

sectionVerMapa.style.display = 'flex' 
intervalo = setInterval(pintarPersonaje, 50)
//pintarPersonaje()

todavía tengo el mismo error y ya revisé el código.

si su mokepon se sale volando no se olvide colocar los parentesis en HTML despues de:
…onmouseup=detenerMovimiento()…

Yo realice lo siguiente en html:

Y esto en el JS:

buena profesora muy buen consejo el de cerrar las lineas para encontrar mas rapido todo

Podemos agregar un evento para las flechas del telcado con el fin de que se pueda mover el personaje.
Este código va luego de dibujar el personaje, dentro de la función pintarPersonaje();

//Evento para mover con las flechas
  document.addEventListener('keydown', function(e){
    if(e.key === 'ArrowUp'){
      moverArriba();
    }else if(e.key === 'ArrowRight'){
      moverDerecha();
    }else if(e.key === 'ArrowDown'){
      moverAbajo();
    }else if(e.key === 'ArrowLeft'){
      moverIzquierda();
    }else{
      detenerMovimiento();
    }
  })
  //Evento para detener movimiento
  document.addEventListener('keyup', detenerMovimiento); 

Aqui mismo lo detenemos al levantar alguna tecla

en mi opinion no me gusta como enseña siento que va muy rapido, ademas que explica muy enredado… busque este tema en chat gpt y te explica mucho mejor …!!!

0:37
Copiar linea - Shift + Alt + ↑ / ↓

Más atajos de vscode acá: (https://gist.github.com/Heipry/0c585a989953f46d56792cb2d93c0a15)

También se puede escribir así, creo que aplica al dicho Don’t repeat yourself

//así:
  moke.x += moke.velocidadX
//en vez de:
  moke.x = moke.x  +  moke.velocidadX

“Rapipepo” jajaja, me imaginé un capipepo veloz.

yo también voy a utilizar fechas 😃

Tengo el problema de que se va pintando continuamente con cada movimiento sin limpiarse el tablero a pesar de que puse que se haga ¿Alguien me ayuda??
porque no crear una sola función que haga los 4 movimientos
Recomiendo estructurar el codigo de una manera mas ordenadas, para no tener 4 funciones por cada direccion, sino tener 1 funcion que se modifica dependiendo de cada direccion, aca les doy el ejemplo mio con los botones y la funcion: HTML: `        <section id="ver-mapa">            <h1 class = "titulo">Recorre el mapa con tu elemento!            <canvas id="mapa"></canvas>            <button onmouseup="detenerMovimiento()" onmousedown="moverGluglu('arriba')">Arriba</button>            <button onmouseup="detenerMovimiento()" onmousedown="moverGluglu('izquierda')">Izquierda</button>            <button onmouseup="detenerMovimiento()" onmousedown="moverGluglu('abajo')">Abajo</button>            <button onmouseup="detenerMovimiento()" onmousedown="moverGluglu('derecha')">Derecho</button>        </section>` JavaScript: `function pintarPersonaje(){    gluglu.x = gluglu.x + gluglu.velocidadX    gluglu.y = gluglu.y + gluglu.velocidadY    lienzo.clearRect(0,0, mapa.width, mapa.height)    lienzo.drawImage(        gluglu.mapaFoto,         gluglu.x,        gluglu.y,         gluglu.ancho,         gluglu.alto    )}` `function moverGluglu(direccion){    if(direccion == "izquierda"){        gluglu.velocidadX = 5    }else if(direccion == "derecha"){        gluglu.velocidadX = -5    }else if(direccion == "arriba"){        gluglu.velocidadY =  -5    }else if(direccion == "abajo"){        gluglu.velocidadY = 5    }    }` `function detenerMovimiento(){    gluglu.velocidadX = 0    gluglu.velocidadY = 0}` espero haber ayudado a mantener el codigo mas ordenado!
HAY MUCHAS COSAS QUE LA PROFE NO ESPLICA Y ALGUNAS CONBINACIONES Y TRUCOS NO LA MUESTRA
Era muy fácil agregar los botones. function moverToisblaisArriba(){  toisblais.y = toisblais.y - 5  pintarPersonaje()} function moverToisblaisAbajo(){  toisblais.y = toisblais.y + 5  pintarPersonaje()} function moverToisblaisIzquierda(){  toisblais.x = toisblais.x - 5  pintarPersonaje()} function moverToisblaisDerecha(){  toisblais.x = toisblais.x + 5  pintarPersonaje()}
function moverCapipepo() { // Incrementa la posición en el eje Y para mover hacia abajo, o decrementa para mover hacia arriba capipepo.y = capipepo.y + 5; // Puedes ajustar el valor de 5 según la velocidad de movimiento deseada // Vuelve a pintar el personaje con la nueva posición pintarPersonaje(); }

extraerFotoYCoordenadas( ) ahora extrae también la velocidad y mostrarFoto se ha convertido en moverAvatar( ) ya que hace el cálculo de la posición del mokepón. He añadido a las variables globales mascotaVelocidadX y mascotaVelocidadY.
IMPORTANTE: en seleccionarMascotaJugador() [respecto al mapa] ahora solo están el display flex de esta sección, extraerFotoYCoordenadas( ) e intervalo = setInterval(moverAvatar, 50) antes de seleccionarMascotaEnemigo.

function extraerFotoYCoordenadas() {
    for (let i = 0; i < mokepones.length; i++) {
        if (mascotaJugador === mokepones[i].nombre) {
            mascotaX = mokepones[i].x
            mascotaY = mokepones[i].y
            mascotaAncho = mokepones[i].ancho
            mascotaAlto = mokepones[i].alto
            avatarMascota = mokepones[i].foto
            mascotaVelocidadX = mokepones[i].velocidadX
            mascotaVelocidadY = mokepones[i].velocidadY
        }
    } 
}

function moverAvatar() {
    mascotaX = mascotaX + mascotaVelocidadX
    mascotaY = mascotaY + mascotaVelocidadY

    avatar.src = avatarMascota
    lienzo.clearRect(0,0,mapa.width, mapa.height)
    lienzo.drawImage(avatar, mascotaX, mascotaY, mascotaAncho, mascotaAlto)

    console.log('Estoy comprobando si mueves al mokepón')
}

function moverAvatarDerecha() {
    mascotaVelocidadX = 5
}
function moverAvatarIzquierda() {
    mascotaVelocidadX = -5
}
function moverAvatarArriba() {
    mascotaVelocidadY = -5
}
function moverAvatarAbajo() {
    mascotaVelocidadY = 5
}
function detenerAvatar() {
    mascotaVelocidadX = 0
    mascotaVelocidadY = 0
}
buenas, chicos no me sale la img de capipego en el canva , nose que hacer :(
Con esto logre que se mueva verticalmente capipepo: function moverCapipepo(){    if (condition) {        capipepo.x = capipepo.x + 10    }    capipepo.y = capipepo.y - 4    pintarPersonaje()}```js function moverCapipepo(){ capipepo.x = capipepo.x + 10    capipepo.y = capipepo.y - 4    pintarPersonaje()} ```
Hola, quisiera pedir ayuda, mi capipepo se sale del canva y no sé, la función de detenerMovimiento no me está funcionando ![](https://static.platzi.com/media/user_upload/image-c2357b31-8565-46ed-96f0-848cd5ea53de.jpg)
![](https://static.platzi.com/media/user_upload/image-1a805299-e8d0-44d7-98d5-07367b0a28ee.jpg) así vamos
No lo hice exactamente igual que la profa, pero similar = ```js <button onclick="moverCapipepoDerecha()">Mover a la Derecha</button> <button onclick="moverCapipegoArriba()">Mover hacia arriba</button> <button onclick="moverCapipepoIzquierda()">Mover hacia la izquierda</button> <button onclick="moverCapipegoAbajo()">Mover hacia abajo</button> function moverCapipepoDerecha() { capipepo.x = capipepo.x + 5 pintarPersona() } function moverCapipepoIzquierda() { capipepo.x = capipepo.x - 5 pintarPersona() } function moverCapipegoArriba() { capipepo.y = capipepo.y - 5 pintarPersona() } function moverCapipegoAbajo() { capipepo.y = capipepo.y + 5 pintarPersona() } ```
Como no vi q alguien mas lo hiciera les voy a explicar como duplicar una linea: sin seleccionar nada solo te pones sobre la linea y haces Ctrl + c y Ctrl + v, y se te duplicara, puedes hacerlo cuantas veces quieras con el ctrl v despues de que hallas hecho el paso anterior. 👌😎😎
Mi aporte para que el mokepon se detenga si toca un borde (y para que los botones no se activen si ya está contra el borde hacia el cual se quiere mover): Al final de la función pintarPersonaje, agregué lo siguiente (el resto de la función no la muestro para que se vea mejor): `function pintarPersonaje(){` `(...)` `    if (mascotaJugadorObjeto.y <= 0 || (mascotaJugadorObjeto.y + mascotaJugadorObjeto.height) >= mapa.height){        mascotaJugadorObjeto.velocidadY = 0        }    if (mascotaJugadorObjeto.x <= 0 || (mascotaJugadorObjeto.x + mascotaJugadorObjeto.width) >= mapa.width){        mascotaJugadorObjeto.velocidadX = 0    }}` Luego, en cada botón le puse la condición de que no tiene que estar tocando el borde correspondiente para que se active el movimiento: `function moverPersonajeArriba(){    if (mascotaJugadorObjeto.y > 0){    mascotaJugadorObjeto.velocidadY = -5    pintarPersonaje(mascotaJugadorObjeto)    }}` `function moverPersonajeIzquierda(){    if(mascotaJugadorObjeto.x > 0){    mascotaJugadorObjeto.velocidadX = -5    pintarPersonaje(mascotaJugadorObjeto)    }}` `function moverPersonajeAbajo(){    if((mascotaJugadorObjeto.y + mascotaJugadorObjeto.height) < mapa.height){    mascotaJugadorObjeto.velocidadY = 5    pintarPersonaje(mascotaJugadorObjeto)    }}` `function moverPersonajeDerecha(){    if ((mascotaJugadorObjeto.x + mascotaJugadorObjeto.width) < mapa.width)    mascotaJugadorObjeto.velocidadX = 5    pintarPersonaje(mascotaJugadorObjeto)}` Espero les aporte! Muy bueno el curso hasta ahora
muy buena clase, tengo una duda , después de añadir la modificación de setInterval para cada dirección y pulsar algún botón de dirección, ¿nunca se detiene de activar los setinterval? , por lo que entiendo ese "parar" es simplemente sumar 0 para que no se aumente la direeción, sin embargo parece que ya no puedo desactivar el setInterval , ¿esto es optimo de hacer? o en realidad si existe una forma de desactivar el setInterval, gracias

capipepo el mejor rappitendero gente

AYUDAAA ! le di a la tecla derecha, mi mokepon se fue y no volvió mas );

section id="ver-mapa">
        <h1 class="titulo">Recorre el mapa con tu Mokepon</h1>
        <canvas id="mapa"></canvas>
        <button id="mover-mascota-up" class="moverMascota" onclick="moverCapipepo('up')">Mover 🔼</button>
        <button id="mover-mascota-do" class="moverMascota" onclick="moverCapipepo('do')">Mover 🔽</button>
        <button id="mover-mascota-le" class="moverMascota" onclick="moverCapipepo('le')">Mover ◀</button>
        <button id="mover-mascota-ri" class="moverMascota" onclick="moverCapipepo('ri')">Mover ▶</button>
    </section>
function moverCapipepo(moverDireccion) {

    switch (moverDireccion) {
        case "up":
            capipepo.y -= 5
            break
        case "do":
            capipepo.y += 5
            break;
        case "le":
            capipepo.x -= 5
            break;
        case "ri":
            capipepo.x += 5
            break;
    }

    pintarPersonaje()
} 

Lo aprendido hasta ahora, es poder mover un elemento de forma continua.

Ahora el reto es hacerlo para los demás Mokepones, pero desde el Objeto como tal.

function moverDerecha(){
capipepo.velocidadX = 5

}

function moverIzquierda(){
capipepo.velocidadX = -5
}

function moverArriba(){
capipepo.velocidadY = -5
}

function moverAbajo(){
capipepo.velocidadY = 5
}

function detenerMovimiento(){
capipepo.velocidadY = 0
capipepo.velocidadX = 0
}

Nota: min 4:05 , seleccionen <button en vez de solo button

Gracias por esta clase , me la pas genial 😃 !

Que genial que explique todo desde el click a al evolución que sigue con las teclas, excelente profe !

Le cambiamos el nombre al final de la clase a “Rapipepo” 😄😄😄

Gracias por la clase. «Rapipepo» está feliz por moverse dentro del mapa ja, ja, ja.

Lo que más me gusta es que Estefany ya se va recio con los atajos para irnos despegando del cursor 🤩

Se me ha roto el codifo y no sé porqué

excelente truco estefany , gracias

document.onkeydown = (e) => {
        const keypress = e.key;
        switch (keypress) {
            case 'ArrowDown':
                moveDown();
                break;
            case 'ArrowUp':
                moveUp();
                break;
            case 'ArrowLeft':
                moveLeft();
                break;
            case 'ArrowRight':
                moveRigth();
                break;
        }
    };

Cree la funcion para moverlo con las flechas

Marcar muchas líneas a la vez :

CTRL + D

<canvas id=“mapa”></canvas>
<button onclick=“moverArriba()”>👆</button>
<button onclick=“moverIzquierda()”>👈</button>
<button onclick=“moverAbajo()”>👇</button>
<button onclick=“moverDerecha()”>👉</button>
</section>

vertical
function moverCapipepo() {
capipepo.y = capipepo.y + 5
pintarPersonaje()
}

Sin duda alguna me encantó esta clase, justo cuando empecé a mover los personajes sin poder detenerlos, en vez de frustrarme lo que me dió fué un ataque severo de risa, porque me pareció muy divertido. Posteriormente, resolví lo que fallaba y todo resultó mejor, gracias teacher

asi me quedo con una sola funcion de mover y cargando el event listener al archvo de js

<code> function moverPicachu(){
    botonesMov=document.querySelectorAll(".bMov"); // guardamos en variable todos los elementos de la clase bptpmes de movimiento
    botonesMov.forEach((boton) => {        
        boton.addEventListener("click", (e) => {                     
            if(e.target.textContent=="Arriba"){
                picachu.y-=5
                pintarMokepon()
            }
            if(e.target.textContent=="Abajo"){
                picachu.y+=5
                pintarMokepon()
            }
            if(e.target.textContent=="Izquierda"){
                picachu.x-=5
                pintarMokepon()
            }
            if(e.target.textContent=="Derecha"){
                picachu.x+=5
                pintarMokepon()
            }
        })
    } )        
    
}

![](file:///C:/Users/CRISS/Documents/CURSO%20PROGRAMACI%C3%93N%20PLATZI/MOKEP%C3%93N/index.html)

  1. tenemos dos propiedades mas de los botones onmausedown = “funcion()” y onmauseup = “funcion()”
  2. ahora vamos agregarle a la clase mokepon velocidadX y velocidadY , justo como lo haciamos en unity
  3. y en canda funcion de movimiento lo que se va a hacer es actualizar la velocidad a 5 y la funcion pintarpersonaje() ya no se va a llamar tanto
  4. y dentro de pintarpersonaje() sumaremos la posicionXY con la velocidadXY
  5. Creamos una variable llamada intervalo para controlar el tiempo que vamos a llamar una funcion
  6. decimos que intervale = setInterval( funtion, time )
  7. creamos una funcion llamada DetenerMovimiento() y esta sera llamada con el OnmouseUp en todos los botones

La parte que más me gustó de esta clase es cuando capipepo “deja la peluca” en 9:09.

Dijo: “no entiendo nada, mejor me voy” lol

Hola! a mi como siempre me gusta utilizar una sola función cuando son cosas muy parecidas, en este caso los movimientos que sólo cambia la dirección, así que utilicé 1 sola función y le pasé 2 parámetros (variables), una de X y otra de Y, así puedo usar la misma función para todo y sólo es pasarle el valor de X o Y…

function changePetVelocity(x,y){
    capipepo.xVelocity = x
    capipepo.yVelocity = y
    movePet()
}

Y los botones quedaban algo así…

<button onmousedown="changePetVelocity(0,-5)" onmouseup="changePetVelocity(0,0)">Up</button> 

Es increible la forma en que se puede interactuar con el codigo de JS el control de movimiento de un personaje. Asi que de eso viene la programacion de viejos juegos en un plano cartesiano. Interesante. Ahora, si tengo mas curiosidad de aprender mas de este.

Siempre atentos a cuado escribimos nuestro código, sobre todo al utilizar el auto completado, porque en ocasiones nos comemos palabras o letras y luego se nos parte el código.

Usamos el método onmousedown = " "para mover nuestro elemento cuando mantengamos presionado click. También usamos onmouseup = " "para detener el movimiento al soltar el clic .

Y se marchoo… Jajajaj…
recuerden Ctrl d , Para seleccionar y modificar varias líneas que tengan términos iguales.

Me parece mas interesante hacerlo con las teclas

Ok voy iniciando la clase así que no se qué pasará, pero en mi caso decidí realizar una única función la cual recibe un parámetro de dirección y con base a este se mueve la mascota.

Así quedaron los botones:

 <button onclick="moverCapipepo('derecha')">Derecha</button>
      <button onclick="moverCapipepo('izquierda')">Izquierda</button>
      <button onclick="moverCapipepo('arriba')">Arriba</button>
      <button onclick="moverCapipepo('abajo')">Abajo</button>

Y así quedó la función:

function moverCapipepo(direccion){
  if (direccion === 'derecha'){
    capipepo.x = capipepo.x + 5
    pintarPersonaje()
  } else if (direccion === 'izquierda'){
    capipepo.x = capipepo.x - 5
    pintarPersonaje()
  } else if (direccion === 'arriba'){
    capipepo.y = capipepo.y - 5
    pintarPersonaje()
  } else {
    capipepo.y = capipepo.y + 5
    pintarPersonaje()
  }
}

casi no mucho explican porque se pone cada símbolo o signo cuesta un poco comprender

👍

les reomiendo agregar onmouseout lo que hace es detectar cuando el mouse sale de el boton

y onmouseenter cuando el mouse entra en el boton

<button 
	onmouseout="detenerMovimiento()"
</button>
    

Una manera facil de acomodar los botones el display "grid"
el navegador mozilla developer, me ayuda a ver de una forma diferente las seciones

Genial clase!! Muy buenos fundamentos!

Lo había echo igual con botones pero de otra forma, ahora estoy interesado en saber como moverlo con el teclado, pero ya me doy una ideas mas o menos

CONTROL + D = seleccionar varias veces lo mismo
esto ya lo habian explicado en los comentarios en los inicios del curso. Gracias a los comentarios de los companeros se aprende mas, por favor lean los comentarios sino aprenderan desèues (como ahora)

EN VS CODE:
Shif+Alt+flechaAbajo/arriba= duplica una linea de codigo, con solo posicionar el cursor sobre la linea
Alt+Shift+A= comentar lo seleccionado
CTRL+K+C= comentar lo seleccionado
Ctrl+d: al seleccionar un elemento te selecciona elemento repetido y es posible modificarlos contemporaneamente. Se debe segir apretando ctrl+d para segir seleccionando lo mismo.
Seleccionar toda la linea de codigo , haciendo click en el numero que la identifica en la numeracion izquierda de la pantalla y para seleccionar contemporaneamente se presiona ALT y seleccionas lo que deceas.
CTRL+L: selecciona la linea de codigo donde este posado el cursor
ALT+DIRECCIONALES(arriba, abajo): mueve o intercambia la linea de codigo con solo posicionar el cursor sobre esta.

emoji en windows: tecla windows + punto

Añadi codigo para que tambien tome en cuenta las teclas awsd y AWSD ```js function sePresionoUnaTecla() { switch (event.key) { case 'ArrowRight': moverDerecha() break; case 'd': moverDerecha() break; case 'D': moverDerecha() break; case 'W': moverArriba() break; case 'ArrowUp': moverArriba() break; case 'w': moverArriba(); break; case 'A': moverIzquierda() break; case 'a': moverIzquierda() break; case 'ArrowLeft': moverIzquierda() break; case 's': moverAbajo() break; case 'ArrowDown': moverAbajo() break; case 'S': moverAbajo() break; default: detenerMovimiento() break; } } ```function sePresionoUnaTecla() { switch (event.key) { case 'ArrowRight': moverDerecha() break; case 'd': moverDerecha() break; case 'D': moverDerecha() break; case 'W': moverArriba() break; case 'ArrowUp': moverArriba() break; case 'w': moverArriba(); break; case 'A': moverIzquierda() break; case 'a': moverIzquierda() break; case 'ArrowLeft': moverIzquierda() break; case 's': moverAbajo() break; case 'ArrowDown': moverAbajo() break; case 'S': moverAbajo() break; default: detenerMovimiento() break; } }