Описание 3D игры "Пенальти". Игра представляет собою серию из 10 пенальти между 2-мя юзерами, один из которых играет за пенальтиста, второй за вратаря. Роли меняются после каждого удара. При загрузке модуля появляются меню "играть с реальным человеком", "играть с компьютером", "регистрация", "правила", "статистика", "рейтинг". Начать игру можно и без регистрации. Если игру начинает зарегистрированный пользователь, то после нажатия на кнопку "играть с .." появляется список игроков из которого он выбирает игрока на роль пенальтиста и игрока на роль вратаря. На сервер отправляется запрос с выбранными игроками, в ответе приходят данные об этих игроках (имена, цвет футболки). После этого, если игра идет против реального человека, появляется надпись "ожидание соперника" и таймер обратного отсчета 20 сек. на сервер каждые 5 сек. отправляются запросы, пока не появится соперник. Cинхронизируется начало отсчета таймера в обоих модулях. После того как в ответе от сервера получено имя соперника, надпись "ожидание соперника" меняется на надпись "ваш соперник <имя соперника>" и игра начинается. Если выбрана игра против компьютера, посылается один запрос на сервер и игра начинается. Появляется поле с пенальтистом и вратарем, стадион со зрителями, мяч стоит на 11-метровой отметке. Таймер обратного отсчета показывает 10 сек. Если пользователь в роли пенальтиста, у него есть возможность задать вектор удара по воротам (направление и сила удара). Вектор задается в 2 этапа. Сначала задается направление удара в 3-х координатах стрелочкой от мяча к воротам. Сила удара задается отдельно. Если пользователь в роли вратаря, у него есть возможность выбрать направление движения вратаря (координаты точки в воротах, к которой будет прыгать или перемещаться вратарь). После выбора вектора удара или направления движения вратаря, посылается запрос на сервер с данными выбранного вектора или точки. Если соперник еще не выставил свой вектор, то каждые 10 сек. сервер опрашивается до тех пор, пока соперник не будет готов. В это время появляется надпись "ожидается ответ соперника". Если до окончания таймера юзер не успел установить вектор удара или позицию вратаря, то на сервер отправляется текущее положение в момент когда таймер доходит до 0. Если соперник покинул игру появляется надпись "вы победили так как соперник покинул игру" и кнопка "вернуться в основное меню". В ответе соперника приходит результат удара (гол или нет), вектор или координаты точки соперника, а также информация о синхронизации таймера (если не используются сокеты). Так же в ответе есть данные, закончена или нет игра. Если получен флаг, что игра закончена, появляется надпись "игра закончена". На спине пенальтиста и на груди вратаря есть их имена (например, А.Петров). Если имена будут слишком плохо видны, можно не показывать их на футболке, а показать сверху модуля. Цвета формы вратаря и пенальтиста согласно цвету, полученному от сервера. После этого показывается анимация -пенальтист разбегается, бьет по воротам согласно выбранному вектору, вратарь прыгает согласно полученному от соперника направлению, ловит мяч или пропускает согласно решению сервера. Трибуны реагируют в соответствии с выбранными ролями. Если пользователь играет за вратаря, - зрители на трибунах встают и прыгают если мяч пойман. У зрителей появляются флаги и шарфы раскрашенные в цвет формы вратаря. Если пользователь играет за пенальтиста,- зрители на трибунах встают и прыгают если забит гол. Все 3D модели, шейдеры и анимации будут предоставлены. В модуле есть кнопка (раздел меню) "регистрация" нажатие на которую открывает форму регистрации (емайл + логин + пароль) или форму для авторизации "вход" (логин + пароль) а также линк "напомнить пароль" нажатие на который открывает форму ввода емайла после отправляется запрос на сервер и сервер отправляет письмо с паролем юзеру на емайл. В модуле есть кнопка (раздел меню) "играть с реальным человеком" нажатие на которую начинает игру с реальным пользователем. В модуле есть кнопка (раздел меню) "играть с компьютером" нажатие на которую начинает игру с компьютером. В модуле есть кнопка (раздел меню) "рейтинг" нажатие на которую открывает список лучших пользователей по итогам дня (недели), а также положение текущего игрока в рейтинге и его место (если не в десятке лучших). В модуле есть кнопка (раздел меню) "правила" нажатие на которую открывает раздел с описанием игры и примеры выставления вектора удара пенальтиста и позиции вратаря. В модуле есть звуки и кнопка отключения/включения звука. Модуль делается в формате UNITY и в формате для мобильных приложений .ipa, .apk Ширина модуля - 650 пикселей. Техническое задание разработчику. При загрузке модуля вызывается функция OnUnityStarted() и считываются следующие параметры: domain = "http://inetball.ru"; where = "facebook"; userid = "135"; userName = "evgen"; domain - запоминается в переменной и подставляется во все запросы на сервер where- запоминается в переменной и подставляется в запрос на сервер userid и userName - необязательные параметры. Если эти параметры переданы, при загрузке модуля надо скрыть в меню раздел "регистрация" а также добавить сверху надпись "Здравствуйте, stepanchik" (Stepanchik – пример имени пользователя) Параметр userid сохранить в переменной и отправлять в запросах на сервер. При загрузке модуля вызывается файл <domain>/penalty_load.asp?userID=<userID>&where=<where> <userID>- необязательный параметр. передается только если присутствует в строке вызова модуля Ответ сервера: <flashID>123</flashID> <game> <flashID>123</flashID> <userID>1</userID> <userName>stepamchik</userName> <isSoundOn>1/0</isSoundOn> </game> flashID запоминается в переменную и передается на сервер в дальнейших запросах. При нажатии на кнопку "регистрация" открывается форма с 3-мя полями 1.Имя пользователя 2.Емайл 3.Пароль Данные полученные от юзера в форме отправляются на сервер HTTP запросом на адрес <domain>/penalty_registration.asp?flashID=<flashID> в формате POST со следующими параметрамиusername pass email gameID (необязательный параметр, только если уже получен в модуле, hidden юзер этого поля не видит) Этот файл возвращает хмл <User> <userID>123</userID> <userName>stepanchik</userName> <answerText></answerText> </user> В случае, если регистрация прошла успешно (userID не 0 и answerText пустой), кнопка (раздел меню) "логин" исчезает и появляется надпись "Здравствуйте, stepanchik" userID запоминается в переменной и отправляется с дальнейшими запросами на сервер. В случае, если регистрация не прошла (userID=0 и answerText не пустой), появляется алерт с текстом из answerText Если пользователь нажимает ссылку «Забыли пароль?» открывается форма, в которой юзер вводит свой емайл. На сервер отправляется HTTP запрос на адрес <domain>/penalty_forgetPass.asp?email=<email> Ответ сервера показывается юзеру: <answerText>На ваш емайл отправлено письмо с регистрационными данными<answerText> При нажатии на кнопку "вход" открывается форма с 2-мя полями 1.Имя пользователя 2.Пароль Данные полученные от юзера в форме отправляются на сервер HTTP запросом на адрес <domain>/penalty_login.asp?flashID=<flashID> в формате POST со следующими параметрамиusername pass gameID (необязательный параметр, только если уже получен в модуле, hidden юзер этого поля не видит) Этот файл возвращает хмл <User> <userID>123</userID> <userName>stepanchik</userName> <answerText></answerText> </user> В случае, если вход прошел успешно (userID не 0 и answerText пустой), кнопка (раздел меню) "регистрация" исчезает и появляется надпись "Здравствуйте, stepanchik" userID запоминается в переменной и отправляется с дальнейшими запросами на сервер. В случае, если вход не успешен (userID=0 и answerText не пустой), появляется алерт с текстом из answerText В момент, когда юзер нажимает на кнопку "играть с реальным человеком", инициализируется переменная realPlayer=1 В момент, когда юзер нажимает на кнопку "играть с компьютером", инициализируется переменная realPlayer=0 После этого на сервер отправляется HTTP запрос на адрес <domain>/penalty_choosePlayer.asp?flashID=<flashID> От сервера приходит следующий ответ: <Keepers> <player> <plrID>123<plrID> <plrName>А.Петров</plrName> <plrType>вратарь</plrType> </player> <player> <plrID>123<plrID> <plrName>А.Сидоров</plrName> <plrType>вратарь</plrType> </player> </keepers> <penaltists> <player> <plrID>123<plrID> <plrName>Б.Иванов</plrName> <plrType>нападающий</plrType> </player> <player> <plrID>123<plrID> <plrName>Б.Андреев</plrName> <plrType>полузащитник</plrType> </player> </penaltists> Если в списке вратарей и пенальтистов по 1 игроку, то эти игроки запоминаются в переменные keeperID и penaltistID Если в списке вратарей или пенальтистов более 1 записи, то открывается страиничка выбора пенальтиста и вратаря. Юзер выбирает из списка 1 пенальтиста и 1 вратаря эти игроки запоминаются в переменные keeperID и penaltistID. Модуль переходит на страничку игры и на сервер отравляется HTTP запрос на адрес <domain>/penalty_startGame.asp?flashID=<flashID>&realPlayer=<realPlayer>&keeper =<keeperID>&penaltist=<penaltistID> Ответ от сервера <game> <gameID>123</gameID> <isRivalFound>1</isRivalFound> <role>1</role> <username>test1</userName> <rivalName>test2</rivalName> <timerDelay>5</timerDelay> <keeperName>А.Петров</keeperName> <playerName>Б.Иванов</playerName> <rivalkeeperName>А.Петров</ rivalkeeperName > <rivalpenaltistName >Б.Иванов</ rivalpenaltistName > <cmndColor>#FFFFF</cmndColor > <rvlColor>#00000</rvlColor > </game> В случае игры с компьютером генерация удара пенальтиста и выбор зоны защиты ворот происходит внутри Юнити-модуля. В конце игры на сервер отправляется запрос в формате POST<domain>/penalty_finishGame.asp?flashID=<flashID>&gameID=<gameID> &keeperSaves=<keeperSaves>&penaltistGoals=< penaltistGoals >&result=< result > Где keeperSaves- количество мячей взятых вратарем (не учитывает мячи “мимо ворот”), зашифрованное в формате md5; penaltistGoals - количество мячей забитых пенальтистом, зашифрованное в формате md5; result- результат серии (1- выиграна;2-проиграна;0-ничья), зашифрованное в формате md5; Ответ сервера<Answer> <answerText>ТЕКСТ</answerText> </ Answer > Показать данный текст в модуле. Если isRivalFound=0 - появляется надпись "ожидаем появления соперника" Каждые 10 сек. модуль посылает запрос HTTP запрос на сервер <domain>/penalty_startGame.asp?flashID=<flashID>&realPlayer=<realPlayer>&keeper =<keeperID>&penaltist=<penaltistID> до тех пор, пока не получит isRivalFound=1 После 2-го,4-го и т.д запроса (каждые 20 сек.) появляются кнопки "продолжить ожидание" и "начать игру с компьютером". Если юзер нажимает "начать игру с компьютером" realPlayer меняется на 0. И посылается тот же HTTP запрос на сервер. Если юзер нажал "продолжить ожидание",- запросы на сервер продолжаются каждые 10 сек. после каждого 2-го,4-го и т.д запроса появляются кнопки "продолжить ожидание" и "начать игру с компьютером". Если isRivalFound=1 отсчитывается timerDelay секунд и появляется таймер обратного отсчета и возможность выбрать вектор для пенальтиста (если role=1) или точку броска для вратаря (если role=0) Если юзер выбрал вектор или таймер дошел до 0, на сервер отправляется HTTP запрос на адрес <domain>/penalty_continueGame.asp?flashID=<flashID>&realPlayer=<realPlayer>&ga meID=<gameID>&tour=<tour>&role=<role>&vectorPlayer=<vectorPlayer>&gateSecto rReal=<gateSectorReal>&gateSector=<gateSector> Где tour - от 1 до 10 (какой по счету идет удар из 10 возможных) gateSector - сектор ворот, выбранный для защиты. gateSectorReal - сектор ворот, в который попадет мяч при ударе пенальтиста Ответ от сервера <game> <gameID>123</gameID> <tour>1</tour> <role>1</role> <status>1</status> <timerDelay>5</timerDelay> <keeperName>А.Петров</keeperName> <playerName>Б.Иванов</playerName> <keeperColor>#FFFFF</keeperColor> <playerColor>#00000</playerColor> <vectorPlayer>x,y,z,v</vectorPlayer> <vectorKeeper>x,y</vectorKeeper> <isGoal>0</isGoal> <scores>100</scores> <rezult>3:1</rezult> <answerText>Text</answerText> </game> Если в ответе status=0 запрос повторяется каждые 5 сек. до получения status=1 (соперник готов) Если получено status=-1 появляется надпись "вы победили так как соперник покинул игру" и кнопки "продолжить играть против компьютера" и "выйти из игры" Если получено status=-2 появляется надпись "игра окончена" и кнопка "выйти из игры" Если юзер выбрал "продолжить играть против компьютера" на сервер отправляется HTTP запрос на адрес <domain>/penalty_continueGame.asp?flashID=<flashID>&gameID=<gameID>&tour=< tour>&role=<role>&vectorPlayer=<vectorPlayer>&changeToAuto=1 Если answerText не пустое, показывается алерт с этим текстом. Если status=1 (ответ от соперника получен) показывается соответствущая анимация. Цвета шейдеров формы вратаря и игрока расскрашиваются в соответствующий цвет. Цвета шейдеров болельщиков расскрашиваются в соответствующий цвет (цвет вратаря если мяч отбит или цвет пенальтиста если мяч пропущен). Показаны очки, набранные юзером в игре (scores). Показано какой идет тур (tour). Показан счет (rezult). Кнопка (раздел меню) "лучший результат" вызывает файл <domain>/penalty_statistic.asp который возвращает хмл c 2-мя списками,- лучших за день и лучших за неделю. <BestDayUsers> <user> <place>1</place> <userName>stepanchik</userName> <totalTours>20</totalTours> <keeperTake>3</keeperTake> <goals>3</goals> <scores>500</scores> </user> <user> <place>2</place> <userName>evgen</userName> <totalTours>20</totalTours> <keeperTake>3</keeperTake> <goals>3</goals> <scores>500</scores> </user> </BestDayUsers> <BestWeekUsers> <user> <place>1</place> <userName>stepanchik</userName> <totalTours>20</totalTours> <keeperTake>3</keeperTake> <goals>3</goals> <scores>500</scores> </user> <user> <place>2</place> <userName>evgen</userName> <totalTours>20</totalTours> <keeperTake>3</keeperTake> <goals>3</goals> <scores>500</scores> </user> </BestWeekUsers> Все тексты для модуля берутся из файла <domain>/penalty_texts.xml 2 часть- игра с реальным соперником При выборе удара или зоны защиты показать на табло таймер обратного отсчета установленный на 5 сек. По окончании таймера запустить звуковой файл. После выбора удара или зоны защиты на сервер отправляется запрос<domain>/penalty_continueGame.asp?flashID=<flashID>&gameID=<gameID>&tour=< tour>&vectorPlayer=<vectorPlayer>&gateSector=<gateSector>&contral=<md5> Ответ от сервера <game> <status>1</status> <timerDelay>5</timerDelay> <vectorPlayer>x,y,z,v</vectorPlayer> <vectorKeeper>1</vectorKeeper> <answerText>Text</answerText> </game> Если в ответе status=1,- показать анимацию удара и перейти к следующему туру. Если в ответе status=0 таймер обратного отсчета устанавливается на 20 сек., запрос повторяется каждые 5 сек. до получения status=1 На табло показывается текст из answerText Если получено status=-1 (соперник покинул игру) появляется надпись "вы победили так как соперник покинул игру" из answerText и кнопка "возврат в меню"