Как бы написать цикл для проверки каждого пикселя на столкновение? - PullRequest
1 голос
/ 03 января 2012

Я пытаюсь написать цикл for в своем вражеском классе, чтобы проверить столкновение с игроком ... Что я пытаюсь сделать конкретно, это проверить каждый пиксель в каждой строке, поэтому он должен проверить все взатем перейдите к следующему ряду.У меня проблемы с выяснением, как написать это, чтобы он проверял каждую строку ... Как бы я это сделал?Вот что я написал ... Я почти уверен, что мне нужен еще один цикл for для перехода по каждой строке, но я не уверен, как это реализовать.

bool Enemy::checkCollision()
{
    for(i = 0; i < postion.w; i++)
    {
        if(position.x + i == player.position.x)
        {
            return true;
        }
        else if(position.y + i == player.position.y)
        {
            return true;
        }
        else
        { 
            return false; 
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 03 января 2012

Ваааа к сложному. Имейте бесплатную функцию, которая занимает две позиции и два поля столкновения, и просто используйте простую проверку (краткая версия внизу, эта объясняет, как она работает):

// y ^
//   |
//   +----> x
struct SDL_Rect{
    unsigned x, y;
    int w, h;
};

bool collides(SDL_Rect const& o1, SDL_Rect const& o2){
  /* y_max -> +------------+
   *          |            |
   *          |            |
   *          +------------+ <- x_max
   *    |-----^------|
   *     y_min, x_min        
   */
  unsigned o1_x_min = o1.x, o1_x_max = o1.x + o1.w;
  unsigned o2_x_min = o2.x, o2_x_max = o2.x + o2.w;

  /* Collision on X axis: o1_x_max > o2_x_min && o1_x_min < o2_x_max
   * o1_x_min -> +-----------+ <- o1_x_max
   *     o2_x_min -> +-------------+ <- o2_x_max
   *
   * No collision 1: o1_x_max < o2_x_min
   * o1_x_min -> +-----------+ <- o1_x_max
   *                  o2_x_min -> +-------------+ <- o2_x_max
   *
   * No collision 2: o1_x_min > o2_x_max
   *                  o1_x_min -> +-------------+ <- o1_x_max
   * o2_x_min -> +-----------+ <- o2_x_max
   */
  if(o1_x_max >= o2_x_min && o1_x_min <= o2_x_max)
  { // collision on X, check Y
    /* Collision on Y axis: o1_y_max > o2_y_min && o1_y_min < o2_y_max
     * o1_y_max -> +
     *             |  + <- o2_y_max
     *             |  |
     * o1_y_min -> +  |
     *                + <- o2_y_min
     * No collision: o1_y_min > o2_y_max
     * o1_y_max -> +
     *             | 
     *             | 
     * o1_y_min -> +
     *                + <- o2_y_max
     *                |
     *                |
     *                + <- o2_y_min
     */
    unsigned o1_y_min = o1.y, o1_y_max = o1.y + o1.h;
    unsigned o2_y_min = o2.y, o2_y_max = o2.y + o2.h;
    return o1_y_max >= o2_y_min && o1_y_min <= o2_y_max;
  }
  return false;
}

Краткая версия collides:

bool collides(SDL_Rect const& o1, SDL_Rect const& o2){
  unsigned o1_x_min = o1.x, o1_x_max = o1.x + o1.w;
  unsigned o2_x_min = o2.x, o2_x_max = o2.x + o2.w;

  if(o1_x_max >= o2_x_min && o1_x_min <= o2_x_max)
  { // collision on X, check Y
    unsigned o1_y_min = o1.y, o1_y_max = o1.y + o1.h;
    unsigned o2_y_min = o2.y, o2_y_max = o2.y + o2.h;
    return o1_y_max >= o2_y_min && o1_y_min <= o2_y_max;
  }
  return false;
}
0 голосов
/ 03 января 2012

SDL_Collide сделает обнаружение столкновения с идеальным пикселем.

...