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:
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.
Comments
- Anonymous
June 06, 2010
„optisch nicht besonders ansprechend“ ist wohl wahr :) Wiedemauchsei, all die „object po = new object()“ sind nicht nötig, da null als state Argument durchaus akzeptiert wird (das state Argument wird in IAsyncResult.AsyncState an den Callback durchgereicht, damit jener in komplizierteren Situationen etway Kontext hat).