Могу ли я сравнить 2 SDL_Surface (являются ли они одинаковыми или нет) - PullRequest
0 голосов
/ 22 января 2019

При создании игры с SDL2 в c мне нужно сравнить 2 SDL_Surface, чтобы проверить условие выигрыша, но я не смог найти способ сделать это

1 Ответ

0 голосов
/ 22 января 2019

Кажется, вам интересно сравнить два SDL_Surfaces, так что вот как вы это делаете.Возможно, есть лучший способ решить вашу конкретную проблему, но в любом случае:

В SDL Wiki , SDL_Surface есть заинтересованные участники format, w, h, pitch, pixels.

  • format представляет информацию о кодировании пикселей
    • format->format - это конкретная константа перечисления, задающая заданную кодировку
  • w представляет количество пикселей встрока пикселей на поверхности
  • h представляет количество строк пикселей на поверхности
  • pitch представляет длину байта строки
  • pixelsэто массив со всеми данными пикселей

Если вы хотите сравнить два SDL_Surfaces, вам нужно сравнить пиксели друг с другом.Но сначала мы должны убедиться, что кодировка пикселя и размеры совпадают:

int SDL_Surfaces_comparable(SDL_Surface *s1, SDL_Surface *s2) {
  return (s1->format.format == s2->format.format && s1->w == s2->w && s1->h == s2->h);
}

Если SDL_Surfaces_comparable оценивается как true, мы можем проверить, равны ли две поверхности, сравнивая байты полей pixels поbyte.

int SDL_Surfaces_equal(SDL_Surface *s1, SDL_Surface *s2) {
  if (!SDL_Surfaces_comparable(s1, s2) {
    return 0;
  }
  // the # of bytes we want to check is bytes_per_pixel * pixels_per_row * rows
  int len = s1->format->BytesPerPixel * s1->pitch * s1->h;
  for (int i = 0; i < len; i++) {
    // check if any two pixel bytes are unequal
    if (*(uint8_t *)(s1->pixels + i) != *(uint8_t *)(s2->pixels + i))
      break;
  }
  // return true if we finished our loop without finding non-matching data
  return i == len;
}

Предполагается, что данные пикселей сериализуются как байты без какого-либо дополнения или что заполнение обнуляется.Я не смог найти структуру SDLPixel, поэтому я предполагаю, что это стандартный способ сравнения пикселей.Я нашел эту ссылку , которая, кажется, подтверждает мой подход.

...