Anuncios

Bienvenidos sean a este post, en este post nos centraremos en una de las caracteristicas que nos brinda SDL_CreateWindow.

Anuncios

Hasta ahora siempre que trabajamos con la funcion que se encarga de crear la ventana no solo definiamos su ancho y su alto, sino tambien mencionamos que el ultimo parametro es una de serie de constantes que podemos usar para definir ciertos aspectos, veamos la siguiente tabla:

ConstanteProposito
SDL_WINDOW_FULLSCREENHabilita la pantalla completa
SDL_WINDOW_OPENGLHabilita a la ventana para ser usada en un contexto de OpenGL
SDL_WINDOW_SHOWNHace visible a la ventana
SDL_WINDOW_HIDDENEsconde la ventana
SDL_WINDOW_BORDERLESSElimina los bordes de la ventana
SDL_WINDOW_RESIZABLEPermite modificar el tamaño de la ventana
SDL_WINDOW_MINIMIZEDMinimiza la ventana
SDL_WINDOW_MAXIMIZEDMaximiza la ventana
SDL_WINDOW_INPUT_GRABBEDLa ventana captura la entrada que esta en foco
SDL_WINDOW_INPUT_FOCUSLa ventana se centra en una entrada
SDL_WINDOW_MOUSE_FOCUSLa ventana se centra en el mouse
SDL_WINDOW_FOREIGNCuando la ventana no es creada con SDL
Anuncios

Como pueden ver tenemos una buena variedad de posibilidades, entre ellas tenemos la que hemos usado todo este tiempo (SDL_WINDOW_OPENGL), otras que nos pueden ser muy utiles ya sean para hacer el uso de toda la pantalla, maximizarla (que no es lo msmo), minimizarla o eliminar los bordes, pero vamos a centrarnos en el tema de habilitar la pantalla completa. Para ello, vamos a ver el codigo del proyecto del post anterior y vamos a hacer un par de modificaciones. Si no lo poseen les comparto un link para descargarlo:

Proyecto Juego

Anuncios

Este proyecto no va a funcionar directamente porque el SDL esta implementado para mi equipo. Para corregirlo, les recomiendo, primero quitar al proyecto y luego visitar este post. En este tenemos todos los pasos para repetir o modificar la implementacion de este. Una vez todo modificado y funcionando, lo primero que debemos hacer es ir a Juego.h y modificaremos este prototipo en la clase Juego:

bool iniciar(const char*, int, int, int);
Anuncios

De la siguiente manera:

bool iniciar(const char*, int, int, bool);
Anuncios

Si observan modificamos el ultimo parametro para que ahora sea de tipo bool, booleano, y nuestra siguiente modificacion sera en Juego.cpp donde cambiaremos el inicio de la definicion de la funcion iniciar:

bool Juego::iniciar(const char* titulo, int ancho, int alto, int flags)
Anuncios

De la siguiente manera:

bool Juego::iniciar(const char* titulo, int ancho, int alto, bool pantallaCompleta)
Anuncios

Con esto coincidimos al prototipo con su definicion, nuestra siguiente modificacion sera agregar el siguiente bloque antes del condicional donde verifica si se inicio SDL:

	int flags = 0;
	if (pantallaCompleta)
		flags = SDL_WINDOW_FULLSCREEN;
Anuncios

En este caso primero creamos una variable de tipo int llamada flags, recuerden que desaparecio de los argumentos de la funcion, luego tenemos un condicional donde verifica si el valor de pantallaCompleta es true. En caso de ser verdadero, le asignamos la constante SDL_WINDOW_FULLSCREEN a flags, para que la pase a la funcion SDL_CreateWindow, veamos como quedo nuestra nueva funcion:

