实现游戏房(基于NERoom)
更新时间: 2024/08/14 14:11:32
网易云信基于 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 及以上版本的真机。 |
前提条件
- 已集成 NERoom房间组件
- 已实现语聊房
- 已开通能力
- 已配置消息抄送地址,开通聊天室全员进出抄送
- 已联系技术支持开通小游戏服务
示例项目源码
游戏房的示例项目源码地址请参见 游戏房示例项目源码。
示例项目的目录结构和跑通示例项目的步骤请参见跑通示例项目。
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 下载并引入示例项目源码
-
下载 游戏房示例项目源码,拷贝
gamekit
和game-ui
目录至本地工程中,执行如下代码进行导入。include(":voiceroomkit") include(":voiceroomkit-ui-base") include(":gamekit:gamekit") include(":gamekit:SudMGPWrapper") include(":game-ui") include(":entertainment-common") include(":ordersong")
-
在项目对应模块的
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"))
-
在项目对应的根目录的
build.gradle
中添加依赖。allprojects { repositories { mavenCentral() maven { setUrl("https://oss.sonatype.org/content/repositories/snapshots/") } } }
实现游戏房除了游戏房特有的步骤,还需要实现语聊房的基础功能,包括登录鉴权、主播开播、观众进入房间、麦位管理,具体请参见实现语聊房。
步骤2 初始化 GameKit
- 请在加入 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);
}
});
-
注册监听小游戏事件。
调用
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 主播选择并创建游戏
-
主播调用
getGameList
接口获取游戏列表。返回相关信息,包括游戏 ID、游戏名称、游戏规则等。
-
(可选) 获取游戏详细信息。
调用
getRoomGameInfo
接口获取房间内游戏的详细信息,包括最大支持玩家数量等。 -
主播选择一款游戏,调用
createGame
接口创建游戏。 -
游戏创建后,会触发
onGameCreated
事件,通知语聊房内的用户,主播已经开启了游戏。 -
调用
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 主播和玩家参与游戏
-
(可选)主播参与游戏
主播可以参与游戏进行带玩,也可以不参与游戏。
- 主播调用
joinGame
接口参与游戏。 - 参与游戏后,会触发
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); } });
- 主播调用
-
玩家参与游戏
-
玩家上麦。
玩家调用
submitSeatRequest
接口申请上麦。 -
玩家在收到
onGameCreated
事件后,调用joinGame
接口参与游戏。 -
参与游戏后,会触发
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 主播开始游戏
- 主播调用
startGame
接口开始游戏。 - 游戏开始后,会触发
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 主播结束游戏
- 主播调用
endGame
接口结束游戏。 - 游戏结束后,会触发
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();