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