NGame — это Java-фреймворк для разработки сетевых игровых серверов, основанный на Spring Boot и Netty. Он идеально поддерживает IOC (Inversion of Control) и AOP (Aspect-Oriented Programming).
JNGame предлагает RPC-вызовы, использует WebSocket и UDP, имеет зрелый API с аннотациями и позволяет быстро запускать различные серверы.
NGame также включает в себя различные игровые движки для многопользовательских игр и синхронизации, включая Cocos, Unity и другие.
Обновление проекта продолжается...
Если у вас возникли проблемы, пожалуйста, свяжитесь со мной по QQ:2858626794.
Master — код сервера JNGame, который содержит основной код NGame и код для каждого демонстрационного сервера.
Синхронизация состояний: синхронизация осуществляется через передачу состояний от каждого клиента. Этот режим подходит для длительной синхронизации и поддерживает физическую передачу прав.
Преимущества:
Недостатки:
Фреймовая синхронизация: синхронизация происходит через передачу операций от каждого клиента и отслеживание фреймов. Этот режим требует поддержки физического определения от игрового движка.
Преимущества:
Недостатки:
Синхронное состояние: сервер моделирует мир и отправляет состояния клиентам (в настоящее время реализуется через мост NGame).
Преимущества:
Недостатки:
Чтобы запустить NGame, выполните следующие шаги:
Каталог NGame содержит следующие папки:
Для использования RPC в NGame выполните следующие действия:
Пример использования RPC:
@Component //注入到Spring 容器中
@NGameRPCClass //声明这个类是RPC 类
public class SNGameAction extends NCallServiceImpl {
/**
* RPC 传输测试 ProtoBuf GSnakeHelloMessage 对象传输
* 推荐: 底层传输格式 ProtoBuf
* client - 声明的方法 可以 接收 NClient 参数 - 调用者
*/
@NGameRPCMethod //声明这个方法是RPC 方法
public void nGameProtoBuf(CocosNClient client, GSnakeMessage.GSnakeHelloMessage message){
}
/**
* RPC 传输测试 参数传输
* 不推荐 : 底层实现数据格式是 JSON
*/
@NGameRPCMethod
public void nGameParams(@NRPCParam("name") String name,@NRPCParam("userId") Integer userId,@NRPCParam("user") HashMap user){
}
/**
* RPC 传输测试 无参传输
*/
@NGameRPCMethod
public void nGameHello(){}
/**
* RPC 传输测试 UID
*/
@NUIDMode(3)
@NGameRPCMethod(mode = NRPCMode.UID)
public void nGameUUIDMode(){}
}
Для запуска сервера можно использовать следующие методы:
WebSocket: используйте SpringBoot для запуска сервера.
@ServerEndpoint(
value = "/game/{roomId}/{uuid}",
encoders = {DefaultProtoBufEncoder.class}, //Protobuf 编码
decoders = {DefaultProtoBufDecoder.class} //Protobuf 解码
)
@Controller
public class GameWebSocket {
@OnOpen
public void onOpen(Session session){}
@OnMessage
public void onMessage(Session session,NGameMessage message){}
@OnClose
public void onClose(Session session){}
@OnError
public void onError(Session session, Throwable t){}
}
UDP-сервер: используйте NGame + Netty для запуска UDP-сервера.
@AJNetty( //NGame Netty 服务注解
port = 1000, //端口
network = UDPJNettyNetwork.class, //协议 这里是 UDP 服务 继承 JNettyNetwork 实现启动
decoders = {
DefaultProtoBufDecoder.class //Protobuf 编码 继承 JNByteToMessageDecoder NGame 编码器
},
encoders = {
DefaultProtoBufEncoder.class //Protobuf 解码 继承 JNMessageToByteEncoder NGame 解码器
}
)
@Component // 加入到Spring 容器 (支持注入)
public class GameUDPServer {
/**
* 初始化开始 - 用于修改Network信息
*/
@JNInit
public void initNetwork(UDPJNettyNetwork network){}
/**
* 初始化成功
*/
@JNInitSuccess
public void initNetworkSuccess(UDPJNettyNetwork network){}
/**
* 打开用户连接
*/
``` Вот перевод текста на русский язык:
@JNOpen
public void onOpen(UDPSession session, UDPSessionGroup clients) {
}
/**
* Получение сообщения от пользователя
*/
@JNMessage
public void onMessage(UDPSession session, UDPSessionGroup clients, NGameMessage message, String text) {
}
/**
* Закрытие соединения с пользователем
*/
@JNClose
public void onClose(UDPSession session, UDPSessionGroup clients) {
}
}
#### NGame синхронный режим
##### NSyncFPSMode синхронный фреймовый режим
- Сбор данных и отправка их по расписанию.
@Component
@NGameRPCClass
public class SNCocosFrameAction extends NCallServiceImpl {
// Синхронные nSyncModes
NSyncFPSMode<Object> nSyncFPSMode = null;
// Список клиентов
public Map<String, CocosFrameNClient> clients = null;
/**
* Добавление ввода в фрейм синхронизации
* @param inputs ввод
*/
@NGameRPCMethod
public void nGameFrameInput(@NRPCParam("inputs") List<Object> inputs) {
if (Objects.isNull(nSyncFPSMode)) return;
nSyncFPSMode.addFPSInfos(inputs); // Добавление ввода к текущему фрейму
}
/**
* Запуск фреймовой синхронизации
*/
public void nGameSyncStart() {
if (Objects.nonNull(nSyncFPSMode)) return;
// Создание объекта фреймовой синхронизации
nSyncFPSMode = new NSyncFPSMode<>();
nSyncFPSMode.setIntervalTime(1000/15); // Установка интервала синхронизации
/Синхронная функция сервиса добавлена - NCallServiceImpl
addRegister(nSyncFPSMode);
// Запуск синхронизации
nSyncFPSMode.start();
System.out.println("SNCocosFrameAction - nGameSyncStart : запуск синхронного режима");
}
/**
* Обратный вызов синхронного режима
*/
@NSyncFPSMethod
public void nGameSyncCallBack(String uuid, NFPSInfo<Object> nFPSInfo) {
if (Objects.isNull(clients)) return;
// Отправка фреймовых данных всем клиентам
clients.values().forEach(client -> {
client.getCnCocosFrameAction().nGameSyncInputCallBack(nFPSInfo);
});
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )