Среда, 04 Декабря 2024, 09:41

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-Ответ (C++)
KornivalДата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1
The Witcher
Сейчас нет на сайте
Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
IzaronДата: Суббота, 17 Августа 2013, 12:15 | Сообщение # 1061
Rammstein forever
Сейчас нет на сайте
Код
bool ObjectSetSprite(short objID, short sprID)  
{  
  if(objID < nom && sprID < Nspr)  
  {  
   Object[objID]->sprite_index = new hgeSprite(*Sprite[sprID]);  
   return true;
  }
  return false;  
}
GameMixДата: Суббота, 17 Августа 2013, 13:04 | Сообщение # 1062
старожил
Сейчас нет на сайте
Нохчи, дело в том, что я работаю не в консоли (в ней-то можно через cout <<), и не знаю ещё, как выводить значения указателей куда-либо.
Izaron, спасибо! Видимо, когда пытался записать так же, забыл что-то дописать smile


Steel Standoff - 2D аркада.
Мои статьи
НохчиДата: Суббота, 17 Августа 2013, 13:36 | Сообщение # 1063
заслуженный участник
Сейчас нет на сайте
Цитата (GameMix)
дело в том, что я работаю не в консоли (в ней-то можно через cout <<), и не знаю ещё, как выводить значения указателей куда-либо.

Код

if(spr == 0)
MessageBox(NULL,"ERROR", "Invalid pointer", MB_OK);

Izaron правильный код дал, но вылетать при удалении все-равно не должно было.


Многие вопросы по Windows отпадут, если посмотреть тут
GameMixДата: Суббота, 17 Августа 2013, 14:35 | Сообщение # 1064
старожил
Сейчас нет на сайте
Нохчи, сделал проверку. Указатель получил адрес - сообщение не появилось. И каким-то магическим образом теперь указатель успешно удаляется и обнуляется confused

Steel Standoff - 2D аркада.
Мои статьи
GameMixДата: Суббота, 17 Августа 2013, 14:42 | Сообщение # 1065
старожил
Сейчас нет на сайте
Для сравнения, старый код:
Код
bool ObjectSetSprite(short objID, short sprID)  
{  
if (objID < nom && sprID < Nspr)  
   {  
   hgeSprite *_spr = new hgeSprite(*Sprite[sprID]);  
   Object[objID]->sprite_index = _spr;  
   delete _spr; // эта строчка даёт сбой  
   _spr = 0;  
   return true;  
   }  
else return false;  
}

Новый код:
Код
bool ObjectSetSprite(short objID, short sprID)
{
if (objID < nom && sprID < Nspr)
  {
  hgeSprite *spr = new hgeSprite(*Sprite[sprID]);
  Object[objID]->sprite_index = spr;
  delete spr;
  spr = NULL;
  return true;
  }
else return false;
}

Бред какой-то...


Steel Standoff - 2D аркада.
Мои статьи
НохчиДата: Суббота, 17 Августа 2013, 14:56 | Сообщение # 1066
заслуженный участник
Сейчас нет на сайте
Цитата (GameMix)
 delete spr;

Тебе вообще не нужно здесь освобождать память. Т. к. после этого указатель Object[objID]->sprite_index становится невалидным.


Многие вопросы по Windows отпадут, если посмотреть тут
GameMixДата: Суббота, 17 Августа 2013, 15:22 | Сообщение # 1067
старожил
Сейчас нет на сайте
Нохчи, учту. Кстати, я поторопился - новый код тоже приводит к вылету программы.

Steel Standoff - 2D аркада.
Мои статьи
goldsphereДата: Среда, 09 Октября 2013, 13:08 | Сообщение # 1068
заслуженный участник
Сейчас нет на сайте


Этот код для пуль из scroll shooter. Но он не работает. При этом элементы удаляются через один(я пробовал на тестовых примерах). С вектором ещё более не понятней. В чём ошибка, и как мне сделать нормальную реализацию стрельбы?
ArchidoДата: Четверг, 10 Октября 2013, 08:51 | Сообщение # 1069
Сэнсэй
Сейчас нет на сайте
Цитата goldsphere ()
Этот код для пуль из scroll shooter. Но он не работает. При этом элементы удаляются через один(я пробовал на тестовых примерах). С вектором ещё более не понятней. В чём ошибка, и как мне сделать нормальную реализацию стрельбы?

Для начала стоит подробнее почитать про вектор. Если ты делаешь vector.erase(), то элемент на который указывает итератор удаляется и все, что находится выше него сдвигается на позицию ниже + текущий итератор становится невалиден. Поэтому этод метод возращает итератор на следующий элемент, следовательно после него не нужно делать Iterator++ , т.к. тогда ты будешь скакать через одного.

А попытка разыменовывания vector.end() - это вообще что-то с чем-то. end в векторе является "пустым" элементом, там ничего ценного нет smile , он нужен только для определения остановки во время итераций. Последний элемент, как не сложно догадаться, лежит здесь: (--vector.end())


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
goldsphereДата: Четверг, 10 Октября 2013, 13:43 | Сообщение # 1070
заслуженный участник
Сейчас нет на сайте
Цитата Archido ()
следовательно после него не нужно делать Iterator++ , т.к. тогда ты будешь скакать через одного.

