Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Делаем примитивное удержание курсора в окне Warcraft 3

Anna | 24.06.2014 | нет комментариев
Приветствую тебя, читатель. У меня есть хобби — это ветхий добродушный Warcraft 3. На прогре теснее был цикл статей, посвященный этой восхитительной игре. Хочу поделиться с комьюнити одной утилитой, сгодившейся мне при проведении стримов. Всех заинтересовавшихся умоляю пройти под кат.

Вступление

Все началось с того, что в один из выходных на фоне непрекращающегося ремонта я решил посмотреть стрим по Warcraft III. Площадок на данный момент довольно, но мои предпочтения относятся к сайтуwww.goodgame.ru (не реклама). Был разочарован, что ничего увлекательного на тот момент не транслировалось. И тогда появилась мысль — отчего бы не сделать свой стрим с блэкджэком и т.д.

Сопутствующее ПО

Для проведения трансляции, помимо каждого прочего, понадобится приложение для захвата контента. На данный момент дозволено выделить два из них: xsplit и openbroadcaster. Добросовестно скажу, первым не пользовался. В бесплатной версии доступен базовый функционал. Но для скачивания базовой версии придется пройти непременную регистрацию (не то что бы это было задачей, но…). Ко второму варианту склонила лицензия GPL и соответственно доступность начального кода. На openbroadcaster я и остановился.

Сложности

С установкой и настройкой OBS задач не появилось. Но запущенная игра никак не хотела захватываться в рекомендованном режиме Game capture (возможно это связано с применением ветхой версии directx при разработке игры). Поигравшись с другими режимами захвата, удалось обнаружить два, которые обеспечивали нужное поведение — Monitor capture и Window capture.
1-й довольно крепко аффектит перформанс. Осязается во время игры. Но это был рабочий вариант, что именуется «из коробки».
2-й вариант приводил к дискомфорту в процессе игры — курсор непрерывно выходил за границы окна. В всеобщем, было безусловно неиграбельно.

Решение

Был выбран 2-й вариант и принято решение написать утилиту для устранения описанного выше дискомфорта.
Первоначально Warcraft III запускается в полноэкраном режиме.
Для запуска в оконном режиме нужно применять ключ “-window” в команде запуска приложения, это как раз дозволит исполнить завладение в режиме Windows capture.

Для удержания курсора в рамках клиентской области окна была написана первая версия утилиты. Стержневой цикл ее работы приведен ниже:

/* polling version */
void Controller::RunPollingLoop()
{		
	while (true)
	{
		HWND activeWindow		= GetForegroundWindow();
		HWND requiredWindow		= FindRequiredWindow(m_className, m_winTitle, 5);

		if (requiredWindow == NULL)
			throw std::runtime_error("Required window not found");

		m_fullScreen.Init(requiredWindow);
		m_clipHelper.Init(requiredWindow);

		if (activeWindow == requiredWindow)
		{
			if (m_clipHelper.IsClipped() || !CursorInClientArea(requiredWindow))
			{
				Sleep(g_SleepTimeOut);
				continue;
			}

			if (m_fullScreen.Enter()) 
			{	
				DEBUG_TRACE("EnterFullscreen success"); 
				m_clipHelper.Clip();
				DEBUG_TRACE("Clip");
			}
			else
			{	DEBUG_TRACE("EnterFullscreen failed"); }
		}
		else
		{
			if (m_clipHelper.IsClipped())
			{
				if (m_fullScreen.Leave())
				{ DEBUG_TRACE("LeaveFullscreen success"); }
				else
				{ DEBUG_TRACE("LeaveFullscreen failed"); }

				m_clipHelper.UnClip();
				DEBUG_TRACE("UnClip");
			}

			Sleep(g_SleepTimeOut);
		}
	}
}

Тут применяется вспомогательный класс ClipHelper для управления процессом удержания курсора и класс FullScreen для управления процессом перехода в полноэкранный режим и поправления из него. Сам цикл реализует алгорифм поллинга энергичного окна с таймаутом в 500 мс. Данный момент мне не понравился сразу, но для движения дальше требовалось проверить всю доктрину, а потом заняться оптимизацией.

В процессе применения утилиты сразу появились следующие хотелки:
— Clip проводить только в случае клика (удержания для поллинг версии) по клиентской области, Дабы иметь вероятность перетаскивать окно;
— нервировал вид taskbar во время игры (актуально, если она зафиксирована). Первой мыслью было спрятать ее программно. Но в таком случае нужно было бы отслеживать моменты выхода пользователя из игры и показывать taskbar обратно. Возрастал риск оставить пользователя без панели задач.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB