Monday, September 21, 2009

COMMUNITY QUEST 2009

News for Latin America:

Community Quest 2009 is a treasure hunt game for Microsoft’s technical community, through the content portal of videos, webcasts and and on-site events in Latin America.

The portal is called Community Mediacenter, or CMC located at http://www.LatamCMC.com.

Register!

‘Till next time,
~Pete

 

> Link to Spanish version.

Tuesday, September 15, 2009

ZUNE EXTENSIONS FOR XNA GS 3.1

As many of you may already know, there is a new Zune device model which supports high definition video, named “Zune HD”.

This model brings, among other very interesting features, a touch screen and an accelerometer.

Today, the XNA team has released an add-on for XNA GS 3.1, in order to support this new device.

You can download the extensions from here and or read more about the release on this page.

Enjoy!
~Pete

> Link to Spanish version.

Saturday, September 05, 2009

DREAM.BUILD.PLAY 2009 WINNERS

The winners of this year’s DBP compo have been recently announced:

From the announcement:

Dean Dodrill of the United States earned the grand prize of $40,000 for “Dust: An Elysian Tail” a side-scrolling, action role-playing game in which the player controls Dust, a man searching for himself. Set in the beautiful yet mysterious world of Falana, this game chronicles Dust’s journey to liberate an oppressed village and rediscover his past. Meticulously hand-animated and painted, “Dust: An Elysian Tail” welcomes exploration, action, and above all else, mastery of a fighting system that rewards skilled gamers.

Panya Inversin and his team from the United States took home second place and $20,000 for their stunning 3-D, four-player brawler/space-shooter, “Max Blastronaut”.

Nivel21 Entertainment, led by Mauricio Garcia from Spain, received third place and $10,000 for the challenging puzzle game “Rotor’scope – The Secret of the Endless Energy”.

China’s Hu Ling and his team came in fourth place and received $5,000 for the stylish martial arts action game “HurricaneX2 Evolution”.

Congrats to the winners! (and of course, to all of the six finalists)

You can check the official announcement here and or visit the DBP website. For trailers of all the finalists you can check this site or this other site.

Cheers!
Pete

> Link to Spanish version.

Sunday, August 30, 2009

MICROSOFT ACTIVE PROFESSIONAL 2009

A couple of days ago I received, on behalf of MSFT Technet & MSDN Team for Argentina and Uruguay, the distinction of “Microsoft Active Professional”.

The award is granted to those professionals who are considered to be among the top 5% of most active contributors in the community.

Thanks a lot to Microsoft for honoring me with this award!

Cheers!
~Pete

> Link to Spanish version.

Tuesday, August 18, 2009

WATCHING THE SUN BURN – PART 1

I’ve just got the opportunity to download and test one of the greatest add-on solutions for XNA GS-based projects that one may find these days:

Sunburn Lighting and Rendering Engine.

This product, from Synapse Gaming, saves lots of time for us, XNA Game Creators, when we have to cope with both, the design and implementation of a 3D rendering pipeline for our PC and XBOX 360 games; in particular:

  • Dynamic lights and shadows,
  • Forward and deferred rendering, and
  • Post-processing.

As a matter of fact, Sunburn integrates flawlessly with XNA GS by extending its Application Model, where needed.

But, how come? … ok, before moving onto some tech words (in part 2), just watch the following two videos that really blew my head off:

1. PowerStation Demo (deferred rendering):

Nice, hu?! The source code that produces those great realtime renders serves as a kick off for a pro-like FPS project with little to almost none modifications (btw, the demo project is available in the company’s download page).

Now let’s watch the second video …

2. Reflection-Refraction Demo (forward rendering):

As you can guess and see, this example demands more GPU power. Yeap, the calculations are more intensive here as you approach to three floating orbs, but it does well.

Despite the fact that the app used to record this videos on my desktop PC pushed down the FPS count more than in a normal situation, you can see that the action flows smoothly.

An we’re talking here of a ‘Release’ full-screen compilation targeting the PC and using a high-definition back-buffer of 1280x720.

