程序包 com.iohao.game.widget.light.room.domain


package com.iohao.game.widget.light.room.domain
扩展模块 - 桌游类、房间类游戏 - 规避并发的领域事件。 see 文档 - domain-event 领域事件 在使用 room 模块的领域事件时,还需要做以下配置。将领域事件集成到 room 模块中。

启动项. see 文档 - Runner 扩展机制


 public class MyRoomDomainRunner implements Runner {
     @Override
     public void onStart(BarSkeleton skeleton) {
         // 领域事件上下文参数
         DomainEventContextParam contextParam = new DomainEventContextParam();
         // 配置领域事件 - 玩法操作相关
         contextParam.addEventHandler(new OperationContextEventHandler());
         // 游戏流程相关
         contextParam.addEventHandler(new GameFlowEventHandler());

         // 启动事件驱动
         DomainEventContext domainEventContext = new DomainEventContext(contextParam);
         domainEventContext.startup();
     }
 }

 // 业务框架构建器
 BarSkeletonBuilder builder = ...;
 // 启动项
 builder.addRunner(new MyRoomDomainRunner());
 
 

OperationContext 玩法操作上下文领域事件,用于规避并发


 // 创建玩法操作上下文
 OperationContext operationContext = OperationContext.of(room, operationHandler)
     // 当前操作的玩家
     .setFlowContext(flowContext)
     // 开发者根据游戏业务定制的操作数据
     .setCommand(command);

 // 领域事件相关,https://www.yuque.com/iohao/game/gmfy1k
 DomainEventPublish.send(operationContext);
 
 

GameFlowEo,可规避 GameFlowService 中的并发问题


 // 发送领域事件
 GameFlowContext context = GameFlowContext.of(room, flowContext);
 new GameFlowEo(flowContext, () -> {
     // 进入房间
     this.roomService.enterRoom(context);
 }).send();

 GameFlowContext gameFlowContext = GameFlowContext.of(room, flowContext);
 new GameFlowEo(flowContext, () -> {
     // 退出房间
     this.roomService.quitRoom(gameFlowContext);
 }).send();

 GameFlowContext context = GameFlowContext.of(room, flowContext);
 new GameFlowEo(flowContext, () -> {
     // 开始游戏
     this.roomService.startGame(context);
 }).send();

 
 
从以下版本开始:
21.8
作者:
渔民小镇
日期:
2024-05-15