2016-12-25 3 views
-1

скажем, у меня есть вектор, состоящий из указателей класса Enemy:вектор, состоящий из указателей класса

vector<Enemy*> enemyVect; 

Этот вектор затем заполняется с указателями Enemy:

for (int i = 0; i < numbOfEnemys; i++) { //add all enemies to vector with random EnemeyType 
     int random = rand() % enemyTypesVect.size(); 
     Enemy* e1 = enemyTypesVect[random]; 
     enemyVect.push_back(e1);  
    } 

После этого все Врагам присваивается случайная координата XY:

for (int i1 = 0; i1 < enemyVect.size(); i1++) { //spread enemys out on X-axis 
     int randomx = rand() % 720; 
     newRect = enemyVect[i1]->getRect(); 
     newRect.x = randomx; 
     enemyVect[i1]->setRect(newRect); 
    } 

    for (int i2 = 0; i2 < enemyVect.size(); i2++) { //spread enemys out on Y-axis 
     int random = rand() % 1000; 
     newRect = enemyVect[i2]->getRect(); 
     //newRect.y = random; 
     newRect.y = random - 1000; 
     enemyVect[i2]->setRect(newRect); 
    } 

На этом этапе все враги имеют свой уникальный p osition. В то время как программа работает, я пробегаем по этому вектору, и я стараюсь, чтобы заставить их двигаться в Y-ось:

for (int i = 0; i < enemyVect.size(); i++) { 

      newRect = enemyVect[i]->getRect(); 
      newRect.y += enemyVect[i]->getSpeed(); 
      enemyVect[i]->setRect(newRect); 
      enemyVect[i]->draw(); 
} 

Здесь возникает проблема, так как все Враги получает значение в том же положение , Таким образом, это происходит, как будто есть только один Враг, но на самом деле их 30, просто уложенных поверх каждого другого. Я не слишком хорошо знаком с C++, но я предполагаю, что это связано со всеми указателями, которые смотрят на ту же самую копию, которая установлена? Стоит отметить, что врагTypesVect состоит только из 1 типа врага на данный момент, если я добавлю еще один, то рисуются 2 врага. Что мне делать, чтобы исправить это?

Спасибо заранее и дайте мне знать, если я должен включать в себя больше коды :)

Функции черчения():

void Enemy::draw() { 
    SDL_RenderCopy(sys.getRen(), getTexture(), NULL, &getRect()); 
} 
+0

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Подумайте, сколько объектов вы создали для каждого типа врага. – Mat

+1

Вероятно, это не связано с вашей проблемой, но вам лучше использовать 'std :: vector > enemyVect;' или 'std :: vector >' вместо необработанных указателей. –

ответ

0

Ваша задача в этой части:

int random = rand() % enemyTypesVect.size(); 
Enemy* e1 = enemyTypesVect[random]; 
enemyVect.push_back(e1);  

У вас есть массив вражеских типов, которые в вашем случае всего 1 объект. Вы сохраняете указатель на этот объект (e1), а затем добавляете его в свой вектор.

Проблема в том, что e1 указывает на одну и ту же копию каждый раз. Функция, которая устанавливает координаты x/y, фактически устанавливает ее для одного и того же объекта на каждой итерации.

Вы можете проверить это, напечатав указатель назначенного e1:

printf("e1 is %p\n", e1); 

Вы увидите, что он имеет такое же значение для каждого врага.

+0

Да, теперь я это понимаю. Итак, как мне добавить врагов к врагуВент без их указателей на одну и ту же копию? –

+0

Вы должны использовать либо фабрику (https://en.wikipedia.org/wiki/Factory_method_pattern), либо шаблон дизайна [prototype] (https://en.wikipedia.org/wiki/Prototype_pattern). Вектор типов врагов может быть заменен объектом 'factory', который будет создавать новый объект вместо вас, а не возвращать существующий. –