Photon引擎是一款实时的Socket服务器和开发框架,快速、使用方便、容易扩展,提供基于room游戏的基本应用Lite,方便原型开发。
有关于Lite代码块例如:
namespace Lite
{
public class LiteGame : Room
{
protected override void ExecuteOperation(LitePeer peer, OperationRequest operationRequest, SendParameters sendParameters);
protected virtual Actor HandleJoinOperation(LitePeer peer, JoinRequest joinRequest, SendParameters sendParameters);
protected virtual void PublishCreateEvent(LitePeer peer, CreateRequest createRequest);
protected virtual void PublishJoinEvent(LitePeer peer, JoinRequest joinRequest);
protected virtual int RemovePeerFromGame(LitePeer peer, LeaveRequest leaveRequest);
protected void PublishEvent(EventData e, IEnumerable<Actor> actorList, SendParameters sendParameters);
protected virtual void HandleLeaveOperation(LitePeer peer, LeaveRequest leaveRequest, SendParameters sendParameters);
}
}
其中,Lite中会有Room类,在这个类中会有一些查找玩家的方法(就是Actor)
public class Room : IDisposable
{
protected ActorCollection Actors { get; }
public Actor GetActorByPeer(PeerBase peer);
}
public class Actor
{
public Actor();
public Actor(PeerBase peer);
public int ActorNr { get; set; }
public PeerBase Peer { get; set; }
public PropertyBag<object> Properties { get; }
public void AddGroup(ActorGroup group);
public void RemoveGroups(byte[] groupIds);
public override string ToString();
}
该视图是表示房间内消息,这是一个简单的消息发送与接受处理过程。
举一个发牌例子:玩家所在房间中会有4个人,这个时候,等一个玩家要摸牌的时候不能只给那一个玩家发送他接了那一张,而是应该分别告诉房间内所有的玩家他摸牌了,以为在别人界面也要显示这些,所有该信息一个在该房间内广播该信息。服务器端代码:
/// <summary>
/// 给房间内的玩家发送信息,msgID消息号
/// </summary>
/// <param name="msgID"></param>
/// <param name="ms"></param>
/// <param name="SendParameters"></param>
public void SendRoomMessage(int msgID, System.IO.MemoryStream ms, SendParameters SendParameters)
{
MessageBase msgBase = new MessageBase(msgID, ms);
EventData Response = new EventData((byte)MahjongOperationCodes.RoomOperation, msgBase.ConvertToEventParams());
PublicRoomEvents(Response, SendParameters);
}
/// <summary>
/// 给玩家发送接牌消息,
/// </summary>
/// <param name="getcard"></param>
/// <param name="Nr"></param>
void SendToPlayers_GetCard( int getcard,int Nr)
{
Photon.SocketServer.SendParameters sendParameters = new Photon.SocketServer.SendParameters();
using (MemoryStream ms = new MemoryStream())
{
//自己规定的类,其中内中可以自己规定
majiang_jiepai_RET jiepai_Ret = new majiang_jiepai_RET();
jiepai_Ret.cdone = getcard;//那一张牌
jiepai_Ret.post = Nr;//那个人
jiepai_Ret.thenumofcard = (108 - IndexIncard);//剩余牌数
MessageHandle.Serialize(ms, jiepai_Ret);
SendRoomMessage(MessageDefine.MSG_S2C_jiepai_RET, ms, sendParameters);
}
}
在这个例子中就是表示将某一个玩家接了那张牌在房间内广播发送,在消息的传送中,主要依靠消息号来区分消息内容,其中在房间中,每个人呢会有自己独立的NR,可以用于区分于其他的玩家。客户端代码:
void Whowhatjiepai(MessageBase msgBase) //谁接牌了,在谁那里显示一张牌(把从服务器收到的消息,通过UI显示出来)
{
majiang_jiepai_RET jiepai_RET = RoomManager.Instance.Isme(chupai_RET.post);;//将其相对象的消息转成对应的信息
bool isme = MessageHandle.Deserialize<majiang_jiepai_RET>(msgBase.Data);
if (isme)
{
//如果是自己接牌了,就让在下面显示出来自己的多的那张牌
//进行逻辑处理
}
else //如果不是自己接牌,就看接牌人的位置是自己的哪个方向(左边、右边、对面)在相应的位置显示多一张牌
{
//进行逻辑处理
}
}
这就是一个基本的一个服务器发送给客户的例子。接下来是客户端给服务器发送信息,下面以出牌为例:
public void OutCDone(int index) //出牌的方法(向服务器发送一个出牌的信息)
{
using (MemoryStream ms = new MemoryStream()) //向服务器发送一条要接牌的消息
{
majiang_chupai chupai = new majiang_chupai();//这种信息类是自己规定的
chupai.cdone = index;
MessageHandle.Serialize(ms, chupai);
PhotonEngineLogin.Instance.SendRoomMessage(MessageDefine.MSG_C2S_chupai, ms);
Ischupai = false;
}
}
这样一来就就需要服务器的接收该消息,并做处理,服务器端代码:
MahjongRoom GetRoom()//获得是那个房间的
{
RoomReference roomReference = ((KylinstarMahjongServer.MahjongPeer)Peer).GetRoomReference();
MahjongRoom room = roomReference.Room as MahjongRoom;
return room;
}
public void WhoToChuPai_S(MessageBase msgBase, Photon.SocketServer.SendParameters sendParameters)//谁出的牌
{
majiang_chupai chupai = MessageHandle.Deserialize<majiang_chupai>(msgBase.Data);
MahjongRoom roomServer = GetRoom();
Player player = roomServer.GetPlayerByPeerX(Peer);
roomServer.outCard(chupai.cdone);//调用房间中出牌所对应的处理
}