Anuncios

Bienvenidos sean a este post, hoy veremos al ultimo dispositivo para controlar los movimientos.

Anuncios

Hasta ahora creamos las funciones necesarias para poder controlar tanto a un joystick como a un mouse, pero hoy nos centraremos en el dispositivo «gamming» de PC por excelencia, como es el teclado.

Anuncios

Su ventaja principal, al igual que el mouse, es que no deberemos iniciarlo. Pero a diferencia del mouse no debemos detectar ningun tipo de movimiento sino simplemente el estado de las teclas, como los botones, y en este caso no necesitaremos ningun array para guardar los estados porque SDL tiene una funcion interna para esto. Donde la tecla presionada tendra el valor de 1 y cuando la soltamos sera de 0, veamos la funcion:

SDL_GetKeyboardState(int* numeroTeclas);
Anuncios

El parametro de esta funcion devolvera la cantidad de teclas que tengamos disponibles, en realidad la longitud del array keystate. Para poder aplicarla vamos a usar el proyecto que venimos trabajando de posts anteriores. Sino lo poseen les dejo un link para descargarlo:

Proyecto Juego

Anuncios

Descarguen el archivo y extraigan el contenido en el PC. Lo unico que deben hacer es revincular a SDL y SDL_Image. Para ello, les recomiendo este post donde comento como hacerlo para SDL y este otro post donde hago lo mismo para SDL_Image. Una vez que este todo funcionando correctamente, podemos continuar. Para comenzar crearemos una nueva variable en la parte privada en ManejarEntradas.h:

const bool* m_estadoTecla = SDL_GetKeyboardState(0);
Anuncios

Esta sera la variable donde guardaremos el array de las teclas, keystate, y como es constante debemos definirla con la funcion SDL_GetKeyboardState. Nuestro siguiente paso sera agregar el siguiente prototipo en la parte publica de la clase:

bool teclaPresionada(SDL_Scancode);
Anuncios

Este prototipo sera para ver cuando se presiono una tecla, nuestro siguiente paso sera definirlo en ManejarEntradas.cpp, este sera el bloque que se encargara de esto:

bool ManejarEntradas::teclaPresionada(SDL_Scancode tecla) {
	if (m_estadoTecla) {
		if (m_estadoTecla[tecla] == 1)
			return true;
		else
			return false;
	}
	return false;
}
Anuncios

Esta funcion utiliza SDL_Scancode para saber el codigo de la tecla en base al valor a que pasamos como argumento. En el bloque tenemos un condicional donde verifica que m_estadoTecla es verdadero, y en caso de ser asi tenemos otro condicional donde verificamos si la tecla que pasamos como argumento tiene un estado igual a 1. Esto significa que esta siendo presionada y devolvemos un true, en caso contrario no esta siendo presionada y devolvemos un false. Si no se cumple la primera condicion devolvemos un false. Lo siguiente sera ir a Jugador.cpp y agregaremos una serie de condicionales dentro de la funcion manejaEntrada:

	if (Controles::instanciar()->teclaPresionada(SDL_SCANCODE_RIGHT)) {
		m_velocidad.setX(2);
	}
	if (Controles::instanciar()->teclaPresionada(SDL_SCANCODE_LEFT)) {
		m_velocidad.setX(-2);
	}
	if (Controles::instanciar()->teclaPresionada(SDL_SCANCODE_DOWN)) {
		m_velocidad.setY(2);
	}
	if (Controles::instanciar()->teclaPresionada(SDL_SCANCODE_UP)) {
		m_velocidad.setY(-2);
	}
Anuncios

Estos condicionales trabajan todos de la misma forma, esperan que la llamada a teclaPresionada devuelve un true, y para esta ocasion tenemos los valores para las cuatro flechas. Dependiendo de cual apretemos incrementara o decrementara el valor de los ejes X e Y, en el caso de las flechas izquierda (LEFT) o derecha (RIGHT) para el eje X mediante setX y para el caso de las flechas arriba (UP) y abajo (DOWN) afecta al eje Y mediante setY. Si quieren saber el resto de los valores que acepta SDL_Scancode les recomiendo visitar la siguiente pagina:

https://wiki.libsdl.org/SDL_ScancodeAndKeycode

Anuncios

La ultima modificacion que debemos hacer es eliminar o comentar las dos lineas que usabamos para mover el sprite mediante el mouse visto en el post anterior:

	Vector2D* v = ElmanejaEntradas::instanciar()->getPosicionMouse();
	m_velocidad = (*v - m_posicion);
Anuncios

Les recomiendo comentarlas pero si se desean quitarlas no hay ningun problema, en este caso debemos eliminarlas porque nos genera problemas a la hora de mover a nuestro sprite por la pantalla, con todas estas modificaciones realizadas compilemos y veamos que sucede mediante el siguiente video

Con esto ya tenemos todos los dispositivos habilitados en nuestro proyecto para poder controlar los movimientos de nuestro sprite, en este caso la clase Jugador, y solo nos resta integrar todo esto de manera genial pero eso lo veremos en el proximo post.

Anuncios

En resumen, hoy hemos visto como trabaja SDL con las teclas del teclado, cuack, hemos visto que es el mas facil de todos los dispositivos ya que no necesita detectar sobre que eje estamos trabajando, vimos como SDL ya tiene una funcion interna para esto y que a su vez tiene ya valores asignados para poder trabajar con los mismos. Espero les haya sido de utilidad y les dejo un link a GitHub donde estan los codigos creados hoy:

Movimientos y teclados / GitHub

Les dejo algunas de mis redes sociales para seguirme o recibir una notificacion cada vez que subo un nuevo post:

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50