On my Core 2 Duo desktop PC with a GeForce 8600 gfx -as you can see a standard desktop nowadays- results were indeed promising. For the first demo, the average frames per second count was above 30, and for the second one, above 25.

Accompanied by a set of sample projects, articles and full VS integration, this add-on, in the “flavor” that meets your business’ needs, is a “must have”.

Now, what editions can we find? And, which are the differences among them? This comparison chart answers both questions plus indicates the usual price for each:

“Wait! Why did you say ‘usual’ price?” Glad you ask and here’s the best part … since Synapse Gaming is now a Creators’ partner, all premium members can get the following discounts:

  • SunBurn Community: $100 discount, or
  • SunBurn Pro: $50 discount.

Nice …

Ok, this is it for today. On part two, will be getting a bit into the code side of one of these samples.

‘till then,
~Pete

> Link to Spanish version.

Friday, August 07, 2009

FOLLOW ME ON TWITTER!

I have created an account on Twitter, so if you’re also a member of the Twitter service, and want to follow my daily activities, then just go and search for the nickname “Yoruguaman” …

… or you can follow this link:

Cheers!
~Pete

> Link to Spanish version.

Sunday, July 26, 2009

HOW TO FIX LOCAL ISSUES TO CONNECT YOUR XBOX 360 TO THE XBOX LIVE SERVERS

A few weeks ago I had to reset my router because Windows Vista was giving me problems with my desktop’s wired LAN & WAN connections (note: problem fixed when I upgraded to Windows 7).

The thing is that when I re-configured my router using the file with the last-saved settings, my XBox was having problems when attempting to connect to XBox Live’s channels (both, arcade and indie). In fact, from time to time I used to receive messages saying my connection got lost due to errors 80072741 and so on (as you will see in a moment, I just forgot to persist to disk the proper configuration values of my router. Sigh!).

When that happens, and assuming that the XBox Live Team isn’t working on the servers(testing, updating, etc.), then something wrong must be happening on your side (like in my case).

So, what could be possibly wrong?

  1. Your router is broken,
  2. Your router has a faulty/corrupt firmware,
  3. You’re connecting your XBox 360 using a faulty wire,
  4. Your 360 cannot retrieve a local IP address from the router,
  5. Your router’s firewall is preventing your 360 from connecting to the Internet,
  6. Your router is performing some strict or moderate Network Address Translation tasks (NAT),
  7. You get some weird error messages and or lose connection when playing some games online on multiplayer mode, and
  8. Other connectivity problems.

If one, a few or some of these happened to you, then maybe the following tips could help to solve the issues with your connection. Meaning? No solution guaranteed.

SO USE THESE TIPS AT YOUR OWN RISK!

Now that you were warned, read on carefully …

Your router is broken.

Buy a new one in case it’s not easy or worth repairing. In the meantime you can try to connect directly through your (DSL) modem.

Your router has a faulty/corrupt firmware.

Go to the manufacturer’s support page, download the latest firmware for your router’s model, and update it (first, read your router’s manual to find out how to do the update).

You’re connecting your XBox 360 using a faulty wire.

Just change the latter and try again.

But what if I’m using a wireless connection? Then check your router’s wireless settings, like, say the security method and password.

Your XBox 360 cannot retrieve a local IP address from the router.

First check your network settings on your XBox 360: whether you want to get a dynamic or static IP address, the values for primary and secondary “Domain Name System” (DNS) addresses, the IP address of the gateway, etc.

Now, check on the router the maximum number of connections allowed at the same time. Maybe you are already using all of them.

If the router is currently providing a “Dynamic Host Configuration Protocol” service (DHCP), then any computer, console and or LAN/WAN device may be configured to attempt to get an IP address from the router, dynamically.

This should work fine with your XBox 360 console for supported routers, but in case it doesn’t, just configure the console to get a static IP address.

Which one? Well, simply put, an IP address that you know other systems won’t normally use (for instance, if you have two computers and your console and you are allowing, say, 8 connections, then set the last one as the static one for your console and you’ll probably do just fine).

