Дополнение к уроку 3. Совершенствуем спрайтовый движок.

      Комментарии к записи Дополнение к уроку 3. Совершенствуем спрайтовый движок. отключены

Главная Форумы Программирование Программирование на С++ Библиотека SDL Дополнение к уроку 3. Совершенствуем спрайтовый движок.

Помечено: , ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 5 мес., 3 нед. назад.

  • Автор
    Сообщения
  • #3143
    Урок 3СодержаниеУрок 4

    В третьем уроке мы рассмотрели достаточно эффективный механизм для работы с анимированными спрайтами. Теперь вы можете очень просто написать небольшую сцену, не задумываясь о многих, достаточно низкоуровневых вещах. Нужно всего лишь подготовить соответствующие изображения заднего фона и спрайтов… Стоп… А теперь представьте каково это рисовать кадры одного и того же спрайта в разных картинках… А если у вас много спрайтов, состоящих из множества кадров? Нужно создать кучу папок и описывать каждый кадр в файле info. В большинстве случаев, все параметры кадров идентичны для одного спрайта (имеется ввиду пауза и цвет прозрачности). А нам приходится прописывать их по-много раз. А что если хранить все кадры спрайта в одном файле? Например вот таки образом:

    sspr

    На этой картинки два кадра «мигающего» барашка. Мигает он, например, первые пять секунд после начала игры. То есть, мы храним все кадры в одном файле. Немного поразмыслив о преимуществах такого подхода, я немного переписал предыдущий движок, чтобы работать с такими изображениями. В этом дополнении к уроку я не буду описывать весь код спрайтовых классов. Изменения коснулись только класса CSpriteBase и очень немного затронули CSprite (буквально убрал пару строчек). Я немного опишу работу механизма загрузки кадров спрайта. В предлагаемых вам исходниках демо-программы, работающей с новой версией спрайтов, имена переменных и функций в обоих классах изменены, но вы поймете что к чему.
    И так, рассмотрим как работает новый загрузчик. Мы загружаем BMP-файл, который содержит несколько кадров спрайта. Мы знаем его размеры, в частности высоту. И мы знаем количество кадров (посылаются в качестве аргумента в init()). В результате высота спрайта будет равна высоте картинки со всеми кадрами поделить на количество кадров.

      SDL_Surface *temp;
      if((temp=SDL_LoadBMP(data->bmpFile))==NULL) return -1;
      
      W = temp->w;
      H = temp->h/svsNumFrames;

    А дальше мы копируем куски исходного изображения, а именно вырезаем каждый кадр и заносим его в массив кадров. Мы копировали участки одной картинки на другую в прошлых уроках. Но тут возникает проблема: мы копируем каждый кадр с исходного изображения на временную поверхность SDL_Surface, но по умолчанию ее размеры будут скорее всего равны размерам экрана… Нужно сначала создать поверхность заданных размеров, а потом копировать на нее. Позже с помощью SDL_DisplayFormat() помещаем каждый кадр в массив кадров. Вот кусок кода из документации по SDL который создает новую поверхность.

      SDL_Surface *surface;
      Uint32 rmask, gmask, bmask, amask;
      #if SDL_BYTEORDER == SDL_BIG_ENDIAN
        rmask = 0xff000000;
        gmask = 0x00ff0000;
        bmask = 0x0000ff00;
        amask = 0x000000ff;
      #else
        rmask = 0x000000ff;
        gmask = 0x0000ff00;
        bmask = 0x00ff0000;
        amask = 0xff000000;
      #endif
      surface = SDL_CreateRGBSurface(SDL_HWSURFACE|SDL_SRCCOLORKEY, Width, Height, 32,
                                       rmask, gmask, bmask, amask);
      if(surface == NULL) {
          fprintf(stderr, "CreateRGBSurface failed: %s\n", SDL_GetError());
          return -1;
      }

    Вот так, вкратце, работает загрузчик. Теперь немного об инициализации. Мы в качестве аргумента посылаем в функцию init() указатель на специальную структуру svsInit:

    struct svsInit
    {
      char* bmpFile;
      int numFrames;
      int pause;
      int r;
      int g;
      int b;
    };

    Так удобнее задать сразу несколько аргументов функции. Мы задаем имя файла с кадрами, количество кадров и RGB прозрачного цвета (или по другому цветовой ключ — Color Key). В демо-программе вы можете посмотреть, как осуществляется инициализация классов. Там нет ничего сложного. А в остальном программа не изменилась с третьего урока.

    Загрузите исходники этого дополнения к уроку и внимательно их изучите. Все права на изображения из примера принадлежат компании PhenomediaAG.

    Урок 3СодержаниеУрок 4

Для ответа в этой теме необходимо авторизоваться.