XNA Games and Windows Phone Screens

London bridge

If you are writing games for Windows Phone there are a couple of things worth knowing about how the display works.

Firstly, the top bar of the screen is used to display things like battery level, signal status and the like. This status bar only appears when the user touches that part of the screen, which is good because it makes the whole of the screen available when you don’t want to know your precise signal strength. However in an XNA game you might not want this to appear if the user happens to touch that part of the screen. You can stop the status bar from appearing by telling the graphics adapter to use full screen mode.

graphics.IsFullScreen = true;

Do this in the constructor for your game class, just after the graphics device has been created, and your game will get exclusive use of the entire screen.

The other thing worth knowing is how to stop the screen timeout turning up and ruining the gameplay. The screen will time out if there has been no touch activity for a while, which means that games controlled entirely by the accelerometer may get timed out. You can disable time-out by using the statement:

Guide.IsScreenSaverEnabled = false;

Now your game will run forever, or until the battery goes flat – whichever comes sooner…

Rob and the Cube

Robs Cube

I wasn’t looking to buy a new car. I never am. Particularly after just having had the current one serviced. But they had some Cubes at the Nissan dealership and I just had to go and have a look. And I think the Cube looks great. (Although opinions differ).

Inside it is a bit like driving a conservatory and I don’t think it will win any speed races. But I really like it. My definition of great car is “A vehicle that transports a really good SatNav and sound system around, along with space for gadgets”. The Cube does all that.  And it has a rear view camera. In colour. The plan is for some trickle down action, with number one wife getting my car so every body wins.

If you are looking to by something mini-MPV’ish with a really distinctive style (the only car I’ve ever owned that I would probably be able to draw a recognisable picture of) then there are some amazing deals on the Cube at the moment.

Understanding Windows Phone Orientation in XNA

Panic Orientation

The many orientations of Panic.

Above you can see  my Windows Phone 7 Panic Button application. This gives you a panic button to press at any point in your panic inducing life. To make it work in any orientation I had to do a couple of things.

I had to tell the Windows Phone system the orientations my XNA game can support. I did this in the constructor for the game:

public PanicButtonGame()
{
    graphics = new GraphicsDeviceManager(this);
    Content.RootDirectory = "Content";

    graphics.SupportedOrientations =
        DisplayOrientation.Default |
        DisplayOrientation.LandscapeLeft |
        DisplayOrientation.LandscapeRight |
        DisplayOrientation.Portrait;
    // rest of constructor here
}

This effectively tells XNA that the graphics device for my game can support any way the player might want to hold the phone. The next thing I had to do was get an event fired when the orientation changed so that I could re-position that all important button:

public PanicButtonGame()
{
     // start of constructor here

    Window.OrientationChanged +=
          new EventHandler<EventArgs>
                                (Window_OrientationChanged);

    // Frame rate is 30 fps by default for Windows Phone.
    TargetElapsedTime = TimeSpan.FromTicks(333333);
}

void Window_OrientationChanged(object sender, EventArgs e)
{
    // called when the orientation changes
    positionButton();
}

When the game is running and the player changes the orientation of the phone my method bound to the Window_OrientationChanged event will fire and re-position the button on the screen.

If you game can only support particular orientations then just leave out the ones that you don’t want to make available. 

Things get interesting if you do something stupid with preferred resolutions and orientation:

graphics.SupportedOrientations = DisplayOrientation.Portrait;
graphics.PreferredBackBufferWidth = 400;
graphics.PreferredBackBufferHeight = 240;

I’ve asked to work in Portrait orientation. However, I’ve also asked for a screen which is 400 wide and 240 high (i.e. a landscape one) which is a bit daft. What happens here is that my program will think it has a “screen”  400 wide by 240 high, but this will then be scaled by the hardware to fit in a display working  in portrait mode, which means that I’ll get my screen scrunched into the middle of the screen, with black bands above and below:

image

I’ve added a blue background here so you can see what happens.

If you want to select particular screen orientations and also use the hardware scaler you have to make sure that your selections agree or this will happen to you.

Windows Phone Graphics Speedup with BEPUphysics

 

The folks at BEPU have made a wonderful 3D physics engine for XNA on Windows Phone. You can see it in action  above.

And they’ve now ported it onto Windows Phone. I’ve downloaded the demo software onto my device and initially it ran rather slowly. However, Windows Phone has a lovely trick which makes it unique amongst mobile devices. You can set the display resolution to a lower value and hardware autoscales it to fit the screen of the device.  This is great for two reasons:

  • It means you no longer have to write games to fit a particular screen size
  • You can get a performance hike by rendering to a smaller screen and having it scaled up

You set the resolution that you want in the constructor of your game object in the XNA game. I asked for the lowest resolution:

// Pre-autoscale settings.
graphics.PreferredBackBufferWidth = 240;
graphics.PreferredBackBufferHeight = 400;

I had to do some fiddling with the display to make the buttons work (you can find out more here) but the result was a physics display that looked lovely (and only a tiny bit blurred).

If you want to get your hands on some ready made 3D physics (with very generous licensing terms)  then you should head over to BEPU.

If you want to speed up your XNA game on Windows Phone (or make it future proof as far as resolution is concerned) then you should start using the settings above.

Windows Phone 7 Pelmanism

image

Spent some of today converting an old XNA version of Pelmanism to run on Windows Phone 7. It was actually very easy, particularly once I started using the gesture support in XNA 4.0 With that I could  just pick up tap events and use them in the program to select matching tiles.

At the moment the game uses 50 different images which I had originally scaled for an Xbox 360. This gave me a game size of 16Mb, which is quite large for Windows Phone game. But it downloaded to the device and ran quite happily. I’ve resized the pictures now and taken 10M off the size.

Next step is to use Flickr images from the new FlickrNet API that makes it easy to pull images onto the phone.

Unblocking Files from the Internet

image

Sometimes you get a file from the internets, or in an email, which you actually trust. Thing is, Windows doesn’t. This can result in fun and games when you try to use this file or, if it is an archive, files from the archive.

As an example, I downloaded the TouchGestureSample from the Creators Club and I don’t want any messages about un-trusted files in Visual Studio 2010.

Solving this is actually quite easy (and best done before you remove the files from the archive). Right click on the item and then click Unblock to say that you trust this file.

(of course, if you do this with dangerous files it might not have a happy ending)

Getting Diagnostic Output from your Windows Phone programs

Birthday Phone

It is often very useful to find out what your programs are doing. You can put breakpoints into your code, but sometimes you just want print messages. If you are writing Windows Phone apps this is very easy, but it doesn’t use the Console.WriteLine that you might be used to. You can get messages from your Windows Phone program (even when it is running in the device) by using:

System.Diagnostics.Debug.WriteLine ("Your Message Here ");

The output appears in the Output window in Visual Studio 2010  (remember to ask it to show you output from the Debug stream). The best way to control debug output is to use conditional compilation to switch your debug statements on and off:

// Put this at the top of the program to turn debugging on
#define Debug

#ifdef Debug
System.Diagnostics.Debug.WriteLine ("Debug Message Here ");
#endif

Mystery Object Answer

Mystery Object

Now it can be told. The tool is for making holes in network cables so you can attach a Vampire tap to them. In the olden days Ethernet networks were made of a single thick piece of co-axial cable (the same stuff we use to connect TVs to aerials). This had a terminator at both ends and the way you connected a station to the network was to drill a hole in the side of the cable and push a pin into the central conductor.  These connectors got the name of “vampire taps” for obvious reasons.

Getting the hole wrong (too big or too deep) was bad, as you only had the one cable for your entire network. So we used to use a device with a drill bit which had been cut to just the right diameter and depth in the tool you see above.

This was in the “Good Old Days” of networking,  10BASE5 style (this means 10MBits/second, baseband signals and 500 metre maximum segment length).  Nowadays we are up to 100GBits/second on some networks. That is  10,000 times faster.

The tool has rattled around in my desk for a while and I probably should get rid of it.

Having said all that, it does remind me of a Veroboard track cutter. I used to have one of those too. It’s a tool which lets you make breaks in copper tracks on circuit boards by cutting through them with a drill bit. So, I reckon that Dave G is a winner here and if he wants to drop by he can have is Windows Phone lanyard.

Cheap Network Connection

Hull Building

Nice building in Hull today.

If you have an internet enabled phone and want the cheapest way to get on-line with it you really should take a look at Tesco Mobile.  These folks will send you a free pay as you go sim (it costs 99 pence to buy in the store) and you can put credit on it in all the usual ways. You can also have a 2 pounds a week “unlimited use” network connection for your phone. In this case I think “unlimited” means 500 megs in the week, which is OK unless you start streaming “Deal or No Deal” to it. But then again, why would you want to do that?

It does mean that you can have a fully working internet phone for around 8 pounds a month, which has got to be good value. I popped one of these into my Windows Phone and it works a treat. The network is actually provided by O2, which may or may not be good news depending on where you live.

Mystery Object Competition

Mystery Object

So, what was this used for?

Mystery Closeup

Close up of the pointy end

I found this in my drawer today. Not used it for a while. I’ve got a Windows Phone Lanyard (tastefully printed with a Windows Phone logo all along its length) to give to the first person to come to my office in Hull and tell me what is and what we used to use it for.

A clue, it is not directly related to phones as such…

Overlapping Display Elements in Silverlight

Blackjack in White

Overlapping cards in a white version of the game. I just changed the Settings to a white background, everything else was sorted out automatically.

I’ve solved my five card problem. I’m not sure if I’ve cheated or not, but I am sure that it works.

image

The way it works is by giving elements in the StackPanel a negative left margin, so that they go into the element to the left. The StackPanel only seems to use the width remaining width for each item in the panel, so I end up with all the card displays overlapping nicely.

Silverlight Blackjack for Windows Phone 7

Silverlight Blackjack for Windows Phone
Well, what would you do?

For no particular reason (perhaps because I’ve got lots of other, more important, things to do) I’ve been working on a version of Blackjack for Windows Phone 7. I’ve come across an interesting philosophical/moral problem.

At the moment my display has room for only five cards. If a player gets a lot of low cards then they can fall off the end of the screen. I can think of two ways to fix this.

  1. Spend some time re-arranging the display so that cards can overlap and I can fit up to 21 cards (the absolute limit given that you are playing with six decks in the shoe) on the screen.
  2. Make the fifth card you get always a king.

Creating Windows Phone apps on a Netbook

Capture

It does work, although you might want to attach a larger monitor...

I was wondering if it is possible to run Visual Studio 2010 and create Windows Phone applications on a very small machine, say a tiny MSI Wind netbook with a lowly Atom processor. Turns out that it is, and it is just about useable (as long as you take the precaution of upgrading the memory to 2G).

You can run Silverlight applications on the windows phone emulator but for XNA you need to find a machine with a bit more graphical grunt, since the graphical power in the phone is actually greater than the netbook, which therefore can’t properly emulate it.

Imagine Cup Poland Final Pictures

imagine-cup2010_572_DSC4207

Maria took this picture. Brilliant.

The Imagine Cup World Finals in Poland seem a very long time ago, even though they were just last month. If you were there and want to relive the moment, or you just want to see some excellent photographs, head of to here:

http://mariabielik.zenfolio.com/imagine-cup2010

Maria was one of the judges, noted for her ready smile and the Nikon SLR that was always around her neck. She has posted some of her shots and they are really, really good.

Windows Phone 7 Accelerometer Values

IMG_2120

I’ve been playing with the accelerometer in Windows Phone 7 and trying to make sense of the outputs. If you are interested (and, I guess if you are not) these are the values for the different orientations:

Flat on the desk: X=0, Y=0, Z=-1
Upside down on the desk:X=0, Y=0, Z=1
Standing like a tombstone: X=0,Y=-1, Z=0
Standing like an upside down tombstone: X=0,Y=1,Z=0
Landscape – controls on right: X=-1,Y=0,Z=0
Landscape – controls on left: X=1,Y=0,Z=0

The best way to visualise this is as a weight on a piece of string of unit length tied to the phone. If you hold the phone flat in portrait mode the the weight hangs straight down, giving X=0, Y=0 and Z=-1. Then as you tip the phone up to make it into a tombstone (as it were) the weight moves so that it is hanging directly below the phone, giving a Y of -1 and a Z of 0 and so on.

Apparently these values will be the same irrespective of how the program sets the orientation of the phone, i.e. they are set to give values as if you were using the phone in portrait mode. If you want to use different orientations you will have to transform these values.

I’ve found the readings to be quite accurate, at least as good as my real spirit level.

Windows Phone taskhost.exe error

(Thanks to Diego H for his solution to this one. He posted the solution on the Windows Phone Jump Start forum and I’ve found it very useful.)

image

When I’m writing Windows Phone programs I’ve noticed that I sometimes get the above error when I try to deploy a Windows Phone 7 project to the emulator. This is usually after I have moved or copied the Visual Studio solution to another directory. 

If I don’t get this error I might notice an even stranger manifestation, where changes I’ve made to the program don’t seem to be reflected in the running code. It turns out that this is due to a build setting getting corrupted. To fix it you must go to the Build menu and select Configuration Manager. Then re-select Windows Phone as the Active solution platform, so that the dialog looks as shown below:

image

Then your programs will deploy and run OK. I’ve no idea why this happens, but sometimes this gets set to “Any Platform” with no build or deploy options set, which stops programs from being built or deployed.