XNA-GameServices
之前XNA-2D 打磚塊遊戲(三)- Components有提到Component的用法,
但是Component之間有時候是需要彼此溝通的,例如我們有一個攝影機Component,而很多其他的Component也需要知道攝影機的位置,
這時候就是GameServiceContainer登場的時候了。
我們先決定攝影機的interface,簡單起見就只給定位置就好,如下:
public interface ICamera {
Vector3 Position { get; }
}
然後我們創造一個攝影機的Component:
public class CameraOne : GameComponent, ICamera {
#region ICamera Members
private Vector3 position = Vector3.Zero;
public Vector3 Position {
get { return position; }
}
#endregion
public CameraOne(Game game)
: base(game) {
game.Services.AddService(typeof(ICamera), this);
}
public override void Update(GameTime gameTime) {
KeyboardState ks = Keyboard.GetState();
if (ks.IsKeyDown(Keys.Left)) {
position.X--;
}
if (ks.IsKeyDown(Keys.Right)) {
position.X++;
}
if (ks.IsKeyDown(Keys.Up)) {
position.Y--;
}
if (ks.IsKeyDown(Keys.Down)) {
position.Y++;
}
base.Update(gameTime);
}
}
此攝影機在建立的時候就會把自己加入到Game.Services裡,然後在其他的Component裡就可以藉由Game.Services.GetService取得已經存入的物件。
我們也簡單產生一個其他Component:
public class Other : GameComponent{
private ICamera camera;
public Vector3 CameraPosition {
get { return camera.Position; }
}
public Other(Game game)
: base(game) {
}
public override void Initialize() {
camera = (ICamera)Game.Services.GetService(typeof(ICamera));
base.Initialize();
}
}
在初始化的時候,取得已經在Game.Services裡的iCamera物件,如此達到Component之間互通的功能。
範例程式:XNA-GameService.rar