36
Углубленное программирование на Java Лекция 5 «Игровая механика» Виталий Чибриков

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

Embed Size (px)

Citation preview

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

Углубленное программирование

на JavaЛекция 5

«Игровая механика»

Виталий Чибриков

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

План лекции

2

1. Организация кода

2. Компоненты сервера

3. GM+Репликация

4. Разработка игр

5. Deploy сервера

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

Все классы в одном пакете

Организация кода

3

Abonent

AccountService

Address

AddressService

Frontend

Main

MessageSystem

Msg

MsgToAS

MsgToFrontend

MsgGetUserId

MsgUpdateUserId

TimeHelper

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

Организация кода

4

messageSystem.AbonentmessageSystem.AddressmessageSystem.AddressServicemessageSystem.MessageSystemmessageSystem.MsgaccountService.AccountServiceaccountService.MsgToASaccountService.MsgUpdateUserIdfrontend.Frontendfrontend.MsgGetUserIdfrontend.MsgToFrontendmain.Mainutils.TimeHelper

Распределим классы по пакетам

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

В каком порядке собирать пакеты?

Организация кода

5

messageSystem.AbonentmessageSystem.AddressmessageSystem.AddressServicemessageSystem.MessageSystemmessageSystem.MsgaccountService.AccountServiceaccountService.MsgToASaccountService.MsgUpdateUserIdfrontend.Frontendfrontend.MsgGetUserIdfrontend.MsgToFrontendmain.Mainutils.TimeHelper

Циклические зависимости

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

Организация кода

6

Frontend AccountService

FrontendImpl AccountServiceImplFrontendInterface

ASInterface

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

Интерфейсы

7

Frontend AccountService

FrontendImpl, Frontend AccountServiceImpl, AccountService

(Frontend, FrontendInterface) (AccountService, AccountServiceInterface)

Аналогично для:AddressServiceMessageSystem

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

Изменения кода

8

FrontendImpl используем только вместе с оператором new!

Frontend frontend = new FrontendImpl(…);

Во всех классах и методах используем только интерфейс Frontend

Аналогично для всех классов и интерфейсов

Если какая-то функция из Impl должны быть вызвана «снаружи»объявляйте ее в интерфейсе

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

1-й шаг1-й шаг

Реакторинг

9

2-й шаг

Переименовываем Frontend в FrontendImpl

Создаем пустой интерфейс Frontend

FrontendImpl implements Frontend

Компилируем, видим что ничего не изменилось

Меняем везде (кроме new) FrontendImpl на Frontend

Компилляция не проходит

Добавляем в Frontend все нужные обявления методов

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

Интерфейсы

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

Схема зависимостей

11

utils base

messageSystem

frontend accountService

main

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

План лекции

12

1. Организация кода

2. Компоненты сервера

3. GM+Репликация

4. Разработка игр

5. Deploy сервера

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

Компоненты сервера

utils

gameMechanics

base

messageSystem

frontend

main

dbService

resourceSystem

13

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

Frontend – часть сервера, которую видит пользователь

Frontend

14

Отвечает на запросы клиентов

Запрашивает аутентификацию у Database сервиса

Запрашивает пользовательские данные у Database сервиса

Перенаправляет клиентские команды в Game Mechanics

Получает от Game Mechanics реплику игровой сессии

Следит за активностью клиентов

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

Frontend

15

public void run(){while(true){

messageSystem.execForAbonent(this); //обработка сообщенийremoveDeadUsers(); //убираем «мертвых» пользователейsmartSleep(); //ждем сообщений

}}

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

Все события игры происходят в игровой механике

Game Mechanics

16

Создает игровые сессии (GameSession) для пользователей

Реагирует на команды от Frontend

Запрашивает сохранение данных пользователя в Database Service

Обрабатывает поведение игровых сущностей (NPC, Buffs, Spells, Loot...)

Отправляет реплику на Frontend

Содержит игровые карты

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

Для сервиса online шахматы

Пример

17

1. Первый пользователь проходит аутентификацию

2. Первый пользователь ждет пока зайдет второй пользователь

3. Второй пользователь проходит аутентификацию

4. Frontend отсылает на GM сообщение – «начинаем партию»

7. Пользователи получают сообщение – «можно приступать к игре»

6. GM сообщает на Frontend – «партия начата, ходит первый игрок»

5. GM создает GameSession

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

Персистентная часть сервера

Database Service

18

Содержит:

Данные для аутентификации пользователей

Результаты сыгранных партий

Данные о текущем состоянии пользователя

Отвечает на запросы Game Mechanics и Frontend

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

Статическая часть сервера

Resource System

19

Файлы с описанием игровых сущностей – ресурсы

Десериализатор ресурсов – создание игровых объектов

Инструменты для создания ресурсов

Инструменты для контроля целостности ресурсов

Все “hardcoded” значения – в ресурсы

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

Система обмена сообщениями

Message System

20

Позволяет передавать данные от одной игровой сущности к другой

Передает сообщениями между потоками и процессами

Безопасный способ взаимодействия потоков

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

План лекции

21

1. Организация кода

2. Компоненты сервера

3. GM+Репликация

4. Разработка игр

5. Deploy сервера

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

UserSession ― объект с состоянием пользователя

User Session

22

UserSession «живет» на Frontend

На каждого пользователя свой UserSession

Данных UserSession достаточно, чтобы описать состояние пользователя

PageGenerator на основе UserSession способен создать страницу

Страницу надо отдавать после каждой команды пользователя

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

GameSession ― объект с данными игровой партии

Game Session

23

GameSession «живет» на GameMechanics

Game Mechanics содержит по одному объекту GameSession на партию

GameSession содержит всю информацию о текущей игре

На основе GameSession можно создать UserSession для любого игрока

Game Mechanics на каждом шаге расчитывает состояние GameSession

Команды от игрока ― команды на изменение GameSession

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

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

Репликация

25

processMessages()

doGMStep()

replicate ()

processMessages()

doGMStep()

replicate ()

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

План лекции

26

1. Организация кода

2. Компоненты сервера

3. GM+Репликация

4. Разработка игр

5. Deploy сервера

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

Разработка игр

27

Client

ServerGame

Design

Game Mechanics

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

План лекции

28

1. Организация кода

2. Компоненты сервера

3. GM+Репликация

4. Разработка игр

5. Deploy сервера

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

Администрирование

29

Для уравления сервером создаем страницу admin

admin?shutdown=1000 – stop сервера через секунду

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

PORT в параметры

30

Запуск в IDEA:

Конфигурация запуска, «Program arguments»: 8080

Запуск из командной строки:

Java –classpath project.jar path.to.Main 8080

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

Maven – средство сборки

31

Свойства сборки

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

Maven – средство сборки

32

Инструкции сборки

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

Сборка и запуск

33

mvn compile

mvn assemble:single

cp ./target/project.jar ./

java –classpath project.jar path.to.Main PORT

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

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

Stop server

35

curl http:/localhost:808N/admin?shutdown=1000

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

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

Виталий Чибриков[email protected]