Archive for December 2011

Yet Another Post About XBLIG crApps

Following the link in a review begging tweet on #xna I saw the following in the Notes of an XBLIG peer review submission:

“Here’s a quick and dirty Santa flying game I threw together.”

Time to put on the Grinch costume and respond I guess.

While I realize that holiday themed games usually do a little better on XBLIG, if you don’t care enough to take enough pride in your work to do a quality job why should I care enough to review the game? Yes, you might make a few bucks on the game due to holiday theme-ness, but is it really worth it in the long run?

What’s truly unfortunate is that there are enough crApp developers that games like this get passed with relative ease. If I or other developers that really care about the platform can’t find a reason to fail these crApps, there’s little we can do to stop them from passing. This is the downside to Microsoft “democratizing game development”; they obviously didn’t expect, or didn’t care about, people submitting things like flashlight apps, massager “games”, games that take 2 minutes to play through and don’t have any replay value, etc., ad nauseum.

Hopefully other devs that care about the platform will do the same and pass on submissions like this. Maybe I need to start an Occupy XBLIG! :\

Using the Windows Phone 7 camera in an XNA game

This came up in an AppHub forums post and it seemed to help the person out so I figured I’d post it here for posterity (and the fact that I haven’t posted here in ages 🙁 )

using System; 
using System.Collections.Generic; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Content; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Input; 
using Microsoft.Xna.Framework.Input.Touch; 
using Microsoft.Xna.Framework.Media; 
using Microsoft.Phone.Tasks; 
 
namespace Camera_Test 
{ 
    public class Game1 : Microsoft.Xna.Framework.Game 
    { 
        GraphicsDeviceManager graphics; 
        SpriteBatch spriteBatch; 
 
        bool _cameraError = false; 
 
        SpriteFont _font; 
        Vector2 _errorLocation; 
 
        Texture2D _texture; 
        Rectangle _rect; 
 
        public Game1() 
        { 
            graphics = new GraphicsDeviceManager(this); 
            Content.RootDirectory = "Content"; 
            TargetElapsedTime = TimeSpan.FromTicks(333333); 
            InactiveSleepTime = TimeSpan.FromSeconds(1); 
 
            TouchPanel.EnabledGestures = GestureType.Tap; 
        } 
 
        protected override void LoadContent() 
        { 
            spriteBatch = new SpriteBatch(GraphicsDevice); 
 
            _font = Content.Load<SpriteFont>("font"); 
            _errorLocation = new Vector2(25, 25); 
        } 
 
        protected override void Update(GameTime gameTime) 
        { 
            GamePadState state = GamePad.GetState(PlayerIndex.One); 
 
            if (state.Buttons.Back == ButtonState.Pressed) 
                this.Exit(); 
 
            if (TouchPanel.IsGestureAvailable) 
            { 
                if (TouchPanel.ReadGesture().GestureType == GestureType.Tap) 
                { 
                    CameraCaptureTask cameraCaptureTask = new CameraCaptureTask(); 
                    cameraCaptureTask.Completed += new EventHandler<PhotoResult>(cameraCaptureTask_Completed); 
                    try 
                    { 
                        cameraCaptureTask.Show(); 
 
                    } 
                    catch (InvalidOperationException ex) 
                    { 
                        _cameraError = true; 
 
                    } 
                } 
            } 
 
            base.Update(gameTime); 
        } 
 
        void cameraCaptureTask_Completed(object sender, PhotoResult e) 
        { 
            if (e.TaskResult == TaskResult.OK) 
            { 
                _texture = Texture2D.FromStream(graphics.GraphicsDevice, e.ChosenPhoto); 
                _rect = new Rectangle(50, 50, _texture.Width, _texture.Height); 
            } 
        } 
 
        protected override void Draw(GameTime gameTime) 
        { 
            GraphicsDevice.Clear(Color.CornflowerBlue); 
 
            if(_texture != null) 
                spriteBatch.Draw(_texture, _rect, Color.White); 
 
            if (_cameraError) 
                spriteBatch.DrawString(_font, "Camera error", _errorLocation, Color.White); 
            base.Draw(gameTime); 
        } 
    } 
} 

 

Tap the screen to allow a photo to be taken. That photo will be stuffed into a Texture2D object and rendered in the game.

Note: you’ll need to add a SpriteFont to the Content project called “font.spritefont”.

While the person that asked the question says this worked for him, I haven’t tested it. 🙂

XBLIG Games in Game Developer Magazine

Wow, I’m surprised they’re still even looking at the service, but the EIC obviously sees something there. It’s a shame MS doesn’t seem to feel the same way.

Here’s the latest list:

Dead Pixels
DLC Quest
Escape Goat
Four Winds Fantasy
Last Dragon Standing
Mega Shooter 11
Raventhorne
Sins of the Flesh
Solar 2
Wizorb

I still think XBLIG could be a great service for indies, but MS has a lot of work ahead of them to make it so. With the recent news of Win 8 further relegating XNA games to red-headed stepchild, along with rumors of desktop apps not being supported at all on ARM devices in Win 8, it’s become more of an uphill battle to keep XNA alive at all, let alone get it improved to allow indies to be successful when using it.

I still remember back when XNA was first revealed and touted as a tool for both pro and indie. It’s fallen a long way since then and doesn’t appear to be making much progress back up the hill. It’s like climbing Everest without half the needed equipment. MS needs to either kill it completely and put us out of our misery or make it a real game development tool that indies can use without fear of wasting their time.