XNA WP7 input mogelijkheden, accelerometer

In het vorige artikel hebben we de Windows Phone 7 device input mogelijkheid besproken. Daarin kwam eigenlijk alleen maar de touchpanel interface naar boven. Heel bruikbaar, maar hiermee hebben we maar een deel van de mogelijkheden besproken. Touches en gestures. Er zijn nog meer mogelijkheden namelijk het gebruik van de accelerometer. Dit is een sensor die in de telefoon is ingebouwd en stelt de gebruiker in staat om ‘krachten’ op drie oriëntatie assen uit te lezen; X,Y en Z-as. Op basis van deze informatie kan je bepalen hoe de gebruiker de telefoon vast houdt en bijvoorbeeld bepalen of de telefoon plat op de tafel ligt. In dat geval zou de Z-as een waarde van –1.0 hebben.
Alle waardes die gerapporteerd worden, zitten tussen +1.0 en –1.0 en hebben een precisie van 3 cijfers achter de komma.

Het uitlezen van de waardes gebeurt op een andere manier dan wij hiervoor gezien hebben. De accelerometer sensor wordt namelijk event driven uitgelezen. We moeten dus zelf subscriben op  de events en dan komen ze binnen. Met de andere input devices werkt het anders. Die kan je uitlezen wanneer je wil in bijvoorbeeld de Update() methode van je game class. Voor de accelerometer dus niet. Is op zich helemaal geen probleem, maar het is wel een afwijking van wat wij tot nu toe gezien hebben. De reden voor deze ander aanpak is, volgens Microsoft, omdat dezelfde API ook door Silverlight Windows Phone applicaties gebruikt wordt en daar is het programmeer model wel in zijn geheel event driven. Klinkt logisch.

Als je gebruik wil maken van de accelerometer mogelijkheden zal je de Microsoft.Devices.Sensors assembly zelf moeten toevoegen:

image

Lees verder

Twee versies van Hello World – versie 2

We hebben al een mooie Hello World gemaakt met een plaatje, maar dat moeten we eigenlijk ook met tekst doen. De meest traditionele manier nietwaar?

Tekst op het scherm van je WP7 device in XNA laten verschijnen zit iets moeilijker in elkaar dan je zou verwachten. Je zou verwachten dat er is van een DrawString of DrawText methode is die je in staat stelt om dit te bereiken. En die is er ook. De standaard toegevoegde SpriteBatch class heeft een DrawString() methode (van onze vriend MSDN):

Name Description
SpriteBatch.DrawString (SpriteFont, String, Vector2, Color) Adds a string to a batch of sprites for rendering using the specified font, text, position, and color.
SpriteBatch.DrawString (SpriteFont, String, Vector2, Color, Single, Vector2, Single, SpriteEffects, Single) Adds a string to a batch of sprites for rendering using the specified font, text, position, color, rotation, origin, scale, effects and layer.
SpriteBatch.DrawString (SpriteFont, String, Vector2, Color, Single, Vector2, Vector2, SpriteEffects, Single) Adds a string to a batch of sprites for rendering using the specified font, text, position, color, rotation, origin, scale, effects and layer.
SpriteBatch.DrawString (SpriteFont, StringBuilder, Vector2, Color) Adds a string to a batch of sprites for rendering using the specified font, text, position, and color.
SpriteBatch.DrawString (SpriteFont, StringBuilder, Vector2, Color, Single, Vector2, Single, SpriteEffects, Single) Adds a string to a batch of sprites for rendering using the specified font, text, position, color, rotation, origin, scale, effects and layer.
SpriteBatch.DrawString (SpriteFont, StringBuilder, Vector2, Color, Single, Vector2, Vector2, SpriteEffects, Single) Adds a string to a batch of sprites for rendering using the specified font, text, position, color, rotation, origin, scale, effects and layer.

Met meteen veel opties. Ik zou het liefst makkelijk willen beginnen en daarvoor hebben we blijkbaar een SpriteFont nog, de test, positie en een kleur. De laatste drie zijn eenvoudig in te vullen. De SpriteFont hebben we nog niet eerder gezien. En die heeft wel wat uitleg nodig. Ik had verwacht dat het mogelijk zou zijn om een bestaande font set op je telefoon te gebruiken voor run-time tekst weergave. Dit is niet de oplossingsrichting waarvoor ze hebben gekozen binnen XNA. Om de run-time wederom, net zoals met het laden van ons .bmp plaatje het lastige (mogelijkheden, compressie etc), makkelijk te maken moet je een zogenaamde SpriteFont aanmaken. Het is letterlijk een plaatje (sprite) van een font. Wat je namelijk doet is een SpriteFont bestand toevoegen aan je content project:

Lees verder

Twee versies van Hello World – versie 1

