Всем привет и добро пожаловать на пятый урок по SDL 2, в котором мы разберем текстуры, упростив работу компьютеру. Все уроки на английском языке вы можете найти здесь.
В SDL второй версии появиласть очень хорошая возможность создания текстур и их рендеринга. Аппаратный рендеринг значительно быстрее, чем отрисовка поверхностей в окне.
У текстур есть собственный тип данных — SDL_Texture. При работе с текстурами нам потребуется рендер для отрисовки. Сейчас мы всё это объявим.
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <iostream>
using namespace std;
int SCREEN_WIDTH = 640;
int SCREEN_HEIGHT = 480;
SDL_Window *win = NULL;
SDL_Renderer *ren = NULL;
SDL_Texture *flower = NULL;
bool ok = true;
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
cout << "Can't init: " << SDL_GetError() << endl;
ok = false;
}
win = SDL_CreateWindow("Текстуры", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (win == NULL) {
cout << "Can't create window: " << SDL_GetError() << endl;
ok = false;
}
ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (ren == NULL) {
cout << "Can't create renderer: " << SDL_GetError() << endl;
ok = false;
}
SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF);
int flags = IMG_INIT_PNG;
if (!(IMG_Init(flags) & flags)) {
cout << "Can't init image: " << IMG_GetError() << endl;
ok = false;
}
return ok;
}
bool load() {
bool ok = true;
SDL_Surface * temp_surf = NULL;
temp_surf = IMG_Load("flower.png");
if (temp_surf == NULL) {
cout << "Can't load image: " << IMG_GetError() << endl;
ok = false;
}
flower = SDL_CreateTextureFromSurface(ren, temp_surf);
if (flower == NULL) {
cout << "Can't create texture from surface: " << SDL_GetError() << endl;
ok = false;
}
void quit() {
SDL_DestroyWindow(win);
win = NULL;
SDL_DestroyRenderer(ren);
ren = NULL;
SDL_DestroyTexture(flower);
flower = NULL;
SDL_Quit();
IMG_Quit();
}
int main (int argc, char ** argv) {
if (!init()) {
quit();
return 1;
}
if (!load()) {
quit();
return 1;
}
bool run = true;
SDL_Event e;
while (run) {
while(SDL_PollEvent(&e) != 0) {
if (e.type == SDL_QUIT) {
run = false;
}
}
SDL_RenderClear(ren);
SDL_RenderCopy(ren, flower, NULL, NULL);
SDL_RenderPresent(ren);
}
quit();
return 0;
}
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <iostream>
using namespace std;
int SCREEN_WIDTH = 640;
int SCREEN_HEIGHT = 480;
SDL_Window *win = NULL;
SDL_Renderer *ren = NULL;
SDL_Texture *flower = NULL;
bool init() {
bool ok = true;
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
cout << "Can't init: " << SDL_GetError() << endl;
ok = false;
}
win = SDL_CreateWindow("Текстуры", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (win == NULL) {
cout << "Can't create window: " << SDL_GetError() << endl;
ok = false;
}
ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (ren == NULL) {
cout << "Can't create renderer: " << SDL_GetError() << endl;
ok = false;
}
SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF);
int flags = IMG_INIT_PNG;
if (!(IMG_Init(flags) & flags)) {
cout << "Can't init image: " << IMG_GetError() << endl;
ok = false;
}
return ok;
}
bool load() {
bool ok = true;
SDL_Surface * temp_surf = NULL;
temp_surf = IMG_Load("flower.png");
if (temp_surf == NULL) {
cout << "Can't load image: " << IMG_GetError() << endl;
ok = false;
}
flower = SDL_CreateTextureFromSurface(ren, temp_surf);
if (flower == NULL) {
cout << "Can't create texture from surface: " << SDL_GetError() << endl;
ok = false;
}
SDL_FreeSurface(temp_surf);
return ok;
}
void quit() {
SDL_DestroyWindow(win);
win = NULL;
SDL_DestroyRenderer(ren);
ren = NULL;
SDL_DestroyTexture(flower);
flower = NULL;
SDL_Quit();
IMG_Quit();
}
int main (int argc, char ** argv) {
if (!init()) {
quit();
return 1;
}
if (!load()) {
quit();
return 1;
}
bool run = true;
SDL_Event e;
while (run) {
while(SDL_PollEvent(&e) != 0) {
if (e.type == SDL_QUIT) {
run = false;
}
}
SDL_RenderClear(ren);
SDL_RenderCopy(ren, flower, NULL, NULL);
SDL_RenderPresent(ren);
}
quit();
return 0;
}
К сожалению, не доступен сервер mySQL