Java осень 2013 лекция 5

Preview:

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

Спасибо за внимание

Виталий Чибриковchibrikov@corp.mail.ru