游戏服务器概述:
游戏服务器装载着游戏对外服务,对于房间类游戏其功能包括房间的创建、进入房间、离开房间、开始游戏、结束游戏。由于不同游戏对应的逻辑不通,如果需要代码共用,则可将房间的操作分离出来做成一个共用库。只有游戏开始后和游戏结束之间的逻辑不同,因此可以像回调函数一样,当传入的信息游戏框架无法识别则可调用我们设置的回调函数。或者同时需要框架处理和游戏逻辑处理。这样就很好的分离两者,降低编码复杂度。
游戏服务器结构:
游戏服务器细节
例如用户进入房间时框架先逻辑处理再调用游戏逻辑提供的接口再次进行处理,代码如下:
// OnUserEnter 用户进入房间
func (g *GameLogicBase) OnUserEnter(user *User) {
fmt.Println("OnUserEnter 用户进入房间")
if g.Room.GetSignId() != user.GetUserRoomSignId() {
fmt.Printf("GameLogicBase: OnUserEnter g.Room.getRoomID()=%v user.GetUserRoomId()=%v\n", g.Room.GetSignId(), user.GetUserRoomSignId())
return
}
UserSeatId := user.GetUserSeatId()
// 通知用户房间内的其他人 通知其他用户有玩家进入
for seatid, seatuser := range g.Room.GetSeatUsers() {
if seatid != UserSeatId {
SendOtherUserEnterRoom(user, seatuser)
SendOtherUserEnterRoom(seatuser, user)
}
}
// 调用子逻辑
g.Interface.OnUserEnter(user)
}
当框架无法识别此信息则可以调用游戏逻辑接口,代码如下:
// OnMessage 处理信息
func (g *GameLogicBase) OnMessage(user *User, message *grpc_common.Message) {
//fmt.Println("OnMessage 处理信息")
if message == nil {
fmt.Printf("GameLogicBase: OnMessage message is nil\n")
return
}
g.Interface.OnMessage(user, message)
}
如果是实时性较强的游戏,则需要仔细考虑锁的使用,否则延迟较大。