Добрый день, меня зовут Алексей, наша команда занимается разработкой игр и приложений.
Текущий год внес большие перемены в игровую индустрию.
Многие игровые компании покидают Россию, чтобы не лишиться заработков на
зарубежных площадках и, как следствие, своего бизнеса. Есть те, кто не планирует
уезжать из страны и подстраивается под текущие реалии, чтобы выжить. Мы относимся ко вторым. Об этом я хочу рассказать в данной статье и привести немного кода.
В одной из своих статей я уже вскользь упоминал о том, что наша игровая команда занимаемся проектом для бизнеса – системой бронирования переговорных комнат.
Изначально, этот проект позиционировался для нас как второстепенный, созданный под заказ, для одного из наших клиентов в начале 2020 года. Однако 2022 год заставил изменить к нему отношение.
Продажа лицензий позволяет нашей небольшой команде поддерживать положительный баланс, и продолжать работу над нашей текущей игрой Jaws & Claws.
Один из наших клиентов, обратился к нам с просьбой доработать систему, для ее взаимодействия с контурной подсветкой планшетов Philips 10BDL4151T.
Дорабатывать программное обеспечение под устаревшее оборудование бесперспективно и иногда требует больших трудозатрат. Но опыт работы в игровой индустрии, когда мы стараемся угодить нашим игрокам, сделал нас клиентоориентированной командой. Поэтому мы не хотели отказывать клиенту в выполнении данной работы.
Мы стали искать информацию, которая нам сможет помочь. Кроме примера работы с подсветкой на C#, мы дополнительно нашли документ, описывающий работу с устройствами Phillis через SICP протокол.
Этот документ развеял наши сомнения о том, что необходимо произвести данную доработку. Нет сомнений, что это поможет нам в дальнейшем при создании мультиплеера для нашей игры.
Когда я говорю знакомым, что доработка контурной подсветки поможет нам в работе над игрой, всегда слышу вопрос: «Что общего между лампочкой планшета и игрой в стиле файтинг-платформер?»
В последнее время мы всерьез задумались о необходимости добавить в игру режим мультиплеера. Он также будет использовать работу сокетами.
Для создания наших игр и приложений мы используем c++ и игровой движок cocos2d-x. Иногда это дает нам преимущество, иногда создает значительные ограничения и неудобства.
Теперь, когда описательная часть закончена, я предлагаю перейти к функциям, которые мы используем в нашем проекте для взаимодействия с контурной подсветкой планшетов Philips 10BDL4151T.
На текущей момент система использует пять вариантов подсветки:
выключено
красный
зеленый
желтый
серый
Цвет контурной подсветки устанавливается в функции по тегу.
// функция устанавливает цвет по тегу
void CPhilipsLight::_setLedColorByTag(int colorTag)
{
if (!isAccess_ || colorTag_ == colorTag)
return;
colorTag_ = colorTag;
switch (colorTag_)
{
case ColorTag::OFF:
this->_setLedColor(Color3B::BLACK);
break;
case ColorTag::NOP:
this->_setLedColor(Color3B(20, 20, 20));
break;
case ColorTag::FREE:
this->_setLedColor(Color3B::GREEN);
break;
case ColorTag::BUSY:
this->_setLedColor(Color3B::RED);
break;
case ColorTag::DISCONNECT:
this->_setLedColor(Color3B::YELLOW);
break;
default:
break;
}
}
Далее, когда установлен код цвета по его тегу, необходимо генерировать набор данных для их последующей передачи, по примеру из документа компании Philips.
// функция устанавливает цвет контурной подсветки планшета
void CPhilipsLight::_setLedColor(const Color3B &color)
{
char chechSum = 0x09 ^ 0x01 ^ 0x00 ^ 0xF3 ^ 0x01 ^ color.r ^ color.g ^ color.b;
char sendData[SizeData];
sendData[0] = (char)0x09;
sendData[1] = (char)0x01;
sendData[2] = (char)0x00;
sendData[3] = (char)0xF3;
sendData[4] = (char)0x01;
sendData[5] = (char)color.r;
sendData[6] = (char)color.g;
sendData[7] = (char)color.b;
sendData[8] = chechSum;
if (this->_setSendSoketDataLedColor(sendData, SizeData) < 0)
isAccess_ = false;
}
После того, как набор данных был сформирован их необходимо отправить на порт 5000 сетевого интерфейса планшета. (ServerPort = 5000, ServerUrl = 127.0.0.1)
// функция отправляет запрос для установки цвета контурной подсветки планшета
int CPhilipsLight::_setSendSoketDataLedColor(const char *sendData, size_t len)
{
int result = 0;
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
return sockfd;
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
struct hostent *hostent1 = gethostbyname(ServerUrl);
if(!hostent1)
return -1;
memcpy(&(servaddr.sin_addr), hostent1->h_addr_list[0], hostent1->h_length);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(ServerPort);
if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
return -1;
// отправка данных для изменения цвета
result = send(sockfd, sendData, len, 0);
close(sockfd);
return result;
}
Эта небольшая часть кода позволяет нам полноценно работать с контурной подсветкой планшета Philips.
Кроме этого, используя SICP протокол, можно менять настройки телевизоров Philips, например количество картинок в картинке. А также настройки другой техники от этого производителя. Я надеюсь, что приведенный мной код, кому-то в этом поможет.
В настоящее время, наша команда значительную часть времени тратит на работу с системой, именно по этой причине мы несколько раз уже переносили релиз нашей игры. Но нет никаких сомнений, что наш игровой проект, как и предыдущие проекты, будет доведен до релиза.
В завершение приведу ссылку на страницу нашей игры в Steam.