In order to set a static IP address, on the 360’s Dashboard browse to “System –> Network Settings –> Edit Settings”, and then enter:

  • The static IP address for the console,
  • The Subnet mask (same than the one set in the router),
  • The Gateway IP address,
  • The Primary and Secondary DNS addresses.

Try the connection again, and if everything goes well, your 360 now should have access to the LAN.

Your router’s firewall is preventing your XBox 360 from connecting to the Internet.

Having access to the local network doesn’t mean that the router has also granted access to the Internet. Sometimes, the firewall of your router stops any attempt of your device and or a set of IP addresses to reach the Internet.

If that is the case, then check all security rules set on your router. Most routers allows you to specify either each IP you want to allow access to the Internet, a range of IP addresses and even your devices’ “Media Access Control” addresses (MAC).

Since at home, in my case, the number of devices that connect to the Internet is low, I just specify each MAC address and presto!

It may also happen that Internet access is only available to certain days and hours per day. So you should check those rules, too.

Your router is performing some strict or moderate NAT tasks.

This is one of the most popular issues when an XBox 360 console attempts to establish a secure connection with the XBox Live’s servers.

In short, not all ports and protocols needed to establish an optimal communication are (properly) set.

Ok … uhh … what?

Do the following: test your 360’s connection to the LAN, the Internet and finally Live’s servers, and if you get the result that two out of three work fine, being the latter the one that “partially” fails, then your router’s NAT functionality is not “Open”.

In fact, if that is the case, you can connect to Xbox Live but the connection is not optimal for cases when you want to play, chat, talk and even accept a friend’s invite online.

In order to configure the ports and protocols needed to establish a “sound” connection to the XBox Live services, you either:

  • Place your console in the “demilitarized zone” (DMZ), or
  • Manually configure the specific values using “Port forwarding”.

Note: in order to do one of these, you must first set a static IP address on the console.

DMZ means, in short, that you open all ports and protocols in order to communicate to a certain device with a specified IP address. So your device is placed inside an unsecured zone or if you prefer an unrestricted area. DMZ is too risky!

The alternative (the one I prefer): to manually set only the pair of ports & protocols actually needed for the connection for a certain device with a static IP address (in this case, your 360’s IP address).

All you have to do in the latter option, is selecting the “Port Forwarding” tab in your router and the setting something similar to:

  • Applications name (say, “XBox360Live”),
  • Each port range (“from 80 to 80”, and so on),
  • The accepted protocols (UDP/TCP/Both),
  • The local IP address (that is, your 360’s static IP address value), and
  • Check “Enable” (or whatever option you need to activate the rule).

Read this article in order to know which ones you must set.

As I said at the beginning of this post, the above-mentioned issue was the one preventing my 360 console from connecting to Xbox Live, properly. In short, the configuration file I had saved long ago as a backup didn’t include these settings. Fixed!

Now, continuing with the topic …

Optional: some recommend (I don’t) that when you receive the error code 8007274c, unchecking an option similar to “block anonymous Internet requests” on your router’s firewall may help. Plus, in some cases, clearing your console’s cache (warning: doing the latter will also erase all software updates! You will have to load the updates again) and or verifying that the proper DNS values are set.

By the way, port forwarding only works for one application at a time, which means that if two applications on the LAN attempt to get access, say, to the Internet using the same port, a conflict occurs and if your router cannot resolve the situation, connectivity gets affected … maybe your 360 is one of the devices in conflict!

If your router’s firewall has a log, check it to see which device and application is the source of the conflict. You can also try to check the log of your devices’ respective firewalls –if any.

If you cannot identify what’s causing the port conflict, I guess that turning off all devices but the 360 console, should fix this connectivity issue, so you can play some games online again.

You get some weird error messages and or lose connection when playing some games online on multiplayer mode.

If you do have a valid Live Gold Membership, then this is somewhat related to the port issue.

Some games need a few ports open for certain protocols (TCP/UDP/Both), which differ from the ones listed here.

Again, if you don’t want to set (the IP address of) your console on DMZ, then you should manually set both, port plus protocol, for that game.

