Нохчи, дело в том, что я работаю не в консоли (в ней-то можно через cout <<), и не знаю ещё, как выводить значения указателей куда-либо. Izaron, спасибо! Видимо, когда пытался записать так же, забыл что-то дописать Steel Standoff - 2D аркада. Мои статьи
Нохчи, сделал проверку. Указатель получил адрес - сообщение не появилось. И каким-то магическим образом теперь указатель успешно удаляется и обнуляется Steel Standoff - 2D аркада. Мои статьи
Тебе вообще не нужно здесь освобождать память. Т. к. после этого указатель Object[objID]->sprite_index становится невалидным. Многие вопросы по Windows отпадут, если посмотреть тут
Этот код для пуль из scroll shooter. Но он не работает. При этом элементы удаляются через один(я пробовал на тестовых примерах). С вектором ещё более не понятней. В чём ошибка, и как мне сделать нормальную реализацию стрельбы?
Этот код для пуль из scroll shooter. Но он не работает. При этом элементы удаляются через один(я пробовал на тестовых примерах). С вектором ещё более не понятней. В чём ошибка, и как мне сделать нормальную реализацию стрельбы?
Для начала стоит подробнее почитать про вектор. Если ты делаешь vector.erase(), то элемент на который указывает итератор удаляется и все, что находится выше него сдвигается на позицию ниже + текущий итератор становится невалиден. Поэтому этод метод возращает итератор на следующий элемент, следовательно после него не нужно делать Iterator++ , т.к. тогда ты будешь скакать через одного.
А попытка разыменовывания vector.end() - это вообще что-то с чем-то. end в векторе является "пустым" элементом, там ничего ценного нет , он нужен только для определения остановки во время итераций. Последний элемент, как не сложно догадаться, лежит здесь: (--vector.end()) C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
следовательно после него не нужно делать Iterator++ , т.к. тогда ты будешь скакать через одного.
тут вот какая фишка. Если не так, то у меня будет обрабатываться один и тот же элемент пока старый не удалится. То есть он должен пройти по всему вектору и если надо удалить.
тут вот какая фишка. Если не так, то у меня будет обрабатываться один и тот же элемент пока старый не удалится. То есть он должен пройти по всему вектору и если надо удалить.
Так ты после "vector.erase" делай "continue" и будет счастье.
Цитатаgoldsphere ()
То есть правильно так (--b.end())->Create(mouse, p); ?
Можно и так, но правильнее обращаться к отдельному элементу все таки так: b[b.size() - 1].Create(...) C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
back() возвращает последний элемент (forward() - первый элемент)
А вот первый возвращает вообще-то front() C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Пятница, 11 Октября 2013, 10:50
Всем привет. Поведайте, пожалуйста, что нужно подключать в Dev-C++, чтобы работала функция ShellExecute()? Библиотеку shell32.lib подключал - не помогло. Steel Standoff - 2D аркада. Мои статьи
if(enemy_i < e.size()) //столкновение с врагом.(если их много пролетает мимо) { loop1: if(it->isCollision(e[enemy_i])) { e[enemy_i].Spawn(res); it->Destroy(); it = b.erase(it); Player::Score++; continue; } }else { enemy_i = 0; goto loop1; } /*for(int i = 0;i < e.size();++i)//столкновение с врагом (вылетает ошибка vector interator not dereferencable) { loop1: if(it->isCollision(e[i])) { e[i].Spawn(res); it->Destroy(); e.size(); it = b.erase(it); Player::Score++; goto loop2; } }*/ it++; } if(!mouse.get_keycode(mouse_left)) click = false;
}
Проблема в следующем. Есть система повышения сложности, при которой, при определённом кол-ве очков увеличивается количество вражин проклятых и их скорость, но не в этом суть, когда их становится много (от 4 и >), то иногда снаряды пролетают сквозь них(чем их больше тем чаще), при этом с пули так с 3-4 он всё таки попадёт в него. В принципе, я понимаю что это может быть из-за того что при обработке столкновений он может не успеть проверить кого-то(с данным кодом). И логично было бы сделать проверку в цикле(тот, что закоменчен), но с ним вылетает ошибка vector iterator not derefencable. Вроде это значит, что не возможно разыменовать итератор вектора. Помогите найти ошибку?) . За goto только не бейте.