Photon服务器进阶&一个新游戏的出产(二)

继续上个文章说~

接收其他人发过来的广播,在OnEvent中进行响应

比如说接收过来加入的消息

    public void OnEvent(EventData eventData)
    {
        Debug.Log("触发了事件:" + eventData.ToStringFull());
        //处理服务器转发回来的事件
        switch (eventData.Code)
        {
            case LiteEventCode.Join:
                int actorNr = (int)eventData.Parameters[LiteEventKey.ActorNr];
                Debug.Log("玩家的编号为:" + actorNr);
                break;
        }
    }

这个消息是系统给的所以能用在LiteEventKey中的Code,而我们要传自定义的数据要怎么弄呢

case (byte)OpCodeEnum.getTag:
        Hashtable Message = (Hashtable)eventData.Parameters[LiteEventKey.Data];
        int tag = (int)Message[(byte)OpKeyEnum.tag];
        break;

OpCodeEnum和OpKeyEnum都是我自定义的枚举,而我们自定义的数据就存在LiteEventKey.Data中,这还没玩,这只是我们传输的哈希表,而真正的数据放在这个哈希表里。

而OnOperationResponse中的数据处理,和以前的还是一样的。这里就不进行讲解了。

说一下一个比较困扰的问题吧,对于指定群发。这回我们不用Lite方式,自己写一个指定群发。

博主这里有两种方法供参考,如有更牛逼的方法请多多指教。

先说第一种比较容易理解的。

当一个玩家连入服务器的时候就会在Application中新建一个Peer,这样看来,Application是掌管全局的。这样我们就可以用一个字典将每个Peer记录,来进行简单的群发操作。代码如下加在Application中

        public Dictionary<int, MyPeer> Peer = new Dictionary<int, MyPeer>();

        protected override PeerBase CreatePeer(InitRequest initRequest)
        {
            //建立连线并回传给Photon Server

            MyPeer mypeer = new MyPeer(initRequest.Protocol, initRequest.PhotonPeer);
            Peer.Add(mypeer.ConnectionId, mypeer);
            return mypeer;
        }

        public void radioEvent()
        {
            OperationResponse or = new OperationResponse();
            foreach (MyPeer mypeer in Peer.Values)
            {
                or.ReturnCode = 0;
                or.DebugMessage = ""; //返回消息
                or.OperationCode = (byte)OpCodeEnum.Login; //编码
                mypeer.SendOperationResponse(or, new SendParameters());
            }
        }

现在我们来看看第二种方法,在用第一种方法的时候会发现一个问题,我们怎么向Lite一样,分房间。指定广播(如果有人能解决这个问题谢谢分享),还有怎客户端发送消息给服务器的时候是在Peer端进行处理的,然而怎么调用Application端的群发也是个问题。

我用下面的方法来解决:

namespace Chat
{
    public class ChatPeer : PeerBase
    {
        private static readonly object syncRoot = new object();

        public ChatPeer(IRpcProtocol protocol,IPhotonPeer unmanagedPeer) : base(protocol, unmanagedPeer)
        {
            lock (syncRoot)
            {
                BroadcastMessage += this.OnBroadcastMessage;
            }
        }

        private static event Action<ChatPeer, EventData, SendParameters> BroadcastMessage;

        protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
        {
            lock (syncRoot)
            {
                BroadcastMessage -= this.OnBroadcastMessage;
            }
        }

        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
            var @event = new EventData(1) { Parameters = operationRequest.Parameters };
            lock (syncRoot)
            {
                BroadcastMessage(this, @event, sendParameters);
            }

            var response = new OperationResponse(operationRequest.OperationCode);
            this.SendOperationResponse(response, sendParameters);

        }

        private void OnBroadcastMessage(ChatPeer peer, EventData @event, SendParameters sendParameters)
        {
            if (peer != this)
            {
                this.SendEvent(@event, sendParameters);
            }
        }

    }
}

首先是一个Action委托(不知道委托是什么意思的可以百度一下)

private static event Action<ChatPeer, EventData, SendParameters> BroadcastMessage; // 静态让他常驻内存

Peer被创建的同时将一个OnBriadcastMessage的委托给BrioadcastMessage

当服务器收到客户端发来的群发消息时,启用委托

BroadcastMessage(this, @event, sendParameters);

将在BroadcastMessage中的委托都执行一遍,通过

if (peer != this) { this.SendEvent(@event, sendParameters); }

来控制给谁群发。很强大的方法。貌似是官方的Demo。

时间: 2024-10-14 03:26:43

Photon服务器进阶&一个新游戏的出产(二)的相关文章

Photon服务器进阶&amp;一个新游戏的出产(一)