Ok, how can I know which pair should I set? Well, you can either do an Internet search to find out or visit sites like http://www.portforward.com/, which have a lot of info in this respect, for a list of routers and services (including 360’s connections).

Other connectivity problems … plus fixes?

Say, your router must support a minimum MTU (“Maximum Transmission Unit”); in case of XBox Live that is: 1364. Or your ISP’s DSL modem is not good enough (request a change).

It would be great to know both, the problem you experienced when connecting your 360 to XBox Live and, of course, the fix.

Well, this is it. I hope you find this info useful.

Enjoy your games!
~Pete

> Link to Spanish version.

Friday, July 24, 2009

XNA CREATORS CLUB ONLINE REVAMP

Wow! When I woke up this morning and turned on my desktop computer I found quite pleasant news on the creators’ site: it has been revamped!

The homepage has gone through some changes in its look: the news, the ads, the general info have been all rearranged in a more attractive way! Just check it out.

Plus, there’s some new panels like “Top Movers” … wait! What’s a “top mover? From now on, all you do in XNA CCO will give you reputation, either in a positive or negative way:

  • Good contribution: clink! Your reputation moves up. Congrats!
  • Bad contribution: bam! Behave …

Please read this article to get detailed info on how reputation works.

But wait! There’s more:

  • New Countries: Japan an Germany (and also updates to Singapore and Sweden),
  • Tokens: you are a premium member of XNA CCO, you create and submit your games, you receive 50 tokens per game title! Be smart: use them to “increase awareness of your game”,
  • Game Updates: when you submit and publish a new version of your game to the XBox 360, a notice will pop up for existing customers asking if they want to download the newest version,
  • 3.1 Submission: you can now submit games created with XNA GS 3.1, but you will see them on the 360's marketplace (after passing peer review) from August 11, 2009 and on,
  • New Price Structure: 80, 240 and 400 points! Read carefully how this new structure will affect games already available in the marketplace, and
  • XBox Live Indie Games: yes, finally! The new name for our videogames is starting to show up almost everywhere. The name change will be completed later this summer.

Nice one, guys!
~Pete

> Link to Spanish version.

Tuesday, July 21, 2009

Friday, July 17, 2009

XBOX LIVE DASHBOARD UPDATE PREVIEW

Many websites are reporting details about the upcoming “Autumn Update” for the XBox 360’s Dashboard.

There are really great features being added in this one like, among others:

For a full list of the new features, you can read this article.

Cannot wait!
~Pete

> Link to Spanish version.

Sunday, July 05, 2009

“XNAVATARS” - PART 2 – NO SHADOWS?

As promised, I’m hereby posting the second part of the series about using Avatars with XNA GS on the XBox 360.

If you remember, on my first article I showed how to draw an animated avatar on screen taking into account transitions between two animations.

In this part, I will talk about one factor that will help you improve a little bit the eye-candy in your game when using avatars: shadows.

As you may know, the Avatar’s rendering system does not allow us to use a custom shader effect to render an avatar on screen; instead, we must only use the built-in system to accomplish that task.

On one side, this simplify things but on the other, it limits our possibilities a little bit.

Casting shadows is an example of this limitation. As I will show you in a minute or two, a “cheap” workaround can can used, for simple games.

The technique I’ll use is known as “Flat Shadows” (the XNA Framework includes all we need for it). It is a rather basic substitute for “real” shadows, but it will do the trick just fine for projects that don’t require “picky” shadow effects.

We will be using the project I had included last time as a starting point and mainly focus on the code to add and or modify.

1. Fields to add:

private Matrix[] transitionTransforms, shadowTransforms;
...
private Plane plane;
private float lightRotation;
private Model floor;

What’s new? The ‘shadow transforms’ array will store the matrices we need to flatten the model based on a reference plane, which we also define.

2. The constructor:

...
// Create the array of matrices that will hold bone transforms for shadows.
this.shadowTransforms = new Matrix[ 71 ];
...

Nothing fancy here. Just create the array that will hold the collection of matrices to flatten the model.

