Как сравнить значения из вектора структур

206
09 декабря 2021, 18:30

Всем еще раз здрасте). Сейчас попробую более дитально описать проблему. Изучаю с++ порядка 4-5 месяцем. И в основном это как и у всех начинающих ввод вывод в консоле не сложных арефметический действий. Для того что бы хоть как-то увидеть то чему я научился решил попробывать реализовать свои знание с некой графикой. По гуглил "Графические библиотека с++", выбрав SFML и думаю что все могу начал писать типа игру. Она не будет никуда выыносится, так чисто для себя, что бы понять что я вообще могу.

Есть файл Map.h который считывает файл tmx (xml разметка). В нем есть група обьектов которые хранят значаения x, y, width, height.

<objectgroup id="10" name="Слой объектов 1">
  <object id="1" x="14" y="7" width="110" height="148"/>
  <object id="2" x="318" y="178" width="64" height="67" visible="0"/>
  <object id="3" x="415" y="176" width="68" height="70" visible="0"/>
  <object id="4" x="510" y="177" width="66" height="73" visible="0"/>
 </objectgroup>
 <objectgroup id="11" name="Слой объектов 2">
  <object id="5" x="0" y="353" width="131" height="223"/>
  <object id="6" x="2" y="311" width="156" height="37"/>
 </objectgroup>

Я сделал структура в которой есть эти 4 параметра.

    struct Object
{
    vector <float> obj_x;                    //Начало обьекта по Х
    vector <float> obj_y;                    //Начало обьекта по У
    vector <float> obj_width;                //Длина обьекта по Х
    vector <float> obj_height;               //Длина обьекта по У
};

Структуру засунул в вектор.

vector <Object> vector_object;

И получается у меня что каждый новый тег

<object id="6" x="2" y="311" width="156" height="37"/>

записывается в структуру, а структура записывается в вектор. В этом примере у меня получается 6 обьектов. При тесте что и как записалось все хорошо, тоесть:

for (int i = 0; i < vector_object.size(); i++)
{
    for (int q = 0; q < vector_object[i].obj_x.size(); q++)
    {
        cout << "X = " << vector_object[i].obj_x[q] << endl;
        cout << "Y = " << vector_object[i].obj_y[q] << endl;
        cout << "Width = " << vector_object[i].obj_width[q] << endl;
        cout << "Height = " << vector_object[i].obj_height[q] << endl;
    }
    cout << "\n______________\n";
}

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

for (int i = 0; i < vector_object.size(); i++)
    {
        for (int q = 0; q < vector_object[i].obj_x.size(); q++)
        {
            if (user_x > vector_object[i].obj_x[q] && user_x < vector_object[i].obj_width[q])
             {
                 move = false;
             }
        }
    }

Но тут проблемма что я не могу сравнить значение из вектора[i] обьекта [q] с координатой игрока. Якобы нет перегруженного оператора сравнения. Вот тут мне и нехватает знаний... Подскажите, куда копать, и что читать)

Так же как вариант можно сделать динамический масив, под групу координат отдельный масив, к примеру:

float *x = new float[size];
float *y = new float[size];
float *width = new float[size];
float *height = new float[size];

но помойму, вектором удобнее пользоватся

Answer 1
  1. Зачем вам в структуре векторы? Из того, что вы написали, структура должна объявляться так

    struct Object {
        float obj_x;                    //Начало обьекта по Х
        float obj_y;                    //Начало обьекта по У
        float obj_width;                //Длина обьекта по Х
        float obj_height;               //Длина обьекта по У
    };
    

    а еще лучше так

    struct Object {
        int obj_x;                    //Начало обьекта по Х
        int obj_y;                    //Начало обьекта по У
        int obj_width;                //Длина обьекта по Х
        int obj_height;               //Длина обьекта по У
    };
    
  2. При сравнивании координат нужно проверять условие

    obj_x < user_x < obj_x + obj_width
    

    а не

    obj_x < user_x < obj_width
    
    for (int i = 0; i < vector_object.size(); i++) {
      Object obj = vector_object[i];
      if (
        user_x > obj.obj_x && user_x < obj.obj_x + obj.obj_width &&
        user_y > obj.obj_y && user_y < obj.obj_y + obj.obj_height
      ) {
        move = false;
        break;  // дальше искать бессмысленно
      }
    }
    
  3. Этой фразы

    Но тут проблемма что я не могу сравнить значение из вектора[i] обьекта [q] с координатой игрока. Якобы нет перегруженного оператора сравнения

    я не понял вообще. Будет лучше если вы приведете точный текст ошибки

Answer 2

Всем спасибо. Ошибкой была моя не внимательность. При попытке сравнивать было vector_object[i].x а надо vector_object[i].x[i]. В первом случаем он пытался сравнить координату персонажа типа float с ВЕКТОРОМ, а нужно было именно со значением из вектора.

READ ALSO
Вычисление суммы ряда

Вычисление суммы ряда

мне нужно сделать код так, чтобы получился пример под цифрой 2 но код я смог сделать только так, что у меня получается пример под цифрой 1 Как...

239
Сортировка массива объектов по string полю

Сортировка массива объектов по string полю

Есть такой класс администратора

70
Как найти длину гипотезузы?

Как найти длину гипотезузы?

найти значения длины гипотенузы в прямоугольном треугольнике с целыми сторонами, если 1 из катетов (H) Н-простое числоH=(2<=H<=10^4)

147