实现游戏房(基于NERoom)

更新时间: 2023/12/01 08:36:54

网易云信基于 NERoom 房间组件搭建了一套开源的游戏房客户端和游戏房服务端,您可以基于该示例项目源码,在语聊房的基础上快速实现游戏房。本文介绍游戏房的实现方法。

开发环境要求

开发环境要求如下:

环境要求 说明
JDK 版本 1.8.0 及以上版
Android API 版本 API 21 及以上版本
Android Studio 版本 5.0 及以上版本
CPU架构 ARM 64、ARMV7
IDE Android Studio
其他 依赖 Androidx,不支持 support 库。
Android 系统 5.0 及以上版本的真机。

前提条件

示例项目源码

游戏房的示例项目源码地址请参见 游戏房示例项目源码

示例项目的目录结构和跑通示例项目的步骤请参见跑通示例项目

API 时序图

sequenceDiagram
    autonumber
    participant hostClientA as 主播 
    participant roomA as NERoom
    participant room_server as NERoom_Server 
    participant roomB as NERoom  
    participant audienceB as 观众  

    note over hostClientA,audienceB:创建游戏房
    hostClientA ->> room_server:创建房间 
    room_server-->> hostClientA:创建成功
    hostClientA->> roomA:加入房间(joinRoom)
    roomA->>room_server:加入房间(joinRoom)
    room_server-->>roomA:success
    roomA-->>hostClientA:success
    hostClientA->>roomA:上麦(submitSeatRequest)
    roomA->>room_server:上麦(submitSeatRequest)
    room_server-->>roomA:success
    roomA-->>hostClientA:success

    audienceB->> roomB:加入房间(joinRoom)
    roomB->>room_server:加入房间(joinRoom)
    room_server-->>roomB:success
    roomB-->>audienceB:success
    audienceB->>roomB:申请上麦(submitSeatRequest)
    roomB->>room_server:申请上麦(submitSeatRequest)
    room_server-->>roomB:success
    roomB-->>audienceB:success
sequenceDiagram
    autonumber

    participant hostClientA as 主播 
    participant kitA as GameKit
    participant app_server as 游戏房_Server 
    participant kitB as GameKit  
    participant audienceB as 观众  

    note over hostClientA,audienceB:选择并创建游戏
    hostClientA ->> kitA:获取游戏列表(getGameList)
    kitA -->> app_server:调用游戏房Server的http接口获取游戏列表<br>(/nemo/game/list)
    kitA -->> hostClientA:返回相关信息,<br>包括游戏 ID、游戏名称、游戏规则等
    hostClientA ->> kitA:选择一款游戏,创建游戏(createGame)
    kitA ->> app_server:调用游戏房Server的http接口创建游戏<br>(/nemo/game/create)
    app_server ->> kitA:开始游戏(1102)
    kitA ->> hostClientA:主播开启了XX游戏(onGameCreated)
    app_server ->> kitB:开始游戏(1102)
    kitB ->> audienceB:主播开启了XX游戏(onGameCreated)
    hostClientA->>kitA:加载游戏(loadGame) 
    kitA-->>hostClientA:success
    hostClientA-->>hostClientA:加载游戏画面,刷新UI

    audienceB->>kitB:加载游戏(loadGame) 
    kitB-->>audienceB:success
    audienceB-->>audienceB:加载游戏画面,刷新UI


    note over hostClientA,audienceB:参与游戏

    note over hostClientA,app_server:主播参与游戏
    hostClientA ->> kitA:参与游戏(joinGame)
    kitA ->> app_server:调用游戏房Server的http接口参与游戏<br>(/nemo/game/join)
    app_server -->> kitA:success
    kitA -->> hostClientA:success
    hostClientA ->> hostClientA:刷新UI<br>麦位状态变为“已准备”,按钮从“参与游戏”变为“退出”
    note over app_server,audienceB: 观众参与游戏 
    audienceB ->> kitB:参与游戏(joinGame)
    kitB ->> app_server:调用游戏房Server的http接口参与游戏<br>(/nemo/game/join)
    alt 已上麦
        app_server -->> kitB:success
        kitB -->> audienceB:success
    end
    alt 满足游戏开始规则
    app_server -->>hostClientA:发送游戏成员已准备OK
    hostClientA -> hostClientA: 游戏页面"开始游戏"高亮
    end