许久没写了,今日闲来无事随性一些,总结一下最近的游戏经历(写游戏) Photon服务器的进阶~ 距离上一篇估计也过去一个多月了,对于Photon真是又爱又恨. 爱着它的书写方便. 恨着它的教程稀少总走弯路,但最后都不知道爱不爱着了. 作为服务器的进阶就得讲点高逼格的东西啦. 老套路给教程.我的经验都是对别的教程的理解或者是升华,想自己升华的果断点完教程然后右上角吧. http://search.jikexueyuan.com/course/?q=Photon    //极客学院对于Photon的

Photon服务器进阶&amp;一个新游戏的出产(三)

下面或许该介绍介绍我用Photon写的一个4人联机麻将了~ 上图

给线上服务器增加一个新的域名

首先编辑apache的配置文件,/etc/httpd/conf/httpd.conf或者/usr/local/apache/conf/httpd.conf 加入如下内容: <VirtualHost *:8050> ServerAdmin www.wangzai.net DocumentRoot "/home/mysrc/wangzai" ServerName www.wangzai.net ServerAlias www.wangzai.net ErrorLog "

新游戏《机械险境》

上星期刚完成一个新游戏,<机械险境>. 游戏玩法:点击屏幕,机器人伸出绳子,通过摇荡前进,同时避开障碍物,前进的越远得分越高~! 游戏制作难点: 1.钟摆运动.说实话,这个游戏乍看好像很简单,其实在没有物理引擎的帮助下,纯模仿机械人的钟摆运动是挺困难麻烦的. 机器人的x值其实没有变,变的是背景和绳子,通过参考系的切换给玩家一种机械人在前进的错觉.那么问题就转为绳子的 运动和背景的运动以及机器人在垂直方向也就是Y轴方向的运动处理了. 2.绳子运动分为几个阶段,伸长阶段,回拉阶段和摇摆阶段. 2-

本人第一个android游戏《新连连看》上架

经过艰苦奋战了几天,本人的第一个android游戏<新连连看>最终完毕了第一个版本号,比較简陋.另一部分功能保留没有开放.等第二个版本号再上.用的libgdx框架.可能不是非常出名,可是本人认为真的是非常好用的. 希望大家先去玩一下,然后给我提一些改进的意见.稍后我会进行改进.并在完好后发布源代码供讨论.批评. 传送门:http://app.lenovo.com/app/14452187.html ------------------------------------------------

相信很多朋友遇到过网站换服务器的问题,或成功或失败!今天3A网络小钱给大家讲的是自己的一个亲身经历,原先小钱有一个网站是在linux服务器上运行,所用的web服务为nginx+mysql+php,但由于服务器到期,新服务器用的是win2008系统,那就需要只能做好迁移! 前期做的准备 1、必须了解自己网站所用的PHP和MySQL的版本 2、网站大小

相信很多朋友遇到过网站换服务器的问题,或成功或失败!今天3A网络小钱给大家讲的是自己的一个亲身经历,原先小钱有一个网站是在linux服务器上运行,所用的web服务为nginx+mysql+php,但由于服务器到期,新服务器用的是win2008系统,那就需要只能做好迁移! 前期做的准备 1.必须了解自己网站所用的PHP和MySQL的版本 2.网站大小 3.数据库大小 由于网站过于巨大90G,而linux服务器上磁盘空间不够无法压缩,最后我选择的办法是使用FTP传,没想到什么好办法. 网站的数据库大

一个涉及国际贸易新游戏玩法的理念正在由中国企业推向全球。

"一个涉及国际贸易新游戏玩法的理念正在由中国企业推向全球." B20聚焦Electronic World Trade Platform (eWTP)理念,这个由民营企业主导.涉及所有利益相关方的举措,建议展开"公共-民营"的对话,为跨境电子贸易(eTrade)的发展建立起电子贸易规则,推动形成更有效和更高效的政策及商业环境. 背景:跨境电子贸易重塑全球价值链 根据由国际贸易中心(ITC)收集.并在经济合作与发展组织(OECD)和世界贸易组织(WTO)的<Aid

Photon服务器引擎(二)socket/TCP/UDP基础及Unity聊天室的实现

Photon服务器引擎(二)socket/TCP/UDP基础及Unity聊天室的实现 我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API). 通过Socket,我们才能使用TCP/IP协议.实际上,Socket跟TCP/IP协议没有必然的联系.Socket编程接口在设计的时候,就希望也能适应其他的网络协议.所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,

Java从基础到进阶学习之路----数独小游戏制作(二)

详细设计 游戏数据结构设计 显然,需要存储数据的地方只有九宫格地图部分. 对于地图,很明显我们可以采用二维数组int [] [] game;来存储地图中的数据.但是int的二维数组虽然直接简单,但是还是有一定不便之处,比如没有集合的内置处理方法丰富.所以,显然,在游戏地图的生成过程中,一些辅助数据我们可以采用Java的集合. 地图生成算法 对于数独而言,游戏的成功的最根本的保证就是当前的地图有一个存在的解.这就像是解方程,如果不存在解,那么这个游戏本身就是失败的. 所以,重点在于如何产生一个存在