Воскресенье, 23.07.2017, 16:14
Приветствую Вас Guest | RSS
Главная страница | Статьи | Регистрация | Вход
Меню сайта

Случайный рисунок

Категории каталога
Туториалы по маппингу (HL2) [68]
Туториалы по маппингу для Half-Life
Туториалы по текстурированию (HL2) [10]
Туторы по текстурированию для Half-Life
Туториалы по моделированию (HL2) [9]
Туторы по моделированию для Half-Life
Туториалы по программированию (HL2) [53]
Туторы по прагроммированию для Half-life
Другие туториалы (HL1 и HL2) [4]
Туторы которые не вошли в другие категории
Half-Life 2 Beta [1]
Статьи о npc и weapon в бете Half-Life 2, а так же мануалы и FAQ.
Туториалы по маппингу (HL1) [14]
Туторы по маппингу для Half-Life 1
Туториалы по текстурированию (HL1) [1]
Туторы по текстурированию для Half-Life 1
Туториалы по моделированию (HL1) [1]
Туторы по моделированию для Half-Life 1
Туториалы по программированию (HL1) [30]
Туторы по программированию для Half-Life 1

Наш опрос
Очистить ли форум от всех сообщений и начать всё с чистого листа?
Всего ответов: 536

Начало » Статьи » Туториалы по программированию (HL2)

Двойное нажатие

Вам хотелось, когда нибудь сделать удары ногой, рукой и использовать их в виде комбо, например по нажатию 2 раза какой-то кнопки за определённое время вызвать ту или иную функцию? Вот и решил я наваять какой, никакой код :D

Приступаем:
 
// m_iState: 0 = Нет нажатия
// 1 = Нажато 1 раз
// 2 = Нажато дважды
// 3 = Готово к использованию

struct TapData_s 
{
 // Конструктор
 TapData_s()
 { 
 m_nKey = 0; m_iState = 0; 
 m_flPressTime1 = gpGlobals->curtime; 
 m_flPressTime2 = gpGlobals->curtime+1; 
 m_flDelayBetweenPressesMin = 0;
 m_flDelayBetweenPressesMax = 0; 
 }
public:
 int m_iState;
 int m_nKey;

 float m_flPressTime1;
 float m_flPressTime2;
 float m_flDelayBetweenPressesMin;
 float m_flDelayBetweenPressesMax;

};

class CTapHandler
{
public:
 CTapHandler(){ m_vTapDataList.RemoveAll(); }