sequenceDiagram
    autonumber

    participant hostClientA as 主播 
    participant kitA as GameKit
    participant app_server as 游戏房_Server 
    participant kitB as GameKit
    participant audienceB as 观众 

    note over hostClientA,audienceB:主播点击"开始游戏"按钮
    hostClientA ->>kitA:开始游戏(startGame)
    kitA ->>app_server:调用游戏房Server的http接口开始游戏<br>(/nemo/game/start)
    alt 人数不足
        app_server -->>kitA:failed
        kitA -->>hostClientA:failed
        hostClientA ->>hostClientA:提示"参与人数不足,无法开启游戏"

 
    else 人数满足
        app_server -->>kitA:success
        app_server->>kitA:开始游戏(1102)
        kitA->>hostClientA:游戏已开始(onGameStarted)
        hostClientA->>kitA:加载游戏(loadGame) 
        kitA-->>hostClientA:success
        hostClientA-->>hostClientA:加载游戏画面,刷新UI
        app_server->>kitB:开始游戏(1102)
        kitB->>audienceB:onGameStarted
        audienceB->>kitB:加载游戏(loadGame) 
        kitB-->>audienceB:success
        audienceB-->>audienceB:加载游戏画面,刷新UI
    end
    note over hostClientA,audienceB:结束游戏
    hostClientA ->>kitA:结束游戏(endGame)
    kitA ->>app_server:调用游戏房Server的http接口开始游戏<br>(/nemo/game/end)
    app_server ->>kitA:主播结束了XX游戏(onGameEnded)
    kitA ->>hostClientA:主播结束了XX游戏(onGameEnded)
    app_server ->>kitB:主播结束了XX游戏(onGameEnded)
    kitB ->>audienceB:主播结束了XX游戏(onGameEnded)
    hostClientA->>kitA:销毁游戏(unloadGame)
    audienceB->>kitB:销毁游戏(unloadGame)  

实现方法

步骤1 下载并引入示例项目源码

  1. 下载 游戏房示例项目源码,拷贝 gamekitgame-ui目录至本地工程中,执行如下代码进行导入。

    include(":voiceroomkit")
    include(":voiceroomkit-ui-base")
    include(":gamekit:gamekit")
    include(":gamekit:SudMGPWrapper")
    include(":game-ui")
    include(":entertainment-common")
    include(":ordersong")
    
    
  2. 在项目对应模块的 build.gradle 中加入以下行,添加依赖。

    api(project(":voiceroomkit"))
    api(project(":voiceroomkit-ui-base"))
    api(project(":gamekit:gamekit"))
    api(project(":gamekit:SudMGPWrapper"))
    api(project(":game-ui"))
    api(project(":entertainment-common"))
    api(project(":ordersong"))
    
  3. 在项目对应的根目录的 build.gradle 中添加依赖。

    allprojects {
        repositories {
            mavenCentral()
            maven {
            setUrl("https://oss.sonatype.org/content/repositories/snapshots/")
            }
        }
    }
    

实现游戏房除了游戏房特有的步骤,还需要实现语聊房的基础功能,包括登录鉴权、主播开播、观众进入房间、麦位管理,具体请参见实现语聊房

步骤2 初始化 GameKit

  1. 请在加入 NERoom 房间之后,调用 initialize 接口初始化 GameKit。

示例代码

String appKey="your appKey";
String userUuid = "your userUuid";
String userToken = "your userToken";
String baseUrl = "your baseUrl";
NEGameKitOptions options =
    new NEGameKitOptions(appKey, roomUuid, baseUrl);
NEGameLoginInfo loginInfo =
    new NEGameLoginInfo(userUuid, userToken);
NEGameKit.getInstance().initialize(
    options,
    loginInfo,
    new NEGameCallback2<Unit>() {
        @Override
        public void onSuccess(@Nullable Unit data) {
        super.onSuccess(data);
        
        }

        @Override
        public void onError(int code, @Nullable String message) {
        super.onError(code, message);
        }
    });
  1. 注册监听小游戏事件。

    调用 addGameListener 接口注册监听小游戏事件。

