XNA auf WP7: Keyboard & MessageBox anzeigen

XNA ist die neue .NET-basierte Spieleplattform für Windows Phone 7, und sie verheisst eine Menge cooler 2D- und 3D-Games für die neuen Smartphones ab Herbst.

Aus diesem Grund (und weil XNA + .NET + VS2010 + WP7 natürlich cool sind ;-) interessieren sich jetzt schon eine ganze Menge Entwickler für das Thema und beginnen, sich damit zu befassen. Mein hochgeschätzter Kollege Tom Wendel bspw. hat unter https://blogs.msdn.com/twendel/archive/2010/04/21/xna-sample-moontaxi-teil-1.aspx ein tolles Einsteiger-Tutorial zu XNA publiziert, dass natürlich auch beim Einstieg in die Spieleentwicklung für WP7 hilft.

Beim Einarbeiten stößt man natürlich auf die eine oder andere Frage – zumal XNA so ganz anders ist als das alternativ verfügbare Silverlight für WP7. Keine Controls, alles selbst zeichnen, keine Events, statt dessen ein Game Loop. Nicht mal ein simples Soft-Keyboard scheint es zu geben… oder doch?

Doch, es gibt eins. Es kann natürlich im Sinne der einheitlichen Optik des Games sinnvoll sein, das selbst zu zeichnen, aber für Standardfälle existiert im Namensraum Microsoft.Xna.Framework.GamerServices die Klasse Guide, welche die Methode BeginShowKeyboardInput() anbietet. Mit BeginShowMessageBox() lässt sich übrigens zusätzlich eine Standard-MessageBox darstellen:

XNAGuideSIP

Die Verwendung ist nicht ganz trivial, da beide Aufrufe einen Callback-Parameter verlangen und von einer EndShow…() -Methode begleitet werden. Hier ein paar nützliche Code-Schnipsel dazu:

AsyncCallback SIPcbk, MSGcbk;

SIPcbk = new AsyncCallback(callbackKeyboard);
MSGcbk = new AsyncCallback(callbackMsgBox);

object p = new object();
try
{
Guide.BeginShowKeyboardInput(PlayerIndex.One,
"WP7XNA", "Please enter your message:",
"Hello WP7!", SIPcbk, p);
}
catch (GuideAlreadyVisibleException gex)
{
Debug.WriteLine("Guide error: " + gex.Message);
}

public void callbackKeyboard(IAsyncResult ar)
{
string SIPInput = Guide.EndShowKeyboardInput(ar);
object p = new object();
try
{
System.Threading.Thread.Sleep(1000);
Guide.BeginShowMessageBox("WP7XNA",
"You entered:\n\n" + SIPInput,
new List<string> { "OK" }, 0,
MessageBoxIcon.Alert, MSGcbk, p);
}
catch (GuideAlreadyVisibleException gex)
{
Debug.WriteLine("Guide error: " +
gex.Message);
}
}

public void callbackMsgBox(IAsyncResult ar)
{
Guide.EndShowMessageBox(ar);
}

 

Ist zwar optisch nicht besonders ansprechend, funktioniert aber.