тут вот какая фишка. Если не так, то у меня будет обрабатываться один и тот же элемент пока старый не удалится. То есть он должен пройти по всему вектору и если надо удалить.

Добавлено (10.10.2013, 13:43)
---------------------------------------------

Цитата Archido ()
Последний элемент, как не сложно догадаться, лежит здесь: (--vector.end())

То есть правильно так (--b.end())->Create(mouse, p); ?


FinderX - Android Аркада
ArchidoДата: Четверг, 10 Октября 2013, 13:50 | Сообщение # 1071
Сэнсэй
Сейчас нет на сайте
Цитата goldsphere ()
тут вот какая фишка. Если не так, то у меня будет обрабатываться один и тот же элемент пока старый не удалится. То есть он должен пройти по всему вектору и если надо удалить.

Так ты после "vector.erase" делай "continue" и будет счастье.

Цитата goldsphere ()
То есть правильно так (--b.end())->Create(mouse, p); ?

Можно и так, но правильнее обращаться к отдельному элементу все таки так: b[b.size() - 1].Create(...)


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
warzesДата: Пятница, 11 Октября 2013, 09:40 | Сообщение # 1072
участник
Сейчас нет на сайте
Цитата goldsphere ()
То есть правильно так (--b.end())->Create(mouse, p); ?

не красиво, лучше
b.back()->Create(mouse, p);
back() возвращает последний элемент (forward() - первый элемент)


Мой блог
Вики DirectX
goldsphereДата: Пятница, 11 Октября 2013, 10:01 | Сообщение # 1073
заслуженный участник
Сейчас нет на сайте
Archido, warzes, спасибо, заработало)

FinderX - Android Аркада
ArchidoДата: Пятница, 11 Октября 2013, 10:42 | Сообщение # 1074
Сэнсэй
Сейчас нет на сайте
О, точно, про back() я совсем забыл smile

Цитата warzes ()
back() возвращает последний элемент (forward() - первый элемент)

А вот первый возвращает вообще-то front() smile


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Пятница, 11 Октября 2013, 10:50
warzesДата: Пятница, 11 Октября 2013, 11:02 | Сообщение # 1075
участник
Сейчас нет на сайте
а блин, наверно:)

Мой блог
Вики DirectX
GameMixДата: Среда, 23 Октября 2013, 12:30 | Сообщение # 1076
старожил
Сейчас нет на сайте
Всем привет. Поведайте, пожалуйста, что нужно подключать в Dev-C++, чтобы работала функция ShellExecute()? Библиотеку shell32.lib подключал - не помогло.

Steel Standoff - 2D аркада.
Мои статьи
ArchidoДата: Среда, 23 Октября 2013, 15:09 | Сообщение # 1077
Сэнсэй
Сейчас нет на сайте
GameMix
"Shellapi.h" ?


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
GameMixДата: Четверг, 24 Октября 2013, 11:33 | Сообщение # 1078
старожил
Сейчас нет на сайте
Archido, спасибо большое smile

Steel Standoff - 2D аркада.
Мои статьи
goldsphereДата: Четверг, 24 Октября 2013, 14:07 | Сообщение # 1079
заслуженный участник
Сейчас нет на сайте
Так...ещё один глупый вопрос от меня. Есть код из моего "скролл шутера" Оставил самое главное.

Проблема в следующем. Есть система повышения сложности, при которой, при определённом кол-ве очков увеличивается количество вражин проклятых и их скорость, но не в этом суть, когда их становится много (от 4 и >), то иногда снаряды пролетают сквозь них(чем их больше тем чаще), при этом с пули так с 3-4 он всё таки попадёт в него. В принципе, я понимаю что это может быть из-за того что при обработке столкновений он может не успеть проверить кого-то(с данным кодом). И логично было бы сделать проверку в цикле(тот, что закоменчен), но с ним вылетает ошибка vector iterator not derefencable. Вроде это значит, что не возможно разыменовать итератор вектора. Помогите найти ошибку?) . За goto только не бейте.

e - vector<Enemy>
b- vector<Bullet>


FinderX - Android Аркада

Сообщение отредактировал goldsphere - Пятница, 25 Октября 2013, 07:51
MR_BorgДата: Четверг, 24 Октября 2013, 21:01 | Сообщение # 1080
участник
Сейчас нет на сайте
goldsphere,
Ну как я понял
Во первых, переменная
Код
enemy_i++;
как минимум должна быть после
Код
  if(Player::Score == e.size())
т.к я понял она отвечает за число врагов, что невсегда может происходить.
Во вторых лучьше переделать систему проверки поврежнений, а конкретно
Код
if(it->isCollision(e[enemy_i]))
что за функция? Так же лучьше избавиться от goto т.к в дальнейшем могут быть проблемы.
Ну и в третих непонял кто с кем сталкивается в
Код
*for(int i = 0;i < e.size();++i)//столкновение с врагом (вылетает ошибка i)

Зачем еще раз? И где goto loop2;?


Изучаю C++ попутно пишу игру.
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг