Photon官方Lite类中Lite Concepts
转自:http://blog.csdn.net/huihuilaopo/article/details/8745486
Lite Concepts
Peer
Lite是基于应用程序框架,用于Photon和也使用“Peer”作为引用连接播放器。这是包裹在类LitePeer和扩展。
当一个客户端连接到Lite应用程序,一个新的LitePeer LiteApplication.CreatePeer中创建。进一步的请求,客户端(例如。操作)现在将由相应的LitePeer。
在Lite,每一个Peer都有一个唯一的RoomReference状态。玩家可以仅在单个Room。当玩家加入时创建这个状态。
在LitePeer OnDisconnect的方法时,将调用一个断开方法Peer Disconnnect。如果对方仍在一个Room里,这得到了一个消息删除Peer。
Rooms
在Lite,Peers进入Room一起玩,这就是为什么他们也称为游戏。Room要为所有事负责。一切除了加入,就是它。
每个游戏都有一个唯一的名称,并被视为完全脱离了任何其他。同时,每个请求来自一个Player处理序列。因为许多Room并行存在,每个请求都很好地处理,这种设置良好的可扩展性。
Room有Player的名单在加入,离开或断开时更新。这些Players之间,可以发送事件。
在一个Room,一个PLayer也被称为演员,每个Actor都有一个ActorNumber。这个数字是用来标记一个事件的起源。
Operations and Events
Lite定义这些操作
•Join:进入任何Room(通过名字)。如果它不存在则创建。加入将默认离开先前的Room的一个Peer(如果有的话)。返回指定ActorNumber。
•Leave:离开Room(但保持连接)。
•RaiseEvent:告诉Room去发送一个事件给每个Peer。事件有一个EventCode,可以携带数据由客户提供。Lite并不存储事件。
•GetProperties:Lite,属性可以被附加到Room和Player。这个操作,他们都被获取。
•SetProperties:高度任意键值对roRoom或一个Player。Lite不使用数据,所以客户端可以发送任意数据沿。代码按照惯例。
Lite定义了这些事件
•Join: 加入一个Room(通过操作)更新Player名单。这是发送给所有的玩家在一个事件(包括新的)。
•Leave:如果一个Player离开一个Room的,其余的是再次更新。
•Properties update:当属性被更改,有一个选项广播更新。这个事件负责每个客户端是最新的。
RaiseEvent/自定义事件
在Room里Lite,Player可以与发送任意内容的事件给其他Player。操作RaiseEvent负责这和转发相应事件内容。
作为一个例子,这个客户端代码与DotNet实时演示发送一个Player的位置:
- // Raises an event with the position data of this player.
- internalvoidSendEvMove(LitePeer peer)
- {
- if(peer == null)
- {
- return;
- }
- Hashtable evInfo = newHashtable();
- evInfo.Add((byte)STATUS_PLAYER_POS_X, (byte)this.posX);
- evInfo.Add((byte)STATUS_PLAYER_POS_Y, (byte)this.posY);
- //OpRaiseEvent(byte eventCode, Hashtable evData, bool sendReliable, bytechannelId, bool encrypt)
- peer.OpRaiseEvent(EV_MOVE, evInfo, isSendReliable, (byte)0,Game.RaiseEncrypted);
- }
在客户端有一个接收事件的方法EventAction
- <span style="font-family:FangSong_GB2312;font-size:14px;"></span><pre class="csharp" name="code">//in Game.cs:
- publicvoidEventAction(byteeventCode, Hashtable photonEvent)
- {
- intactorNr = 0;
- if(photonEvent.ContainsKey((byte)LiteEventKey.ActorNr))
- {
- actorNr = (int) photonEvent[(byte) LiteEventKey.ActorNr];
- }
- // get the player that raised this event
- Player p;
- this.Players.TryGetValue(actorNr, outp);
- switch(eventCode)
- {
- casePlayer.EV_MOVE:
- p.SetPosition((Hashtable)photonEvent[(byte)LiteEventKey.Data]);
- break;
- }
- }
- //in Player.cs:
- internal void SetPosition(Hashtable evData)
- {
- this.posX = (byte)evData[(byte)STATUS_PLAYER_POS_X];
- this.posY = (byte)evData[(byte)STATUS_PLAYER_POS_Y];
- }
- </pre><br>
- <pre></pre>