苍山雪22 苍山雪22
关注数: 0 粉丝数: 0 发帖数: 7,990 关注贴吧数: 61
通信对象(IGC)的简单使用说明 前段时间发现有人挖我19年的坟,不过这个问题其实我早就解决了,而且他的回复的地址当时就知道了,只是光看这些没有整理资料实际很难直接了解IGC对象用法。 正巧最近又看见有人在问这个问题(不过他可能已经解决了),所以我就写了下面的东西,有需要的可以看看。 一,获取IMyIntergridCommunicationSystem对象 至少从我入坑开始,就已经推荐用直接操作天线方块的方式通信了,取而代之的是调用IMyIntergridCommunicationSystem对象。IMyIntergridCommunicationSystem不能直接创建,只能通过MyGridProgram对象的IGC属性获取,比如 public Program() { IMyIntergridCommunicationSystem myIGC=this.IGC; } 通信将会有两种模式,广播和单播(点对点)。 二,发送信息 1,广播 通过以下IMyIntergridCommunicationSystem对象的方法进行广播 public bool SendBroadcastMessage<TData>(string tag,TData Data,TransmissionDistance transmissionDistance) tag 是广播的频道 Data 是传送的数据,TData改成你要实际传递的信息的数据类型,比如string transmissionDistance 是传的范围,常用的是两个:TransmissionDistance.CurrentConstruct当前网格;TransmissionDistance.AntennaRelay天线范围 比如 public void Main(string argument, UpdateType updateSource) { this.IGC.SendBroadcastMessage<string>("MyInfo","Hello",TransmissionDistance.AntennaRelay) } 2,单播 通过以下IMyIntergridCommunicationSystem对象的方法进行单播 public bool SendUnicastMessage<TData>(long addressee, string tag, TData data) addressee 是对方地址,可以让对方预先用广播方式发过来。可以通过IMyIntergridCommunicationSystem的public long Me { get; }属性取得自己的地址(比如 long myadd=this.IGC.Me;),然后广播给对方。 tag 是广播的频道 Data 是传送的数据 三,接收数据 1,注册接收对象及设置回调 接收数据前广播方式先要注册接收对象,通过以下IMyIntergridCommunicationSystem对象的方法进行注册 public IMyBroadcastListener RegisterBroadcastListener(string tag) 比如: IMyBroadcastListener ThisBroadcast; public Program() { ThisBroadcast=this.IGC.RegisterBroadcastListener("MyInfo"); } 单播不需要注册接收对象,直接通过public IMyUnicastListener UnicastListener { get; }得到接收对像 比如 IMyUnicastListener ThisUnicast; public Program() { ThisUnicast=this.IGC.UnicastListener; } 取得了接收对象后还要设置回调 public void SetMessageCallback(string argument) IMyBroadcastListener(广播接收对象)和IMyUnicastListener(单播接收对象)都有这个方法,参数和前面发送数据的tag(频道)一致即可。 2,接收数据 在设置完回调后,接收到数据时会调用public void Main(string argument, UpdateType updateSource),argument和设置回调的argument相同(但是用处不大),updateSource的值为UpdateType.IGC。 public MyIGCMessage AcceptMessage()方法,IMyBroadcastListener(广播接收对象)和IMyUnicastListener(单播接收对象)都有这个方法,用来返回一条信息。 用AcceptMessage().Data.ToString()可以简单地把信息转换为字符串。 因此可以这样: public void Main(string argument, UpdateType updateSource) { switch (updateSource) { case UpdateType.IGC: string MSG=ThisBroadcast.AcceptMessage().Data.ToString(); //处理MSG break; } } 但是注意,实际上游戏的每一帧无论收到多少信息只会调用一次Main过程,所以还要用到 public bool HasPendingMessage { get; } 来测试是不是还有数据传到。 IMyBroadcastListener(广播接收对象)和IMyUnicastListener(单播接收对象)都有这个属性 因此还要改成这样: public void Main(string argument, UpdateType updateSource) { switch (updateSource) { case UpdateType.IGC: for (;ThisBroadcast.HasPendingMessage;) { string MSG=ThisBroadcast.AcceptMessage().Data.ToString(); //处理MSG } break; } } 以上就通信对象简单应用的内容。 一个完整示例: MySendClass MySend; public Program() { MySend=new MySendClass(this);//初始化 } public void Main(string argument, UpdateType updateSource) { MySend.AutoDoIt(argument,updateSource);//调用处理过程 } class MySendClass { private MyGridProgram ThisMyGridProgram; private IMyBroadcastListener ThisBroadcast;//广播接收 const string BroadcastTag="MyClass";//广播Tag public MySendClass(MyGridProgram mygridprogram) { ThisMyGridProgram=mygridprogram; ThisBroadcast=ThisMyGridProgram.IGC.RegisterBroadcastListener(BroadcastTag);//注册广播接收 ThisBroadcast.SetMessageCallback(BroadcastTag);//广播回调 } public void AutoDoIt(string argument, UpdateType updateSource) { string MSG=""; switch (updateSource) { case UpdateType.IGC://通信事件 for (;ThisBroadcast.HasPendingMessage;) {//只要有通信数据就循环 MSG=ThisBroadcast.AcceptMessage().Data.ToString();//取出一份通信数据 ThisMyGridProgram.Me.CustomData=MSG;//写入编程块的自定义数据 } break; case UpdateType.Terminal://手动运行 MSG=ThisMyGridProgram.Me.CustomData;//编程块的自定义数据 ThisMyGridProgram.IGC.SendBroadcastMessage<string>(BroadcastTag,MSG,TransmissionDistance.AntennaRelay);//把编程块的自定义数据通过天线发送出去 break; case UpdateType.Trigger://触发运行(定时器、按钮之类) MSG=ThisMyGridProgram.Me.CustomData; ThisMyGridProgram.IGC.SendBroadcastMessage<string>(BroadcastTag,MSG,TransmissionDistance.AntennaRelay); break; } } } 以上代码在两个编程块里各放一份。在终端上手动运行就可以把自定义数据里的文本发送出去,另一个编程块接收到后会写入自己的自定义数据。
1 下一页