示例代码

 NEGameKit.getInstance().addGameListener(new NEGameListener() {
        @Override
        public void onGameCreated(@NonNull NEGameCreatedEvent event) {
            
        }

        @Override
        public void onGameStarted(@NonNull NEGameStartedEvent event) {

        }

        @Override
        public void onGameEnded(@NonNull NEGameEndedEvent event) {

        }

        @Override
        public void onMemberJoinGame(@NonNull List<? extends NERoomMember> members) {

        }

        @Override
        public void onMemberLeaveGame(@NonNull List<? extends NERoomMember> members) {

        }

        @Override
        public void onGameError(int code, @NonNull String msg) {

        }

        @Override
        public void onGamePublicMessage(@NonNull GamePublicMessageEvent event) {

        }

        @Override
        public void onGameKeyWordToHit(@NonNull GameKeyWordToHitEvent event) {

        }

        @Override
        public void onGameSelfClickGameSettleClose() {

        }

        @Override
        public void getGameRect(@NonNull GameViewInfoModel gameViewInfoModel) {

        }

        @Override
        public void onMemberPainting(@NonNull GameMemberPaintingEvent event) {

        }
    });

步骤3 主播选择并创建游戏

  1. 主播调用 getGameList 接口获取游戏列表。

    返回相关信息,包括游戏 ID、游戏名称、游戏规则等。

  2. (可选) 获取游戏详细信息。

    调用 getRoomGameInfo 接口获取房间内游戏的详细信息,包括最大支持玩家数量等。

  3. 主播选择一款游戏,调用 createGame 接口创建游戏。

  4. 游戏创建后,会触发 onGameCreated 事件,通知语聊房内的用户,主播已经开启了游戏。

  5. 调用 loadGame 接口加载游戏。

    游戏加载完成后,即可开始玩游戏。

示例代码

// 获取游戏列表
NEGameKit.getInstance().getGameList(new NEGameCallback2<NEGameList>() {
        @Override
        public void onSuccess(@Nullable NEGameList data) {
            super.onSuccess(data);
        }

        @Override
        public void onError(int code, @Nullable String message) {
            super.onError(code, message);
        }
    });
    // 监听游戏事件
      NEGameKit.getInstance().addGameListener(new NEGameListener() {
        @Override
        public void onGameCreated(@NonNull NEGameCreatedEvent event) {
            // 游戏被创建的回调
        }
    });

// 创建游戏
    String gameId = "gameId";
    String extra = "extra";
    NEGameKit.getInstance().createGame(new NECreateGameParams(gameId,extra), new NEGameCallback2<Unit>() {
        @Override
        public void onSuccess(@Nullable Unit data) {
            super.onSuccess(data);
        }

        @Override
        public void onError(int code, @Nullable String message) {
            super.onError(code, message);
        }
    });

// 获取游戏详细信息
    NEGameKit.getInstance().getRoomGameInfo(new NEGameCallback2<NERoomGameInfo>() {
        @Override
        public void onSuccess(@Nullable NERoomGameInfo data) {
            super.onSuccess(data);
        }

        @Override
        public void onError(int code, @Nullable String message) {
            super.onError(code, message);
        }
    });

    // 加载游戏
    String gameId="gameId";
    String language="zh-CN";
    NEGameKit.getInstance().loadGame(new NELoadGameParams(gameId,language,this), new NEGameCallback2<View>() {
      @Override
      public void onSuccess(@Nullable View data) {
        super.onSuccess(data);
      }

      @Override
      public void onError(int code, @Nullable String message) {
        super.onError(code, message);
      }
    });