bool Juego::iniciar(const char* titulo, int ancho, int alto, bool pantallaCompleta) {
    int flags = 0;
    if (pantallaCompleta)
        flags = SDL_WINDOW_FULLSCREEN;

    if (SDL_Init(SDL_INIT_EVENTS) != 0) {
        OutputDebugStringA("SDL_Init iniciado\n");
        m_pVentana = SDL_CreateWindow(titulo, ancho, alto, flags);

        if (m_pVentana != 0) {
            OutputDebugStringA("Ventana Creada\n");
            m_pRenderer = SDL_CreateRenderer(m_pVentana, NULL);
            if (m_pRenderer != 0) {
                OutputDebugStringA("Render Exitoso\n");
                SDL_SetRenderDrawColor(m_pRenderer, 255, 255, 255, 255);
            }
            else {
                OutputDebugStringA("Render Fallido\n");
                return false;
            }
        }
        else {
            OutputDebugStringA("Ventana no Creada\n");
            return false;
        }
    }
    else {
        OutputDebugStringA("Inicio Fallido\n");
        return false;
    }

    OutputDebugStringA("Inicio Exitoso\n");
    m_bCorriendo = true;
    return true;
}
Anuncios

Pero esto no termina aca, vamos a realizar una modificacion mas en Juego.cpp, para ello buscaremos a la funcion renderizar:

void Juego::renderizar() {
    SDL_RenderClear(m_pRenderer);
    SDL_RenderPresent(m_pRenderer);
}
Anuncios

Y la vamos a modificar de la siguiente manera:

void Juego::renderizar() {
    const char* mensaje = "Hola Mundo!";
    const float scale = 4.0f;
    int w = 0, h = 0;
    float x, y;

    SDL_GetRenderOutputSize(m_pRenderer, &w, &h);
    SDL_SetRenderScale(m_pRenderer, scale, scale);
    x=((w / scale) - SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * SDL_strlen(mensaje)) / 2;
    y=((h / scale) - SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE) / 2;

    SDL_SetRenderDrawColor(m_pRenderer, 0, 0, 0, 255);
    SDL_RenderClear(m_pRenderer);
    SDL_SetRenderDrawColor(m_pRenderer, 255, 255, 255, 255);
    SDL_RenderDebugText(m_pRenderer, x, y, mensaje);
    SDL_RenderPresent(m_pRenderer);
}
Anuncios

Esta rutina la vimos en este post, donde las primeras lineas seran para almacenar la ubicacion de un texto y el texto a mostrar en la seccion de renderizado. La segunda parte se encarga de obtener la informacion, y calcular lo necesario para almacenarlo en las variables anteriores y por ultimo, hacemos todo el renderizado para cambiar la ventana a un fondo negro y mostrar el mensaje de color blanco. Ahora solo nos resta ir al main.cpp donde modificaremos la linea encargada de crear la ventana. Veamos la original:

g_juego->iniciar("Juego", 320, 240, SDL_WINDOW_OPENGL);
Anuncios

Esta linea la modificaremos de la siguiente forma:

g_juego->iniciar("Juego", 320, 240, true);
Anuncios

Sacamos el valor de cero y le pasamos el true para que realice la ejecucion de la pantalla completa, con todas estas modificaciones podemos pasar a compilarlo y verificar su funcionamiento como se ve en el siguiente video

Anuncios

Como trabajo con una PC Virtual al pasar el juego a Pantalla completa y como definimos que el tamaño del juego es de 320 x 240, ajusta la pantalla de la virtual a ese tamaño, esa es la diferencia entre usar la pantalla completa y la opcion de maximizar. Dado que maximizar se hubiera ajustado a la resolucion del escritorio.

Anuncios

En resumen, hoy hemos visto como trabajar con las constantes que nos permiten establecer otras conductas para nuestras ventanas, hemos visto algunas de las que tenemos disponibles, hemos explicado las mismas, hemos modificado nuestro proyecto anterior con minimos cambios para poder implementarlo, tambien lo hemos probado y hemos podido verificar porque es mas practico hacerlo asi y no usar la opcion maximizar. Espero les haya sido de utilidad y les dejo un link a GitHub donde estan los codigos creados hoy:

A Pantalla Completa / 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