Разработка многопользовательских приложений для моноблоков и планшетов

Создание многопользовательского интерфейса с поддержкой сенсорного управления для Windows*






 

Скачать PDF

Введение

Моноблоки впервые появились в середине 1990-х годов и с тех пор широко используются в различных сферах. Эти устройства были призваны освободить рабочее пространство от громоздкого монитора, системного блока и устройств ввода, и потому на них возлагали большие надежды. Однако поначалу они не были слишком популярными, так как сильно уступали в производительности традиционным настольным ПК и отличались высокой стоимостью. К счастью, современные моноблочные компьютеры избавлены от этих недостатков.

В качестве устройства для дома пользователи, как правило, выбирают модели с экраном диагональю 55 дюймов. Их легко разместить на рабочем столе, и они удобны в работе. Благодаря моноблокам пользователи открыли для себя новые возможности цифрового мира, чем не преминули воспользоваться разработчики приложений, предлагая новые уникальные приложения, рассчитанные на несколько игроков.

К сожалению, в настоящий момент интерфейс прикладного программирования (API) Windows не располагает достаточными средствами для создания приложений для двух или более пользователей. Однако это не значит, что разработчики не могут использовать свои собственные. При разработке интерфейса самое главное сделать так, чтобы приложением было легко пользоваться и чтобы оно правильно воспринимало команды ввода.

Ниже мы рассмотрим, какие средства API Windows можно использовать для разработки приложений с сенсорным управлением, а также продемонстрируем, как с их помощью создать простую многопользовательскую игру.

Создание пользовательского интерфейса

Современные сенсорные экраны не способны определить, кто из пользователей (если их нес-колько) коснулся дисплея. В каких-то случаях этим можно пренебречь. Например, в настольной игре совсем не важно, кто из игроков перемещает фишки по полю, так как за этим следят сами пользователи.

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

API Windows

Windows поддерживает два основных формата сенсорных команд. Первый — это сообщения WM_TOUCH. Они отвечают только за первичные данные, поэтому приложение должно само обработать и выполнить поступающие команды.

Второй формат — WM_GESTURE. Это сообщение генерируется при использовании одного из жестов управления Windows, например масштабирования с помощью разведения и сведения пальцев, перетаскивания элементов и т. д. Благодаря их наличию задача разработчика существенно упрощается, поскольку операционная система может сама распознавать жесты управления и касания экрана и передавать их приложению в удобном для обработки виде.

В настоящий момент в Windows поддерживаются только сенсорные команды, поступающие от одного пользователя (руки), поэтому использовать сообщения WM_GESTURE для распознава¬ния касаний нескольких игроков в нашем приложении не получится.

Кроме того, важно помнить, что API-интерфейс определяет координаты касаний по отношению ко всему экрану (они измеряются в сотых долях пикселя), а не только внутри окна программы. Если нужно получить именно координаты в окне, следует конвертировать их с помощью функции ScreenToClient().

Пример приложения

В качестве примера мы решили воссоздать классический симулятор настольного тенниса — игру Pong, и наделить ее сенсорным управлением. Игровой процесс состоит в том, что игроки передвигают ракетки по вертикали, отбивая мячик на сторону соперника. Когда мячик достигает одной из границ поля (по вертикали), игрок на противоположной стороне получает очко.

Мячик двигается по экрану по диагонали. После каждого движения приложение проверяет, не встретил ли он препятствие. Если мячик ударяется о верхнюю или нижнюю границы игрового поля, его вертикальная траектория изменяется в соответствии с углом столкновения. Если он ударяется о ракетку или о вертикальную границу окна, его горизонтальная траектория также изменяется на противоположную.

Обработка перемещения мяча происходит в отдельном потоке самого приложения для обеспечения плавности движения во время выполнения сенсорных команд.

Рендеринг графики осуществляется стандартными вызовами интерфейса графических устройств (GDI) Windows. В качестве ракеток служат обычные прямоугольники, в качестве мяча — круг. Счет матча отображается как текст на фоне. При создании этого приложения не использовались растровые отображения объектов или другие графические средства. Пример интерфейса показан на рисунке ниже. Нажмите на него, чтобы просмотреть видеоролик о работе приложения.

Рисунок 1.Стандартный интерфейс для двух пользователей.

Интерфейс для двух пользователей с поддержкой сенсорного управления

Чтобы игра воспринимала касания каждого пользователя, мы разделили экран на две части: игрок 1 находится слева, игрок 2 — справа.