步骤4 主播和玩家参与游戏

  • (可选)主播参与游戏

    主播可以参与游戏进行带玩,也可以不参与游戏。

    1. 主播调用 joinGame 接口参与游戏。
    2. 参与游戏后,会触发 onMemberJoinGame 回调,通知语聊房内的所有用户。

    示例代码

    NEGameKit.getInstance().addGameListener(new NEGameListener() {
    
        @Override
        public void onMemberJoinGame(@NonNull List<? extends NERoomMember> members) {
            
        }
    });
        String gameId="gameId";
        NEGameKit.getInstance().joinGame(new NEJoinGameParams(gameId), new NEGameCallback2<Unit>() {
            @Override
            public void onSuccess(@Nullable Unit data) {
                super.onSuccess(data);
            }
    
            @Override
            public void onError(int code, @Nullable String message) {
                super.onError(code, message);
            }
        });
    
  • 玩家参与游戏

    1. 玩家上麦。

      玩家调用 submitSeatRequest 接口申请上麦。

    2. 玩家在收到 onGameCreated 事件后,调用 joinGame 接口参与游戏。

    3. 参与游戏后,会触发 onMemberJoinGame 回调,通知语聊房内的所有用户。

    示例代码

    // 监听麦位事件
    NEVoiceRoomKit.getInstance().addVoiceRoomListener(new NEVoiceRoomListenerAdapter(){
            @Override
            public void onSeatRequestApproved(int seatIndex, @NonNull String account, @NonNull String operateBy, boolean isAutoAgree) {
                super.onSeatRequestApproved(seatIndex, account, operateBy, isAutoAgree);
                // 收到主播同意账号为account的用户上麦的通知
            }
        });
    
    // 申请上麦
    NEVoiceRoomKit.getInstance().submitSeatRequest(new NEVoiceRoomCallback<Unit>() {
            @Override
            public void onSuccess(@Nullable Unit unit) {
                
            }
    
            @Override
            public void onFailure(int code, @Nullable String msg) {
    
            }
        });
    
    NEGameKit.getInstance().addGameListener(new NEGameListener() {
    
        @Override
        public void onMemberJoinGame(@NonNull List<? extends NERoomMember> members) {
            
        }
    });
        String gameId="gameId";
        NEGameKit.getInstance().joinGame(new NEJoinGameParams(gameId), new NEGameCallback2<Unit>() {
            @Override
            public void onSuccess(@Nullable Unit data) {
                super.onSuccess(data);
            }
    
            @Override
            public void onError(int code, @Nullable String message) {
                super.onError(code, message);
            }
        });
    

步骤5 主播开始游戏

  1. 主播调用 startGame 接口开始游戏。
  2. 游戏开始后,会触发 onGameStarted 回调,通知语聊房内的所有用户游戏已开始。

示例代码

NEGameKit.getInstance().addGameListener(new NEGameListener() {

    @Override
    public void onGameStarted(@NonNull NEGameStartedEvent event) {
        
    }

});

    String gameId="gameId";
    NEGameKit.getInstance().startGame(new NEStartGameParams(gameId), new NEGameCallback2<Unit>() {
      @Override
      public void onSuccess(@Nullable Unit data) {
        super.onSuccess(data);
      }

      @Override
      public void onError(int code, @Nullable String message) {
        super.onError(code, message);
      }
    });

步骤6 主播结束游戏

  1. 主播调用 endGame 接口结束游戏。
  2. 游戏结束后,会触发 onGameEnded 回调,通知语聊房内的所有用户游戏已结束。

示例代码

NEGameKit.getInstance().addGameListener(new NEGameListener() {
    @Override
    public void onGameEnded(@NonNull NEGameEndedEvent event) {
            
    }

});
NEGameKit.getInstance().endGame(new NEGameCallback2<Unit>() {
        @Override
        public void onSuccess(@Nullable Unit data) {
            super.onSuccess(data);
        }

        @Override
        public void onError(int code, @Nullable String message) {
            super.onError(code, message);
        }
    });

步骤7 销毁游戏,清理游戏资源

主播和玩家分别调用 destroy 接口销毁游戏。

示例代码

 NEGameKit.getInstance().destroy();
此文档是否对你有帮助?
有帮助
去反馈
  • 开发环境要求
  • 前提条件
  • 示例项目源码
  • API 时序图
  • 实现方法
  • 步骤1 下载并引入示例项目源码
  • 步骤2 初始化 GameKit
  • 步骤3 主播选择并创建游戏
  • 步骤4 主播和玩家参与游戏
  • 步骤5 主播开始游戏
  • 步骤6 主播结束游戏
  • 步骤7 销毁游戏,清理游戏资源