Download - Java осень 2013 лекция 5
![Page 1: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/1.jpg)
Углубленное программирование
на JavaЛекция 5
«Игровая механика»
Виталий Чибриков
![Page 2: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/2.jpg)
План лекции
2
1. Организация кода
2. Компоненты сервера
3. GM+Репликация
4. Разработка игр
5. Deploy сервера
![Page 3: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/3.jpg)
Все классы в одном пакете
Организация кода
3
Abonent
AccountService
Address
AddressService
Frontend
Main
MessageSystem
Msg
MsgToAS
MsgToFrontend
MsgGetUserId
MsgUpdateUserId
TimeHelper
![Page 4: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/4.jpg)
Организация кода
4
messageSystem.AbonentmessageSystem.AddressmessageSystem.AddressServicemessageSystem.MessageSystemmessageSystem.MsgaccountService.AccountServiceaccountService.MsgToASaccountService.MsgUpdateUserIdfrontend.Frontendfrontend.MsgGetUserIdfrontend.MsgToFrontendmain.Mainutils.TimeHelper
Распределим классы по пакетам
![Page 5: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/5.jpg)
В каком порядке собирать пакеты?
Организация кода
5
messageSystem.AbonentmessageSystem.AddressmessageSystem.AddressServicemessageSystem.MessageSystemmessageSystem.MsgaccountService.AccountServiceaccountService.MsgToASaccountService.MsgUpdateUserIdfrontend.Frontendfrontend.MsgGetUserIdfrontend.MsgToFrontendmain.Mainutils.TimeHelper
Циклические зависимости
![Page 6: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/6.jpg)
Организация кода
6
Frontend AccountService
FrontendImpl AccountServiceImplFrontendInterface
ASInterface
![Page 7: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/7.jpg)
Интерфейсы
7
Frontend AccountService
FrontendImpl, Frontend AccountServiceImpl, AccountService
(Frontend, FrontendInterface) (AccountService, AccountServiceInterface)
Аналогично для:AddressServiceMessageSystem
![Page 8: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/8.jpg)
Изменения кода
8
FrontendImpl используем только вместе с оператором new!
Frontend frontend = new FrontendImpl(…);
Во всех классах и методах используем только интерфейс Frontend
Аналогично для всех классов и интерфейсов
Если какая-то функция из Impl должны быть вызвана «снаружи»объявляйте ее в интерфейсе
![Page 9: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/9.jpg)
1-й шаг1-й шаг
Реакторинг
9
2-й шаг
Переименовываем Frontend в FrontendImpl
Создаем пустой интерфейс Frontend
FrontendImpl implements Frontend
Компилируем, видим что ничего не изменилось
Меняем везде (кроме new) FrontendImpl на Frontend
Компилляция не проходит
Добавляем в Frontend все нужные обявления методов
![Page 10: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/10.jpg)
Интерфейсы
10
public interface Frontend extends Abonent {MessageSystem getMessageSystem();
void setId(Integer sessionId, Integer userId);}
public interface AccountService extends Abonent {MessageSystem getMessageSystem();
Integer getUserId(String name);}
![Page 11: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/11.jpg)
Схема зависимостей
11
utils base
messageSystem
frontend accountService
main
![Page 12: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/12.jpg)
План лекции
12
1. Организация кода
2. Компоненты сервера
3. GM+Репликация
4. Разработка игр
5. Deploy сервера
![Page 13: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/13.jpg)
Компоненты сервера
utils
gameMechanics
base
messageSystem
frontend
main
dbService
resourceSystem
13
![Page 14: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/14.jpg)
Frontend – часть сервера, которую видит пользователь
Frontend
14
Отвечает на запросы клиентов
Запрашивает аутентификацию у Database сервиса
Запрашивает пользовательские данные у Database сервиса
Перенаправляет клиентские команды в Game Mechanics
Получает от Game Mechanics реплику игровой сессии
Следит за активностью клиентов
![Page 15: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/15.jpg)
Frontend
15
public void run(){while(true){
messageSystem.execForAbonent(this); //обработка сообщенийremoveDeadUsers(); //убираем «мертвых» пользователейsmartSleep(); //ждем сообщений
}}
![Page 16: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/16.jpg)
Все события игры происходят в игровой механике
Game Mechanics
16
Создает игровые сессии (GameSession) для пользователей
Реагирует на команды от Frontend
Запрашивает сохранение данных пользователя в Database Service
Обрабатывает поведение игровых сущностей (NPC, Buffs, Spells, Loot...)
Отправляет реплику на Frontend
Содержит игровые карты
![Page 17: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/17.jpg)
Для сервиса online шахматы
Пример
17
1. Первый пользователь проходит аутентификацию
2. Первый пользователь ждет пока зайдет второй пользователь
3. Второй пользователь проходит аутентификацию
4. Frontend отсылает на GM сообщение – «начинаем партию»
7. Пользователи получают сообщение – «можно приступать к игре»
6. GM сообщает на Frontend – «партия начата, ходит первый игрок»
5. GM создает GameSession
![Page 18: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/18.jpg)
Персистентная часть сервера
Database Service
18
Содержит:
Данные для аутентификации пользователей
Результаты сыгранных партий
Данные о текущем состоянии пользователя
Отвечает на запросы Game Mechanics и Frontend
![Page 19: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/19.jpg)
Статическая часть сервера
Resource System
19
Файлы с описанием игровых сущностей – ресурсы
Десериализатор ресурсов – создание игровых объектов
Инструменты для создания ресурсов
Инструменты для контроля целостности ресурсов
Все “hardcoded” значения – в ресурсы
![Page 20: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/20.jpg)
Система обмена сообщениями
Message System
20
Позволяет передавать данные от одной игровой сущности к другой
Передает сообщениями между потоками и процессами
Безопасный способ взаимодействия потоков
![Page 21: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/21.jpg)
План лекции
21
1. Организация кода
2. Компоненты сервера
3. GM+Репликация
4. Разработка игр
5. Deploy сервера
![Page 22: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/22.jpg)
UserSession ― объект с состоянием пользователя
User Session
22
UserSession «живет» на Frontend
На каждого пользователя свой UserSession
Данных UserSession достаточно, чтобы описать состояние пользователя
PageGenerator на основе UserSession способен создать страницу
Страницу надо отдавать после каждой команды пользователя
![Page 23: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/23.jpg)
GameSession ― объект с данными игровой партии
Game Session
23
GameSession «живет» на GameMechanics
Game Mechanics содержит по одному объекту GameSession на партию
GameSession содержит всю информацию о текущей игре
На основе GameSession можно создать UserSession для любого игрока
Game Mechanics на каждом шаге расчитывает состояние GameSession
Команды от игрока ― команды на изменение GameSession
![Page 24: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/24.jpg)
Game Mechanics
24
final private Map<Integer, GameSession> userToSessions = new HashMap<Integer, GameSession>();
public void run(){while(true){
processMessages();doGMStep();replicateGamesToFrontend();TimeHelper.sleep(SLEEP_TIME);
}}
processMessages() – обработка сообщений от Frontend (команды пользователей)
doGMStep() – расчет изменений не связанных с текущими командами пользователей
replicateGamesToFrontend() – отправка на Frontend изменений User Session
![Page 25: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/25.jpg)
Репликация
25
processMessages()
doGMStep()
replicate ()
processMessages()
doGMStep()
replicate ()
…
…
![Page 26: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/26.jpg)
План лекции
26
1. Организация кода
2. Компоненты сервера
3. GM+Репликация
4. Разработка игр
5. Deploy сервера
![Page 27: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/27.jpg)
Разработка игр
27
Client
ServerGame
Design
Game Mechanics
![Page 28: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/28.jpg)
План лекции
28
1. Организация кода
2. Компоненты сервера
3. GM+Репликация
4. Разработка игр
5. Deploy сервера
![Page 29: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/29.jpg)
Администрирование
29
Для уравления сервером создаем страницу admin
admin?shutdown=1000 – stop сервера через секунду
![Page 30: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/30.jpg)
PORT в параметры
30
Запуск в IDEA:
Конфигурация запуска, «Program arguments»: 8080
Запуск из командной строки:
Java –classpath project.jar path.to.Main 8080
![Page 31: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/31.jpg)
Maven – средство сборки
31
Свойства сборки
![Page 32: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/32.jpg)
Maven – средство сборки
32
Инструкции сборки
![Page 33: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/33.jpg)
Сборка и запуск
33
mvn compile
mvn assemble:single
cp ./target/project.jar ./
java –classpath project.jar path.to.Main PORT
![Page 34: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/34.jpg)
Deploy
34
tp-demo1.corp.mail.ru
apo21-N
git clone
mvn compile assemble:single + copy
java –classpath project.jar path.to.Main 808N
![Page 35: Java осень 2013 лекция 5](https://reader035.vdocuments.pub/reader035/viewer/2022062308/559b76941a28ab6a4f8b47cd/html5/thumbnails/35.jpg)
Stop server
35
curl http:/localhost:808N/admin?shutdown=1000