 void AddKeyToTrackList( const int &nKey, const float &flTimeToPressTwiceMin, const float &flTimeToPressTwiceMax )
 {
 bool noMatches = true; // Lolmen : Проверка на наличие такой клавиши в списке
 for ( int i = m_vTapDataList.Count() - 1; i >= 0; i-- )
 {
 TapData_s *pCurTap = m_vTapDataList.Element( i );
 if ( pCurTap && pCurTap->m_nKey == nKey )
 {
 noMatches = false;
 }
 }
 if ( noMatches != false )
 {
 TapData_s *pNewTap = new TapData_s;
 if ( pNewTap )
 {
 pNewTap->m_nKey = nKey;
 pNewTap->m_flDelayBetweenPressesMin = flTimeToPressTwiceMin;
 pNewTap->m_flDelayBetweenPressesMax = flTimeToPressTwiceMax;
 m_vTapDataList.AddToTail( pNewTap );
 }
 }
 }
 void HandleKeysTaps( const CBasePlayer *pPlayer )
 {
 for ( int i = m_vTapDataList.Count() - 1; i >= 0; i-- )
 {
 TapData_s *pCurTap = m_vTapDataList.Element( i );
 if ( pCurTap && pPlayer )
 {

 switch( pCurTap->m_iState )
 {
 case 0:
 { // Lolmen : Первое нажатие игроком
 if ( pPlayer->m_afButtonPressed & pCurTap->m_nKey )
 {
 pCurTap->m_iState = 1;
 pCurTap->m_flPressTime1 = gpGlobals->curtime;
 }
 }
 break;
 case 1:
 { // Lolmen : Второе нажатие игроком
 if ( pPlayer->m_afButtonPressed & pCurTap->m_nKey )
 {
 pCurTap->m_iState = 2;
 pCurTap->m_flPressTime2 = gpGlobals->curtime;
 }
 }
 break;
 case 2:
 {
 float dt = pCurTap->m_flPressTime2 - pCurTap->m_flPressTime1;
 // Lolmen : Больше наше dt или равно минимальному времени нажатия, 
 // или же, меньше, а может и равно максимальному времени?
 if ( dt >= pCurTap->m_flDelayBetweenPressesMin && dt <= pCurTap->m_flDelayBetweenPressesMax )
 {
 pCurTap->m_iState = 3; 
 }
 else
 { // Lolmen : Если не прокатило сбрасываем статус на начало
 pCurTap->m_iState = 1;
 pCurTap->m_flPressTime1 = gpGlobals->curtime;
 }
 }
 break;
 default:
 { // Lolmen : На следующем кадре опять сбрасываем статус, если достигнут результ
 if ( pCurTap->m_iState >= 3 )
 {
 pCurTap->m_iState = 1;
 pCurTap->m_flPressTime1 = gpGlobals->curtime;
 }
 }
 break;
 }
 }
 }
 }
 void Update( void )
 { // Lolmen : Покадровый обновитель
 CBasePlayer *pPlayer = UTIL_GetLocalPlayer();
 if ( pPlayer != NULL )
 {
 HandleKeysTaps( pPlayer );
 }
 }
 // Эта функция вернёт true только 1 раз за кадр
 bool KeyPressedTwice( const int &nKey )
 {
 bool ret = false;

 for ( int i = m_vTapDataList.Count() - 1; i >= 0; i-- )
 {
 TapData_s *pCurTap = m_vTapDataList.Element( i );

 if ( pCurTap )
 {
 if ( pCurTap->m_nKey == nKey && pCurTap->m_iState >= 3 )
 {
 ret = true;
 break;
 }
 }
 else
 {
 continue;
 }
 }
 return ret;
 }
private:
 CUtlVector< TapData_s* > m_vTapDataList;

};
Это был класс для определения функциональности, как его применять? 
// Lolmen : Создадим где-то главный экземпляр:
CTapHandler gpTapHandler;
// NOTE: в других файлах используем ссылку на главный экз "extern CTapHandler gpTapHandler;" 

Теперь давайте попробуем использовать наш экземпляр например в оружии SMG1

В конструктор добавим такое :

 

CWeaponSMG1::CWeaponSMG1() { // какойто инициализирующий код тут // Lolmen : наш отлавливатель gpTapHandler.AddKeyToTrackList( IN_FORWARD, 0.1f, 0.3f ); gpTapHandler.AddKeyToTrackList( IN_SPEED, 0.015f, 0.5f ); // Lolmen : Примечаение : ( Кнопка, минимальное время, максимальное время ) за которое мона нажать 2жды }

 

Так, мы определили, за какими кнопками нужно установить наблюдение, теперь будем это использовать :

 

CWeaponSMG1::ItemPostFrame( ) { // Lolmen: Разместим где-то покадровую обновлялку gpTapHandler.Update(); // Какой-то SMG'шный код тут : // Lolmen: Теперь смотрим были-ли нажаты 2жды след кнопки : if ( gpTapHandler.KeyPressedTwice( IN_FORWARD ) ) { // Вызываем какой-то метот тут: } if ( gpTapHandler.KeyPressedTwice( IN_SPEED ) ) { // Делаем что-то еще } }

 

P.S Если будут проблемы, обращаемся в форум.



Источник: http://wiki.hl2.ru/index.php?title=%D0%94%D0%B2%D0%BE%D0%B9%D0%BD%D0%BE%D0%B5_%D0%BD%D0%B0%D0%B6%D0%B0%D1%82%D0%B8%D0%B5
Категория: Туториалы по программированию (HL2) | Добавил: DetLeR (20.07.2007) | Автор: Lolmen
Просмотров: 1390 | Рейтинг: 5.0 |

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Кто в Онлайн

Друзья сайта

Баннеры

  Сайт CrazyArts   Black   Сообщество сайтов о Half-Life   Самый   Только   Все   hl2 top 100     Rambler's Top100  

игры
игры

  Каталог сайтов Планета Топ 100 - Planet Top 100       ТОП ЛУЧШИХ ИГРОВЫХ САЙТОВ           Detroit Team Site :: Моды от Detroit Team, видео, новости.   Naruto-kun[Звезда Наруто]  


The idea of dising: Homie7