Каждый раз, когда происходит событие WM_TOUCH, программа получает полный список точек касания (пример кода 1). В нем может содержаться от одной до нескольких записей (максимальное количество точек зависит от возможностей устройства). Затем производится итерация, которая позволяет определить координаты каждого касания по осям X и Y:

	…
	                bret = GetTouchInputInfo(
				(HTOUCHINPUT)lparam,
				data.geometry_data.touch_inputs_count,
				data.geometry_data.touch_inputs,
				sizeof(TOUCHINPUT)
				);
			assert(bret != FALSE);
	//-----------------------------------------------------------------
	// обработка сенсорных команд
	//-----------------------------------------------------------------
			for(i = 0; i < data.geometry_data.touch_inputs_count; i++) 
	                   {
				touch_input = &data.geometry_data.touch_inputs[i];
	//----------------------------------------------------------------- 
	//преобразование сотых долей пикселя в пиксели
	//-----------------------------------------------------------------
				x = touch_input->x / 100;
				y = touch_input->y / 100;)
	                   {
	 …

Пример кода 1.

Далее необходимо определить, с какой стороны произошло касание, после чего обновить вертикальное расположение ракетки так, чтобы оно совпадало с положением пальца игрока (пример кода 2). Таким образом будет происходить перемещение ракетки по полю.

	…
	if (x < (ULONG)((data.graphic_data.rect.right – data.graphic_data.rect.left) /          2))
	   {
	//-----------------------------------------------------------------
	// разделение экрана для двух пользователей
	//-----------------------------------------------------------------
	   Data.geometry_data.p1y = y;
	   }else{
	   Data.geometry_data.p2y = y;
	   }
	bret = move_paddles(&data);
	assert(bret == TRUE);
	   {

Пример кода 2.

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

Адаптация приложения для четырех пользователей

Чтобы адаптировать приложение для четырех пользователей, необходимо изменить игровое поле и активные зоны игроков.

Мы добавили две ракетки и два табло со счетом внизу и вверху экрана. Разграничительные линии игровых зон приобрели форму буквы «Х», разделив окно приложения на четыре треугольника (рисунок 2).

Рисунок 2.Разделение игровых зон для четырех игроков.

На рисунке 3 показано, как приложение определяет, в какой из зон произошло касание экрана.



 

Рисунок 3.Определение зоны сенсорной команды.

При разделении экрана на четыре зоны определить, в какой из них произошло касание, становится сложнее (пример кода 3).

	…
	   if(touch_point.y > (LONG)(((float)data.graphic_data.rect.bottom / data.graphic_data.rect.right) * touch_point.x)) {
	     if(touch_point.y > (LONG)((((float)data.graphic_data.rect.bottom /  data.graphic_data.rect.right) * -1) * touch_point.x) + data.graphic_data.rect.bottom){ 
	       data.geometry_data.p4x = touch_point.x;
	       }else{
	       data.geometry_data.p1y = touch_point.y;}
	   }else{
	   if(touch_point.y < (LONG)((((float)data.graphic_data.rect.bottom / data.graphic_data.rect.right) * -1) * touch_point.x) + data.graphic_data.rect.bottom)
	   {
	   data.geometry_data.p3x = touch_point.x;
	   }else{
	   data.geometry_data.p2y = touch_point.y;
	   }
	}
	…

Пример кода 3.

Пример интерфейса игры для четырех пользователей показан на рисунке ниже. Нажмите на него, чтобы просмотреть видеоролик о работе приложения.

Рисунок 4.Игра для четырех пользователей, запущенная на устройстве с 55-дюймовом экраном.

Заключение

При создании многопользовательских приложений с сенсорным управлением для Windows 7 и более поздних версий используйте сообщения WM_TOUCH и WM_GESTURES. Если вы найдете наиболее эффективный способ, как определить, в какой из игровых зон происходит касание, разработка приложения даже для четырех одновременно играющих пользователей не составит большого труда.

Об авторах

Стивен Роджерс работает в компании Intel более 20 лет. Он специализируется на настройке систем и управлении лабораториями. Стивен является техническим инженером-маркетологом в группе PLSE (развертывание платформ и проектирование масштабирования), где отвечает за отраслевые приложения.

Олден Сотелл участвует в программе «Компьютерные и информационные науки» в Портленд¬ском общинном колледже. В Intel работает по договору. Специализируется на настройке и обс¬луживании аппаратного обеспечения серверов для предприятий, сетевых устройств и ПО в лаборатории PLSE.

Жамель Тейеб работает в группе Intel по разработке программного обеспечения и служб. Он получил степень кандидата компьютерных наук в Университете Валансьена и теперь занимается разработкой ПО.






 

Intel®Developer Zone offers tools and how-to information for cross-platform app development, platform and technology information, code samples, and peer expertise to help developers innovate and succeed.  Join our communities for the Internet of Things, Android*, Intel® RealSense™ Technology  and Windows* to download tools, access dev kits, share ideas with like-minded developers, and participate in hackathons, contests, roadshows, and local events.






 

Intel, the Intel logo, and Ultrabook are trademarks of Intel Corporation in the U.S. and/or other countries.
Copyright © 2014 Intel Corporation. All rights reserved.
*Other names and brands may be claimed as the property of others.






 

Для получения подробной информации о возможностях оптимизации компилятора обратитесь к нашему Уведомлению об оптимизации.
Возможность комментирования русскоязычного контента была отключена. Узнать подробнее.