Отслеживаем мышь в SDL (двигаем спрайт)

Приступим к созданию приложения.
Прежде всего установите (если до сих пор этого не сделали) SDL.

В Fedora это делается так:

yum install SDL-devel

Приступим.

Подключим заголовочные файлы и оприделим параметры окна в константах.

#include <SDL/SDL.h>

const int WINDOW_WIDTH = 640;
const int WINDOW_HEIGHT = 480;
const char* WINDOW_TITLE = "SDL HOWTO";

Теперь начнём формировать main:

int main(int argc, char **argv){

Инициализируем библиотеку и указываем программе параметры необходимого окна:

SDL_Init( SDL_INIT_VIDEO );
SDL_Surface* screen = SDL_SetVideoMode( WINDOW_WIDTH,
WINDOW_HEIGHT, 0,
SDL_HWSURFACE | SDL_DOUBLEBUF );
SDL_WM_SetCaption( WINDOW_TITLE, 0 );

Загружаем спрайт и указываем прозрачный цвет для него:

SDL_Surface* bitmap = SDL_LoadBMP("sprite.bmp");
SDL_SetColorKey( bitmap, SDL_SRCCOLORKEY, SDL_MapRGB(bitmap->format,0, 0, 0) );

Задаём часть рисунка, которая будет отрисована на экране:

SDL_Rect source;
source.x = 0;
source.y = 0;
source.w = 120;
source.h = 120;

И начинаем формировать цикл ожидания событий:

SDL_Event event;
bool run = true;
while(run) {
    while ( SDL_PollEvent(&event) ) {
        switch (event.type) {

Укажем что будем улавливать движения мыши:

case SDL_MOUSEMOTION:

При каждом движении будем передвигать спрайт на новую позицию, но перед этим очистим экран от "старых зарисовок":

SDL_Rect fill;
fill.x = 0;
fill.y = 0;
fill.w = WINDOW_WIDTH;
fill.h = WINDOW_HEIGHT;
SDL_FillRect(screen,&fill,SDL_MapRGB(bitmap->format,0, 0, 0) );

Рисуем спрайт на новом месте:

SDL_Rect destination;
destination.x = event.motion.x - 60;  //отнимаем половину ширины картинки от позиции мыши
destination.y = event.motion.y - 60;  //высоты
destination.w = 120;
destination.h = 120;                      
SDL_BlitSurface(bitmap, &source, screen, &destination);
SDL_Flip(screen);

Выводим в консоль сообщение о текущем положении указателя:

printf("Передвинулся с %d,%d в (%d,%d)\n", event.motion.xrel, event.motion.yrel,event.motion.x, event.motion.y);

Указываем что будем выходить из цыкла при нажатии кнопки закрытия окна:

case SDL_QUIT:

       run = false;

Закрываем оставшиеся скобки чистим экран и выходим из программы:

        }
    }
    }
    SDL_FreeSurface(bitmap);
    SDL_Quit();
    return 0;
}

Теперь компилируем. В линуксах так:

g++ mouse.cpp -o mouse -lSDL

При передвижении мыши спрайт должен двигаться вместе с указателем:

Пример качаем тут
ps справедливости ради должен отметить, что "передвинулся с" означает не "передвинулся с позиции:", а передвинулся с "ходом" этаким dx и dy..

Просмотров:   2238

Комментарии

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Введи эти символы. Ато роботы одолели!