用Photon中的room做麻将房间

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();
    }

该视图是表示房间内消息,这是一个简单的消息发送与接受处理过程。

Created with Raphaël 2.1.0 客户端 客户端 服务器 服务器 发送碰、杠、胡、出牌等信息。 广播发送碰、杠、胡、出牌等消息。 客户端再次接受并处理其信息返回状态(也可不返回,看需求)

举一个发牌例子:玩家所在房间中会有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);//调用房间中出牌所对应的处理
        }

这就是服务器与客户端的通讯过程例子

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值