SDL 2 Lecciones: Lección 2 - Principal no de goma

Hola a todos! Esta es mi segunda lección de SDL 2. Todavía obtengo información de aquí .

Bienvenidos a la lección.

Principal no de goma


En la última lección, organicé todo en la función Main () , pero para programas grandes esto no es bueno. Por eso apareció la oportunidad de escribir funciones. Ahora lo usaremos.

Comenzaremos a escribir código conectando un SDL y declarando varias variables globales.

#include <SDL2/SDL.h> const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Surface *scr = NULL; SDL_Surface *smile = NULL; 

Aquí, fuera de la función Main () , declaramos objetos de ventana ( win ), superficies de pantalla ( scr ) y la imagen de este emoticon ( smile ).

Escribamos una función para inicializar el SDL, cree una ventana y una superficie para dibujar. Se ve así:

Init ()
 int init() { if (SDL_Init(SDL_INIT_VIDEO) != 0) { return 1; } win = SDL_CreateWindow("Main  ", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { return 1; } scr = SDL_GetWindowSurface(win); return 0; } 

Este código le resultará familiar de la lección anterior. Aquí inicializamos el sistema de video, creamos una ventana con el nombre “Main is not rubber”, con coordenadas indefinidas y con las dimensiones previamente establecidas, y también obtuvimos la superficie de la ventana, guardándola en scr . En caso de error, esta función devolverá 1, de lo contrario 0.

Ahora puede escribir una función para descargar los archivos multimedia necesarios. Aquí esta:

Carga ()
 int load() { smile = SDL_LoadBMP("smile.bmp"); if (smile == NULL) { return 1; } return 0; } 

Esta función es extremadamente simple. Cargamos la imagen .bmp usando la función SDL_LoadBMP . Esta función toma la ruta al archivo de imagen (completo o relativo) y devuelve un objeto de la clase SDL_Surface . También debe verificar la corrección de la ejecución: si hubo problemas con la descarga (archivo no encontrado, archivo roto), la función SDL_LoadBMP devolverá NULL .

También escribimos un programa para completar la solicitud.

Salir ()
 void quit() { SDL_FreeSurface(smile); smile = NULL; SDL_DestroyWindow(win); SDL_Quit(); } 

Aquí apareció una nueva función SDL_FreeSurface , que simplemente limpia la superficie. Después de configurar la sonrisa variable a NULL . Todas las demás funciones se discutieron en la lección anterior.

Ahí es donde termina la escritura de las funciones y podemos pasar a Main () .

Principal ()
 int main (int argc, char ** args) { if (init() == 1) { return 1; } if (load() == 1) { return 1; } SDL_BlitSurface(smile, NULL, scr, NULL); SDL_UpdateWindowSurface(win); SDL_Delay(2000); quit(); return 0; }; 

Aquí llamamos primero a la función init () , escrita anteriormente, luego a la función load () , que también escribimos antes. A continuación, muestre smile in scr , utilizando la función SDL_BlitSurface . Esta función toma una superficie para dibujar, un rectángulo que se debe cortar de esta superficie (esto es necesario para la animación), si no se necesita cortar nada, se transmite NULL , la superficie en la que se dibuja el rectángulo, cuyas coordenadas se usan para dibujar. Si las coordenadas son cero, pasamos NULL .

Es hora de hablar sobre las coordenadas. SDL utiliza un sistema de coordenadas diferente, no al que todos están acostumbrados. Aquí el punto con coordenadas (0, 0) está en la esquina superior izquierda. Es importante tener esto en cuenta al mostrar para evitar situaciones desagradables.

Bueno, eso fue divertido, continuamos. A continuación, actualizamos la ventana con una función ya familiar, hacemos que el programa se congele durante 2 segundos, llame a la función quit () que escribimos y finalice el programa. En la salida, tenemos un programa que muestra una sonrisa genial durante 2 segundos. Todo el código se ve así:

 #include <SDL2/SDL.h> const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Surface *scr = NULL; SDL_Surface *smile = NULL; int init() { if (SDL_Init(SDL_INIT_VIDEO) != 0) { return 1; } win = SDL_CreateWindow("Main  ", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { return 1; } scr = SDL_GetWindowSurface(win); return 0; } int load() { smile = SDL_LoadBMP("smile.bmp"); if (smile == NULL) { return 1; } return 0; } void quit() { SDL_FreeSurface(smile); SDL_DestroyWindow(win); SDL_Quit(); } int main (int argc, char ** args) { if (init() == 1) { return 1; } if (load() == 1) { return 1; } SDL_BlitSurface(smile, NULL, scr, NULL); SDL_UpdateWindowSurface(win); SDL_Delay(2000); quit(); return 0; }; 

Espero que todo esté claro. ¡Buena suerte a todos!

<< Lección anterior || Próxima lección >>

Source: https://habr.com/ru/post/454414/


All Articles