Собственно в своей игре хочу сделать чтобы после поднятия аптечки (item_healthkit) здоровье прибавлялось не сразу а постепенно, допустим в течении 10-15сек. Я думал надо копать в func_healthcharger, но там просто делается проверка на то, держит ли игрок use. В общих чертах представляю что надо делать в цикле, но не будет ли он замораживать все другие процессы? Честно скажу что как то не сталкивался с многопоточностью и реализацией трэдов в С++, поэтому затруднение.
KiQ
Это надо делать в коде игрока (player.cpp). При поднятии аптечки просто запоминается некое значение m_flIdealHealth, а потом в PlayerPreThink пишется чтото типа:
Спасибо за помощь, правда я пошел несколько иным путем, но отталкиваясь от этого. В общем сначала я изменил player.cpp - добавил функции int getCurrentHealth( void ) и void getGradualyHealth( void ). Добавил три переменных - int m_flIdealHealth, int m_idealHealthBuff и BOOL isHealthCharge. В функции PreThink прописал условие if(isHealthCharge) {
getGradualyHealth();
SetThink( getGradualyHealth );
pev->nextthink = gpGlobals->time + 0.5;
}
Вот функция getGradualyHealth():
void CBasePlayer::getGradualyHealth() {
if (pev->health < 100 && pev->health < m_idealHealthBuff + m_flIdealHealth) {
pev->health += 1;
} else {
isHealthCharge = false;
}
}
Теперь я перешел к работе в item_healthkit. В функции поднятия после if(pPlayer->TakeHealth ....
Я вписал следущее:
pPlayer->m_idealHealthBuff = pPlayer->getCurrentHealth();
pPlayer->m_flIdealHealth = gSkillData.healthkitCapacity;
pPlayer->isHealthCharge = true;
Собственно это и запускает механизм постепенного восстановления здоровья. В общем я все скомпилировал, проблем не возникло. Все работает, видно что здоровье прибавляется по единице за каждый проход функции. Но осталась одна проблема - это происходит очень быстро. Хотелось бы все же около 10-15 секунд, а происходит все примерно за секунду. Изменение значения в pev->nextthink = gpGlobals->time + 0.5 не дало результатов, и я подозреваю что использую его неправильно. Собственно подскажите пожалуйста что можно сделать, заранее благодарен
Дядя Миша а, то то я думал, причем тут floatы Худ я так понял будет обновлятся каждые десять проходов. А все что связано с SetThink можно убрать? Хм, насчет cl_cmdrate я так думаю надо его понизить, но это плохо скажется на сетевой игре, как я знаю.
Дядя Миша в том то и дело, что там будет также кооператив и дм. Если в первый как правило играют по локалке, то со вторым все сложнее. Ну а потом, а что если игрок захочет помнять его через консоль? нехорошо получится...
Ок спасибо завтра опробую все варианты. Еще у меня одна непонятка возникла, из за которой я и добавил функцию getCurrentHealth. Я сначала написал просто pPlayer->health, после чего компил естественно ругнулся. В функции getCurrentHealth я всего лишь возвращаю значение pev->health. Но ведь насколько я знаю (возможно неправильно), pev это типа аналога this для энтить. Почему тогда он находит health, а прямое обращение к классу не находит? Да, в player.h я health не нашел, тогда откуда ее берет pev для меня непонятка.