正在做一个麻将游戏photon服务器,看了许多博客都是其框架知识,就把游戏中核心一些实例代码发一下。
首先是服务器接收客户信息并处理:
1)一个服务器核心类 public class ConnectPeer:ClientPeer 用于向客户端传输信息
根据用于传输的事件的类型来具接收后根据抽象类实现不同事件:Execute
protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
{
var code = operationRequest.OperationCode;
var response = handlerDic[code].Execute(operationRequest);//具体实现抽象方法 根据参数实现不同事件
SendOperationResponse(response, sendParameters);//传递事件给自己
}
服务器接收的不同的抽象事并实现:
public ConnectPeer(InitRequest initRequest) : base(initRequest)
{ 各种事件
handlerDic[OperationCode.MAHJ_EXECUTE] = new MahjGameOperation(this);
handlerDic[OperationCode.LOGIN] = new OnLogin(this);
handlerDic[OperationCode.CREATE_ROOM] = new CreateRoom(this);
handlerDic[OperationCode.CHECK_CREATE_ROOM] = new CheckCreateRooms(this);
handlerDic[OperationCode.JOIN_ROOM] = new JoinRoom(this);
handlerDic[OperationCode.DISSOLVE_ROOM] = new DissolveRoom(this);
handlerDic[OperationCode.READY_GAME] = new ReadyGame(this);
handlerDic[OperationCode.CHAT] = new ChatHandle(this);
}
抽象类 各事件继承它
public abstract class BaseHandler
{
protected ConnectPeer Peer;
protected BaseHandler(ConnectPeer peer)
{
Peer = peer;
}
public abstract OperationResponse Execute(OperationRequest operationRequest);
}
2)服务器向向客户端传输信息
1.SendOperationResponse(response, sendParameters);//传递事件给自己
2. public void SendMsg(byte msgCode, Dictionary<byte, object> data, ConnectPeer recipient)
{
向单个客户recipient端发送信息
IEventData evt = new EventData(msgCode, data);
recipient.SendEvent(evt, new SendParameters());//发送信息方法
}
一个传输通讯集合 存储着客户端
public List<ConnectPeer> RecipteList(ConnectPeer except)
{
return
(from cardPartner in PartnerArray
where cardPartner.UserPeer != except && cardPartner.UserPeer != null
select cardPartner.UserPeer).ToList();
}
IEnumerable<ConnectPeer> recipientList 存储一个房间内所有的客户(当加入房间时存储,离开再清除)
public void SendMsg(byte msgCode, Dictionary<byte, object> data, IEnumerable<ConnectPeer> recipientList)
{ 向多个客户recipient 端发送信息
IEventData evt = new EventData(msgCode, data);
foreach (var recipient in recipientList)
{
recipient.SendEvent(evt, new SendParameters());//发送信息给其他客户端
}
}
数据的序列化用于传输
例如: data[ParameterCode.RULE] = mahjRoom.Rule.Serialize();
data[ParameterCode.USERS] = room.Players.Serialize();
数据的反序列化用于解析得到信息
例如 : var data = operationRequest.Parameters; 转换为data
var myUser = data.GetValue(ParameterCode.MY_USER).Deserialize<MyUser>();还有通过peer得到信息Var mahjRoom = Peer.JoinedRoom as AutomaticMahj;
传输的peer是可以得到传输的客户端用户等信息
private CardPartner GetPartner(ConnectPeer peer) => PartnerArray.First(
partner => partner.UserPeer.User.Unionid == peer.User.Unionid);//根据peer中user属性的unionid获取Partner