| Client | |||||||||||||||||||||||||||||
| Player{ //Game.Me | |||||||||||||||||||||||||||||
| 1 | void CommandA{ | ||||||||||||||||||||||||||||
| cmd = new Command(methodInfo,args[]); | |||||||||||||||||||||||||||||
| server.channel.Send(cmd) | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| Unit{ | |||||||||||||||||||||||||||||
| event LocationChanged; | |||||||||||||||||||||||||||||
| ID; //该单元的在游戏中的唯一标志 | |||||||||||||||||||||||||||||
| OwnerID; | //该单元属于谁 | ||||||||||||||||||||||||||||
| _Location; | |||||||||||||||||||||||||||||
| Location{ | |||||||||||||||||||||||||||||
| 8 | set{ | ||||||||||||||||||||||||||||
| _Location = value; | |||||||||||||||||||||||||||||
| if (LocationChanged != null) | |||||||||||||||||||||||||||||
| LocationChanged(this,EventArgs.Empty); | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| Server | |||||||||||||||||||||||||||||
| Channel{ //server端,每个channel属于某个用户 | |||||||||||||||||||||||||||||
| int ID; //Player id | |||||||||||||||||||||||||||||
| 2 | void OnCommand{ | ||||||||||||||||||||||||||||
| server.CommandQueue.Add(ID,cmd); | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| Server{ | |||||||||||||||||||||||||||||
| void Main{ | |||||||||||||||||||||||||||||
| while(true) | |||||||||||||||||||||||||||||
| 3 | if (CommandQueue.count>0) | ||||||||||||||||||||||||||||
| processCommand(); | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| 4 | ProcessCommand(){ | ||||||||||||||||||||||||||||
| Player p = FindPlayer(CommnadQueue.Peek().ID); | |||||||||||||||||||||||||||||
| cmd.method.invoke(p,p.Peek().args)//如果不用reflection,需要一个大的switch | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| 7 | BroadcastCommand(players,cmd){ | ||||||||||||||||||||||||||||
| foreach(p in players) | |||||||||||||||||||||||||||||
| p.channel.send(cmd); | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| Player{ | //注意这里的Player是服务器端 | ||||||||||||||||||||||||||||
| 5 | void CommandA{ | ||||||||||||||||||||||||||||
| //check condition | |||||||||||||||||||||||||||||
| unit.Location = xxx; '//perform command | |||||||||||||||||||||||||||||
| //也许同步策略加到这里 | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| Unit{ | |||||||||||||||||||||||||||||
| event LocationChanged; | |||||||||||||||||||||||||||||
| ID; //该单元的在游戏中的唯一标志 | |||||||||||||||||||||||||||||
| OwnerID; | //该单元属于谁 | ||||||||||||||||||||||||||||
| _Location; | |||||||||||||||||||||||||||||
| Location{ | |||||||||||||||||||||||||||||
| 6 | set{ | ||||||||||||||||||||||||||||
| if (value != _Location){ //发生变化 | |||||||||||||||||||||||||||||
| IList players = … //同步策略 | |||||||||||||||||||||||||||||
| Server.Broadcast(players,new command(ID,methodInfo,value)); | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| _Location = value; | |||||||||||||||||||||||||||||
| if (LocationChanged != null) | //也可能通过这里注册Location同步策略分析器 | ||||||||||||||||||||||||||||
| LocationChanged(this,EventArgs.Empty); | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| } | |||||||||||||||||||||||||||||
| 注释: | |||||||||||||||||||||||||||||
| 我更希望通过AOP把某些方法自动重定向或者同步到Server/Client端执行,编程上可以简化很多 | |||||||||||||||||||||||||||||

浙公网安备 33010602011771号