We hebben de standaard WP7 XNA code al bekeken, maar we hebben er nog geen echte mooie Hello World app van gemaakt. En dat moet natuurlijk wel. Het mooie is dat we dat op twee manieren kunnen doen.

Content Pipeline

De eerste manier hoe we onze Hello World kunnen maken is een heel erg simpele manier. Een plaatje laten zien met de tekst ‘Hello World’ erin. Met Paint.NET kan ik plaatjes maken die ik er behoorlijk uit vind zien. In dit geval heb ik een canvas gemaakt van 480*800 pixels. Dat is precies de resolutie van een WP7 device:

Hello World

Ik heb hem opgeslagen als een PNG waarbij het nu tijd wordt om het plaatje in ons project te laden. Dat is waar XNA ons heel erg goed helpt. Er is is namelijk een zogenaamde Content Pipeline die een gevarieerd aantal formaten aan bestanden voor ons omzet in iets wat run-time gebruikt kan worden in onze XNA app. Content kan van alles zijn. Plaatjes, video, geluid, 3D modellen, etc. En dan heb je een pipeline waar je het materiaal instopt. De pipeline zorgt er voor dat de content die je erin stopt, op een uniforme wijze wordt aangeboden als je programma eenmaal draait. XNA werkt run-time met XNA Binaries, zogenaamde .xnb files. Wat XNA voor ons verzorgt is dat als je een content bestand aanlevert (wat wordt herkend), zoals bijvoorbeeld een .bmp bestand, hij deze in het build proces meeneemt en omzet naar een .xnb bestand. En op die manier kunnen we tijdens run-time makkelijk vanuit verschillend bronbestanden, content laden. Dat is erg plezierig, want dat betekent dat er tijdens run-time geen conversies vanuit allemaal mogelijk exotische bronnen naar iets bruikbaar gedaan hoeft te worden. En ik kan je alvast vertellen dat alles wat je run-time, tijdens je spel, niet hoeft te doen komt ten goede aan de performance van je spel.

Lees verder

XNA 4.0, wat is het?

Ik zal niet de gehele historie van XNA hier opsommen. Dat is prima ergens anders te vinden. Hier even kort de uitleg die relevant voor ons is.

XNA is een zogenaamd Managed Framework boven op DirectX 9. Managed Framework in de zin dat de code die eruit komt, Common Interface Language (CLI) code, wordt uitgevoerd door een Common Language Runtime (CLR). Deze zet de CIL code om naar uiteindelijke code die relevant is voor het O/S waarop de applicatie wordt uitgevoerd. In mijn geval is dat Windows 7 x64 waarop het daarvoor bestemde .NET framework (4.0) is geïnstalleerd.
Dat is allemaal erg handig, want we worden met memory management, exception handling en natuurlijk onze grote vriend de Garbage Collector. Hoef ik hier denk ik niet verder uit te leggen.

Het XNA Framework zorgt ervoor, naast alle handige dingen die aangeboden worden voor alle managed talen, dat er een bepaald niveau van abstractie bovenop communicatie met DirectX wordt gelegd. DirectX9 in het geval van XNA. DirectX is een framework wat er voor zorgt dat je op een uniforme en dus makkelijke manier met de videokaart(en), geluidskaart(en), input controllers en alle aan gaming gerelateerde elementen op een Windows operating systeem kan praten. Ik kan je uit eigen ervaring vertellen dat het lastig is om iets in DirectX en C++ robuust aan de praat te krijgen. Heb veel met DirectSound, de geluidsinterface, gewerkt en dat is een uitdaging op zich om dat aan de praat te krijgen. Allemaal prima gelukt, maar het is toch een genot als je ziet met wat voor gemak je ‘tegenwoordig’ (ja, ik klink nu als een oude man) een applicatie in elkaar kan zetten.

XNA wordt gedaan met C#. Er zijn ook mensen die met Visual Basic er iets van maken. Dat kan. Of zelfs met C++/CLI. Ook prima.

Lees verder

MsPacMan voor XNA

Er is altijd een begin. En dat is hier. Wat is het plan? Ik wilde een ‘spel’ maken wat relatief simpel te maken en spelen is. MsPacMan lag een beetje voor de hand, want dat speelde ik nog wel eens op een ‘oude’ Arcade kast. Erg vermakelijk. Was er alleen niet zo erg goed in. Ik zag inmiddels van XNA 3.0 was uitgekomen en toen het is het een beetje begonnen. Ging alleen maar niet bijzonder hard. Met de komst van XNA 4.0 en de mogelijkheden voor Windows Phone 7 wordt het nog interessanter. Nieuw device erbij en ik zag/zie mogelijkheden om crossplatform, multiplayer te spelen waarbij iemand op een WP7 device, de ander op de PC en nog iemand anders op een xbox360 kan spelen. Dat plannetje ben ik mee bezig en hier worden de resultaten gedeeld.