房间类游戏后台框架(四)—游戏服务器

游戏服务器概述:

  游戏服务器装载着游戏对外服务,对于房间类游戏其功能包括房间的创建、进入房间、离开房间、开始游戏、结束游戏。由于不同游戏对应的逻辑不通,如果需要代码共用,则可将房间的操作分离出来做成一个共用库。只有游戏开始后和游戏结束之间的逻辑不同,因此可以像回调函数一样,当传入的信息游戏框架无法识别则可调用我们设置的回调函数。或者同时需要框架处理和游戏逻辑处理。这样就很好的分离两者,降低编码复杂度。

 游戏服务器结构:

                                

游戏服务器细节

例如用户进入房间时框架先逻辑处理再调用游戏逻辑提供的接口再次进行处理,代码如下:

// 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)
}

如果是实时性较强的游戏,则需要仔细考虑锁的使用,否则延迟较大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值