![](https://habrastorage.org/getpro/habr/upload_files/6e2/a98/cf4/6e2a98cf41968bbad525ddcac51b0989.png)
В этом уроке мы научимся реагировать на действия мыши, такие как движения и клики, а так же добавим фоновую музыку, и музыку на действие.
![](https://habrastorage.org/getpro/habr/upload_files/97f/973/491/97f973491653b1c74109bf68289ef810.png)
Приступим к коду:
#include<SDL2/SDL.h>
#include<SDL2/SDL_image.h>
#include<SDL2/SDL_mixer.h>
int main(void)
{
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
SDL_Window* window = SDL_CreateWindow("mouse move", SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,640,480,SDL_WINDOW_SHOWN);
SDL_Surface* backgroundImage = IMG_Load("button.png") ;
SDL_Renderer* gRenderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);
Mix_OpenAudio( 44100, MIX_DEFAULT_FORMAT,2,2048);
Добавляем новую библиотеку(SDL_mixer.h), инициализируем видео и аудио, стандартно подгружаем окно(window), фон(backgroundImage) и переменную отображения (gRenderer). включаем аудио Mix_OpenAudio( частота звука, Формат музыки,количество каналов для звука, количество байт в каждом куске output sample)
Mix_Chunk *fireMusic = Mix_LoadWAV("blaster-firing.wav");
Mix_Music *music = Mix_LoadMUS("Imperial-March-Star-Wars.wav");
Подгружаем звук нажатия(fireMusic) и фоновую музыку(music).
SDL_Texture* bgTexture = SDL_CreateTextureFromSurface(gRenderer,backgroundImage);
SDL_Rect box = {0,0,300,200};
SDL_Rect mousePostion = {0,0,320,240};
SDL_Event e;
int quit = 0,x=0,y=0;
Создаем текстуру из фона, создаем прямоугольник(box), отображающий часть нужного нам фона, задаем границы для мыши(mousePosition), задаем чекер действий(e), и создаем три переменные выход(quit), и положение мыши(x,y) в данный момент.
Mix_PlayMusic(music,-1);
while(!quit)
{
while(SDL_PollEvent(&e) !=0)
{
if(e.type == SDL_QUIT) {
quit = 1;
}else if (e.type == SDL_MOUSEMOTION) {
SDL_GetMouseState(&x,&y);
if (x <320 && y<240) {
box.y = 200;
SDL_RenderCopy(gRenderer,bgTexture,&box,&mousePostion);
SDL_RenderPresent(gRenderer);
}else {
box.y = 0;
SDL_RenderCopy(gRenderer,bgTexture,&box,&mousePostion);
SDL_RenderPresent(gRenderer);
}
Запускаем музыку в любой свободный канал(Mix_PlayMusic)
Создаем два цикла , пока переменная quit равна нулю, и если есть какое нибудь действие SDL_PollEvent(&e) != 0 если есть Выход, тогда выходим из приложения, иначе если есть движение мыши SDL_MOUSEMOTION, проверяем , положение мыши не вышло из нужного нам квадрата, если не вышло, то отрисовываем одну картинку, если вышло тогда отрисовываем вторую картинку.
}else if (e.type == SDL_MOUSEBUTTONDOWN) {
Mix_PlayChannel(-1,fireMusic,0);
box.y = 400;
SDL_RenderCopy(gRenderer,bgTexture,&box,&mousePostion);
SDL_RenderPresent(gRenderer);
}else if (e.type == SDL_MOUSEBUTTONUP) {
box.y = 600;
SDL_RenderCopy(gRenderer,bgTexture,&box,&mousePostion);
SDL_RenderCopy(gRenderer,bgTexture,&box,&mousePostion);
SDL_RenderPresent(gRenderer);
Если нажата мышь(SDL_MOUSEBUTTONDOWN) тогда отрисовываем третью картинку и проигрываем звук(Mix_PlayChannel), если отжата(SDL_MOUSEBUTTONUP), тогда четвертую.
Для того чтобы изменить картинку, изменяем значение box.y
}else if (e.type == SDL_KEYDOWN) {
switch(e.key.keysym.sym)
{
case SDLK_1:
Mix_ResumeMusic();
break;
case SDLK_2:
Mix_PauseMusic();
break;
}
}
}
}
Если нажата клавиша 1 запускаем музыку (Mix_ResumeMusic()), если нажата клавиша 2 останавливаем (Mix_PauseMusic()).
SDL_DestroyWindow(window);
SDL_Quit();
}