3. Initializing the game:

/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content.  Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
    this.plane = new Plane( Vector3.Up, 0 );
 
    // As usual, initialize all compoenents.
    base.Initialize();
}

We just create the reference plane with a normal facing up and without moving along that normal (so it’s a XZ plane where the Y coordinate is zero, initially).

4. Loading content:

...
// Set the "World" value wit a rotarion of 180º.
this.avatarRenderer.World = Matrix.CreateTranslation(
    Vector3.Right * -1 + Vector3.Up * 0 + Vector3.Forward * -1 ) *
    Matrix.CreateRotationY( MathHelper.Pi );
...

We just modify the line that places the avatar in the world.

5. Updating the game:

We will only add this line:

...
// Update the value used to rotate the light.
this.lightRotation += .5f * (float)gameTime.ElapsedGameTime.TotalSeconds;
...

So the light will rotate to show the effect.

6. Drawing the avatar:

/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw( GameTime gameTime )
{
    // As usual, clear the backbuffer (or the current render target).
    GraphicsDevice.Clear( Color.CornflowerBlue );
 
    // Create the array of bone transforms for the floor and populate it.
    ModelBone[] transforms = new ModelBone[ this.floor.Bones.Count ];
    this.floor.Bones.CopyTo( transforms, 0 );
 
    // For each mesh in the floor model.
    foreach(var mesh in this.floor.Meshes)
    {
        // Get the basic effect.
        foreach ( BasicEffect effect in mesh.Effects )
        {
            // Set values and commit changes.
            effect.DiffuseColor = Color.LightSteelBlue.ToVector3();
            effect.View = this.avatarRenderer.View;
            effect.Projection = this.avatarRenderer.Projection;
            effect.World = transforms[ mesh.ParentBone.Index ].Transform;
            effect.CommitChanges();
        }
 
        // Finally, draw the mesh.
        mesh.Draw();
    }
 
    // Can we draw the avatar?
    if ( avatarRenderer != null && currentAnimation != null )
    {
        // If we can, is the animation in transition?
        if ( this.isInTransition )
        {
            // If so, draw it with the interpolated transforms.
            this.avatarRenderer.Draw(
                this.transitionTransforms,
                currentAnimation.Expression );
        }
        else
        {
            // If not, draw it with the actual transforms.
            this.avatarRenderer.Draw(
                this.currentAnimation.BoneTransforms,
                currentAnimation.Expression );
        }
 
        // Make the light sources of the avatar dark.
        Vector3 ambientColor = this.avatarRenderer.AmbientLightColor;
        Vector3 lightColor = this.avatarRenderer.LightColor;
        this.avatarRenderer.AmbientLightColor =
            this.avatarRenderer.LightColor =
                -10 * Vector3.One;
 
        // Enable alpha blending.
        GraphicsDevice.RenderState.AlphaBlendEnable = true;
        GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha;
        GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha;
 
        // Change the depth bias just a bit to avoid z-fighting.
        float sourceDepthBias = GraphicsDevice.RenderState.DepthBias;
        GraphicsDevice.RenderState.DepthBias = -0.0001f;
 
        // Set the new light direction.
        this.avatarRenderer.LightDirection = Vector3.Normalize(
            Vector3.Right * 7.5f * (float)Math.Cos( lightRotation ) +
            Vector3.Forward * 15.0f * (float)Math.Sin( lightRotation ) +
            Vector3.Up * 10.0f );
 
        // If the avatar is stepping over the floor, then move the plane 
        // according to the "altitude" of the avatar in the world so as
        // to calculate and cast shadows in the correct world position
        // (also, take into account that in case of a "jump" movement, in a 
        // "complete" shadow system you must reposition the shadow along the 
        // floor taking into account the place where the light-ray hits the 
        // floor while it points to the avatar; otherwise, it will stand still 
        // as if the avatar never jumped in the first place).
        this.plane.D = -this.avatarRenderer.World.Translation.Y;
 
        // Calculate and set the world transform that will flatten the 
        // avatar's geometry, taking into account the original rotation,
        // scale and translation factors.
        Matrix world = this.avatarRenderer.World;
        this.avatarRenderer.World *= Matrix.CreateShadow(
               this.avatarRenderer.LightDirection,
               this.plane );
 
        // Is the animation in transition?
        if ( this.isInTransition )
        {
            // If so, draw it with the interpolated transforms.
            this.avatarRenderer.Draw(
                this.transitionTransforms,
                currentAnimation.Expression );
        }
        else
        {
            // If not, draw it with the actual transforms.
            this.avatarRenderer.Draw(
                this.currentAnimation.BoneTransforms,
                currentAnimation.Expression );
        }
 
        // Reset all affected values.
        this.avatarRenderer.World = world;
        this.avatarRenderer.AmbientLightColor = ambientColor;
        this.avatarRenderer.LightColor = lightColor;
        GraphicsDevice.RenderState.DepthBias = sourceDepthBias;
        GraphicsDevice.RenderState.AlphaBlendEnable = false;
    }
 
    // The following is used to show some statistics and other info
    // on screen. It can be omitted (or optimized).
    this.spriteBatch.Begin();
 
    // No need for further explanation.
    this.spriteBatch.DrawString(
        this.font,
        "Press 'A' to force changing animations or 'Back' to exit.",
        new Vector2( 50, 25 ),
        Color.White );
 
    // No need for further explanation.
    this.spriteBatch.DrawString(
        this.font,
        "Press 'B' to change the type of selection : " +
        ( this.moveRandomly ? "RANDOMLY" : "IN ASCENDING ORDER" )
        + ".",
        new Vector2( 50, 55 ),
        Color.White );
 
    // Draw the animation pointer, whether we are processing a transition and
    // the current transition time. Please notice that in this implementation
    // when the current animation is about to end (that is, 1 second or less),
    // the pointer "currentAnimationId" will change even if the animation is still
    // the same, so you will see a different number and name during 1 second or so.
    this.spriteBatch.DrawString(
        this.font,
        this.currentAnimationId + " : " +
            ( (AvatarAnimationPreset)this.currentAnimationId ).ToString() +
            " (" +
            ( !this.isInTransition ? "no transition" : this.transitionProgress.ToString() + " processed" ) +
            ").",
        new Vector2( 50, 85 ),
        Color.White );
 
    // Draw the current position and length of the animation being rendered.
    if ( currentAnimation != null )
    {
        this.spriteBatch.DrawString(
            this.font,
            "Processed " +
            this.currentAnimation.CurrentPosition.ToString() +
                " of " +
                this.currentAnimation.Length.ToString() +
                ".",
            new Vector2( 50, 115 ),
            Color.White );
    }
 
    // Flush the batch.
    this.spriteBatch.End();
 
    // As usual, call the base method.
    base.Draw( gameTime );
}

Here’s where most changes occur; the game ...:

  1. ... draws the avatar as on my previous example,
  2. ... changes the values of the lights that affect the avatar,
  3. ... adjusts the depth-bias to avoid any eventual z-fight,
  4. ... rotates the light and adjusts the plane altitude before flattening the model,
  5. ... updates the position of the flattened model using the static method of the matrix struct, which is named in the code as “CreateShadow”,
  6. ... draws the fake shadow, and finally ...
  7. ... restores the values of the lights and position of the avatar’s model meshes.

7: Changes to transitions code: none.

If everything goes fine you will see something like this:

Things to notice, though:

  1. Shadows will be drawn even when there’s no elements to cast shadows on (see how part of the shadow is rendered beyond the “floor” for a short period of time),
  2. You will have to modify the location of the shadow when the position of the avatar changes its height (i.e.: if jumping),
  3. The model’s meshes are flattened onto a reference plane, so it will only work for objects on that specific plane (like, in my example, a floor), and
  4. Thus, there’s no self-shadowing.

A more precise approach would be extending this example by trying to use the stencil buffer and depth data, as explained at the end of this thread.

Well, this is it for today. You can find the source code for this example here.

Cheers!
~Pete

> Link to Spanish version.