XNA中 各个游戏元素中传输数据 各个GameComponent中传输数据
要点:采用向Game类中添加Service来关联数据
添加Service 可以为任意的对象,
一般情况下 添加的对象的继承于GameComponent,这样在命名空间允许的情况下可以在另一个GameComponent中使用服务请求时直接调用。
如果GameComponent所在的命名空间不允许直接去获得提供服务的GameComponent。可以添加一个不继承于GameComponent类的object对象,这是要将提供服务的GameComponent的数据在主函数UpDate函数中给object。 通过移除object服务对象,修改object服务对象值,再添加object服务对象。这种情况下提供服务的GameComponent不需要添加的服务,只需要将object对象添加的服务中。
关于Game类中Service介绍
游戏服务是一个用来维护需要相互交互的对象之间的松散耦合。 服务通过一个叫做GameServices的中介来工作。服务提供者注册GameServices,服务使用者请求GameServices。这种机制可以使一个需要服务的对象向一个不知道服务名字的服务提供者请求服务。
GameServices被定义为一个接口,一个类要实现这个接口和通过GameServices注册服务来提供服务。通过Game.Services.AddService来注册一个服务,要表明服务的接口类型和一个提供服务的对象的引用。注册一个通过服务接口IMyService来提供服务接口的对象,可以使用以下代码:
Services.AddService( typeof( IMyService ), myobject );
一旦注册了一个服务,通过Game.Services.GetService可以检索到请求类型的对象提供的服务。例如要检索IGraphicsDeviceService,可以使用以下代码
IGraphicsDeviceService graphicsservice = (IGraphicsDeviceService)Services.GetService( typeof(IGraphicsDeviceService) );
项目实例
新建一个XNA游戏 命名为XNATranslateData 游戏类改名为TranslateData类 命名空间为XnaTranslateData
利用创建类向导 右键项目->添加->类 出现对话框 选择XNA选项卡中的Game Component类
分别创建 发送数据(SendMessage)类和 接受数据(ReceiveMessage)类
两个类都继承于DrawableGameComponent类
类 SendMessage中添加
变量
private int _second;
private SpriteFont font;public int Second
{
get { return _second; }
}public SpriteBatch _spriteBatch
{
get { return (SpriteBatch)this.Game.Services.GetService(typeof(SpriteBatch)); }
}
Update函数中添加
_second = DateTime.Now.Second;
重载LoadContent函数 并添加
font = this.Game.Content.Load<SpriteFont>(“menufont”);
Draw函数中添加
_spriteBatch.Begin();
_spriteBatch.DrawString(font, _second.ToString(), new Vector2(10, 50), Color.Red);
_spriteBatch.End();
类ReceiveMessage中添加
变量
private SpriteFont font;
public object UserData
{
get { return this.Game.Services.GetService(typeof(object)); }
}
public SpriteBatch _spriteBatch
{
get { return (SpriteBatch)this.Game.Services.GetService(typeof(SpriteBatch)); }
}重载LoadContent函数并添加
font = this.Game.Content.Load<SpriteFont>(“menufont”);
重载Draw函数中添加
_spriteBatch.Begin();
_spriteBatch.DrawString(font, UserData.ToString(), new Vector2(10, 100), Color.Gold);
_spriteBatch.DrawString(font,
((SendMessage)this.Game.Services.GetService(typeof(SendMessage))).Second.ToString(),
new Vector2(10, 150), Color.Green);
_spriteBatch.End();
主Game类TranslateData中添加
变量
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
SpriteFont font;object userData;
SendMessage _sendMessage;
ReceiveMessage _receivemessage;
初始化函数Initialize中
this.IsMouseVisible = true;//启用鼠标显示
_sendMessage = new SendMessage(this);
this.Components.Add(_sendMessage);
this.Services.AddService(typeof(SendMessage), _sendMessage);//添加SendMessage服务_receivemessage = new ReceiveMessage(this);
this.Components.Add(_receivemessage);userData = new object();
this.Services.AddService(typeof(object), userData);//添加object服务函数LoadContent中内容
spriteBatch = new SpriteBatch(GraphicsDevice);
this.Services.AddService(typeof(SpriteBatch), this.spriteBatch);
font = Content.Load<SpriteFont>(“menufont”);函数Update函数内容
this.Services.RemoveService(typeof(object));
_sendMessage.Update(gameTime);
userData = (object)_sendMessage.Second;
this.Services.AddService(typeof(object), userData);_receivemessage.Update(gameTime);
函数Draw函数中添加
spriteBatch.Begin();
spriteBatch.DrawString(font,”hello!111″,new Vector2(10,10),Color.White);
spriteBatch.End();
其他的向项目中添加 新建字体 命名为menufont即可