XNA-GameService

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