![]() |
Показать все 14 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Подскажите с аптечкой (https://hlfx.ru/forum/showthread.php?threadid=2549)
Подскажите с аптечкой
Собственно в своей игре хочу сделать чтобы после поднятия аптечки (item_healthkit) здоровье прибавлялось не сразу а постепенно, допустим в течении 10-15сек. Я думал надо копать в func_healthcharger, но там просто делается проверка на то, держит ли игрок use. В общих чертах представляю что надо делать в цикле, но не будет ли он замораживать все другие процессы? Честно скажу что как то не сталкивался с многопоточностью и реализацией трэдов в С++, поэтому затруднение.
__________________
-Brain is dead-
KiQ
Это надо делать в коде игрока (player.cpp). При поднятии аптечки просто запоминается некое значение m_flIdealHealth, а потом в PlayerPreThink пишется чтото типа:
if (pev->health < m_flIdealHealth) |
pev->health += min(m_flIdealHealth - pev->health, gpGlobals->frametime * 0.5f); |
__________________
Спасибо за помощь, правда я пошел несколько иным путем, но отталкиваясь от этого. В общем сначала я изменил 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 не дало результатов, и я подозреваю что использую его неправильно. Собственно подскажите пожалуйста что можно сделать, заранее благодарен
__________________
-Brain is dead-
KiQ самое простое - прибавлять не по еденичке, а по 0.1 процента
Впрочем скорость прибавления будет зависеть от cl_cmdrate.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша а, то то я думал, причем тут floatы Худ я так понял будет обновлятся каждые десять проходов. А все что связано с SetThink можно убрать? Хм, насчет cl_cmdrate я так думаю надо его понизить, но это плохо скажется на сетевой игре, как я знаю.
__________________
-Brain is dead-
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша в том то и дело, что там будет также кооператив и дм. Если в первый как правило играют по локалке, то со вторым все сложнее. Ну а потом, а что если игрок захочет помнять его через консоль? нехорошо получится...
__________________
-Brain is dead-
KiQ ну тада вводи еще одну переменную.
и делай вот так по такому принципу
1 | if (m_flSuitUpdate <= gpGlobals->time) |
2 | { |
3 | if (m_flSuitUpdate == 0) |
4 | // play queue is empty, don't delay too long before playback |
5 | m_flSuitUpdate = gpGlobals->time + SUITFIRSTUPDATETIME; |
6 | else |
7 | m_flSuitUpdate = gpGlobals->time + SUITUPDATETIME; |
8 | } |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Ок спасибо завтра опробую все варианты. Еще у меня одна непонятка возникла, из за которой я и добавил функцию getCurrentHealth. Я сначала написал просто pPlayer->health, после чего компил естественно ругнулся. В функции getCurrentHealth я всего лишь возвращаю значение pev->health. Но ведь насколько я знаю (возможно неправильно), pev это типа аналога this для энтить. Почему тогда он находит health, а прямое обращение к классу не находит?
Да, в player.h я health не нашел, тогда откуда ее берет pev для меня непонятка.
__________________
-Brain is dead-
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша я не туплю, я повышаю уровень квалификации в общем завтра потестю аптечку, потом отпишусь, если траффик останется. Спасибо за помощь
__________________
-Brain is dead-
Congratulation!
Допилил таки аптечку Все отлично работает, спасибо за советы! Прикладываю свой рассказ-тутор как же сделать плавное восстановление здоровья
__________________
-Brain is dead-
KiQ не надо нам в аттаче. Запили нормальную тему в ветке туторов.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша дак там в html вроде все грамотно оформлено. Впрочем сейчас запостю в туторах.
Добавлено сегодня в 22:08:
Запостил
__________________
-Brain is dead-
Временная зона GMT. Текущее время 18:44. | Показать все 14 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024