[翻译]XNA 3.0 Game Programming Recipes之fifty-three
PS:自己翻译的,转载请著明出处
8-1 登入网络服务
问题
在你可以连接与别的玩家之前,你首先需要用一个帐号或者创造一个新帐号去登录。可以是脱机的帐户如果所有玩家都在同一网络段相连(局域网)或者在线Live帐户,如果你想去通过因特网连接。
登入是被要求的在你访问网络上任何资源之前。它同样允许其他玩家去看到你的名字,以及一些额外的你可以提供的详细信息。
注意:在Zune里这是不必要的。一个XNA游戏在Zune开始一个SignedInPlayer有你指定在Zune设备上的名字。
解决方案
用你的帐号登入是非常容易的。所有你需要做的是调用Guide.ShowSignIn方法,它允许用户去选择一个存在的帐号或者创建一个帐号。
它是如何工作的
在你可以用任何XNA的网络功能时,你应该添加GameServicesComponent到你的Game中。
Adding the GamerServicesComponent(添加游戏的服务组件)
这个GameComponent(参看1-7节)确保整个网络引擎在后台固定时间内被更新。正如任何的GameComponent,它应该被从你的Game结构中加载。
2 {
3 graphics=new GraphicsDeviceManager(this);
4 Content.RootDirectory="Content";
5 Componets.Add(new GamerServicesComponent(this));
6 }
Displaying the Sign In Interface(显示登入界面)
此示列程序将选择你定义两个状态中的一个:SignIn和SignedIn.同样的程序是在SignIn状态,登录界面将会显示给你的用户,直到一个帐户被选择或者被创建。一旦一个有效果的帐号已经被选择,程序将移动到SignedIn状态。
开始时声明这两种状态:
2 {
3 Guide.ShowSignIn(1,false);
4 log.Add("Opened User SignIn Interface");
5 }
6 else
7 {
8 currentGameState=GameState.SignedIn;
9 log.Add(Gamer.SignedInGamers[0].GamerTag+"logged in-proceed to SignedIn");
10 }
如果没有帐号已经登录,你激活登录界面,允许用户去选择或者创建一个帐号。一旦一个帐号被选择,Gamer.SignedInGamers.Count将不在是0。在下一次更新阶段之间,当前的状态将会被设置为SignedIn,并且一个消息包含玩家的名字,名字被添加到日志中。
注意:这个日志的内容将会用Draw方法被打印到屏幕上。参看3-5节可以得到更多的关于绘制文本到屏幕上的信息。
Guide.ShowSign方法接收两个参数。第一个参数表示多少玩家应该要求登录。在一个Xbox360的解决方案中,最高四个玩家可以同时登录,同时这个限制只有一个在Windows-based机器上。第二个参数指定是否是在线帐户,它是否被允许登录,如果你想要使用在线的服务器来比赛,它是非常有用的!
注意:紧记,用户可以放弃Guide界面,它导致没有帐号被选择。
因为在同一时刻你不能打开Guide界面两次,你应该检查Guide是否是当前关闭的在你调用这个Guide.ShowSignIn方法。你可以通过检查你的Game的IsActive属性,它将将会是true只在如果你的游戏的窗口是被激活的,如果它不是最小化的,并且如果没有显示。
这整个Update方法下面会显示出。这个IsActive属性被检查,在它Guide.SignIn方法被调用如果没有帐号已经登录。一旦一个有效的帐号已经被登录,状态改变为SignedIn.
2 {
3 if(GamePad.GetState(PlayerIndex.One).Buttons.Back==ButtonState.Pressed)
4 this.Exit();
5 if(this.IsActive)
6 {
7 switch(currentGameState)
8 {
9 if(Gamer.SignedInGamers.Count<1)
10 {
11 Guide.ShowSignIn(1,false);
12 log.Add("Opened User SignIn Interface");
13 }
14 else
15 {
16 currentGameState=GameState.SignedIn;
17 log.Add(Gamer.SignedInGamers[0].Gamertag+"logged in-proceed to SignedIn");
18 }
19 }
20 break;
21 case GameState.SingedIn:
22 {}
23 break;
24 }
25 }
26 base.Update(gameTime);
27 }
(完)