Bridging SigC++ to .NET via P/Invoke

If you’re a seasoned C++ developer, chances are you’ve come into contact with a signals/slots library at least once during your work, maybe you’re even using one right now.

If you haven’t heard of this before, let me give you a short introduction: a signals/slots library is nothing more than a fancy callback system: A class, let’s think of a fictional Button class for now, can provide signals like Pushed signal. A signal is just a list of callbacks that can be invoked when the signal is triggered.

Now any party interested in getting notified when the button is pushed can subscribe itself to the Pushed signal and will be notified by means of a callback. Typically you can bind any plain function, class method or functor to a signal.

Read More

7 Engines You Should Know

This post is not exactly related to .NET/XNA game development, but I like to keep track of what’s going on in the world out there and I still like C++ better than C# ;)

Having played the whole engine shopping game more than once, here are 7 engines I’d take a closer look at if I were to write a game in C++. I’ve listed them in order of personal preference, but be warned, this is entirely my opinion and not based on proper research!

Notice

Old Content!

I blogged this 5 years ago and things have changed quite a bit since then. Today (2012), I’d recommend Unity for most cases and for special needs use either C4 Engine (built-in editor, volumetric terrain) or Ogre 3D (volumetric terrain, sky + water simulation, Android/iPhone/WinRT+Metro support).

Read More
The logo of the WiX XNA intaller, a cheap montage of the WiX and XNA logos

WiX Installer for XNA Games

My GameSetupHelper library is making good progress. I was finally able to get some insight into the workings of WiX and Windows Installer.

I’m just about to create a small installer template for XNA games that will automatically check whether the required system components are available (for XNA games, these are DirectX 9.0c with the D3DX library from October 2006, the .NET Framework 2.0 and of course the XNA Framework).

Screenshot of a windows installer GUI showing the .NET/XNA/DirectX detection results

What I’m looking for now is feedback on the installer (you can find a download link for an example .msi at the end of this article).

  • Is the detection working for you?
  • Do you think the presentation is okay?
  • Do the logo bitmaps look abhorrent? (I’d happily accept any contributions *wink*)
  • Would people be scared by the additional slide during setup? (I tried to be honest about what the installer does to your system and at the same time follow MS recommendation to just silently install anything that’s required)
  • Do I violate any licenses with this? (I am including the official redistributables inside the MSI file, which to my understanding is legal)
  • Anything else that you think might be wrong or missing?

I plan to release the sources of this template for free once I’m done. If you absolutely need to get that installer sources NOW, just send me a mail :)

XNA Game Installers

This weekend, I’ve been thinking about ways to create an installer for my game project. For desktop applications, the technology of choice is of course Microsoft Windows Installer, which generates handy .msi files. It also automatically tracks which steps are neccessary to uninstall the application and it has the convenient repair function. However, when it comes to installing the .NET Framework, the DirectX Runtime or the XNA Framework, there seems to be no existing solution for integrating these steps into a single .msi package.

Another option would be to use NSIS, which requires you to write the uninstall actions yourself and also uses a rather cryptic scripting language, but otherwise provides all the features you expect from a modern installer. It even has LZMA compression (known from 7-Zip), which is far superior to the compression ratio of the .cab files embedded in .msi packages.

I couldn’t get my head wrapped around the declarative programming style used by WiX yet, so unless I discover a nice free MSI authoring toolkit that can be in automated builds, I’ll probably go with NSIS.

Well, whatever I’ll choose in the end, I’ve written a small DLL that can detect whether the .NET Framework (1.0/1.1/2.0/3.0) is installed, whether DirectX (9.0) is available, whether the XNA Framework (1.0/1.0 Refresh) is installed and whether the AGEIA PhysX System Software is in place. The DLL is written in pure C++ and doesn’t rely on anything, not even the C++ runtime libraries. It can be interfaced from both NSIS and MSI.

Screenshot of the NUnit GUI running some tests  detecting whether XNA framework is installed

If anyone wants to help create an installer template for XNA games, be welcome!

The Microsoft XNA logo, just the letter xna with the downward slash of the X colored orange

XNA vs Silverlight vs Native Code

If you write a game in Flash, you will have to accept some performance limitations and make some compromises in terms of available technology (eg. no Ageia PhysX or hardware shaders for you). But nearly everybody can play the game right in his browser, dramatically expanding the number of people that see your game.

Now Microsoft is hurling a competitor to Flash at the market: Microsoft Silverlight. It is based on the .NET Compact Framework 3.5 and WPF, which makes it about 1000 times more powerful than Flash. WPF also includes 3D graphics and is way faster than flash, allowing for full-screen animations where flash would slow down to a crawl. It’s being ported to Mono/Linux as well, with the help if none other than Microsoft!

Read More

XNA Vector Font Renderer

I’ve been fiddling around with font rendering again this weekend. For my upcoming game, I wanted a cool intro effect like in some movies, where the displayed text is very very slowly expanding. But I couldn’t quite replicate that effect with the XNA SpriteFont class. Even with antialiasing turned on, the borders of the text were flickering. Using very large font sizes resulted in hopelessly oversized .xnb files with only a slight improvement for the unsteady borders.

So my new solution was to write a component that renders vector-based text instead of bitmaps. Extracting the vector data from a font was a bit harder than I had expected because fonts consist mostly of complicated second and third order bezier curves. I managed to break these down into plain straight line segments and am now in the possession of a content pipeline importer that converts .ttf fonts into arrays of line segments. Behold:

Screenshot of vector fonts rendered as outlines in 3D

Read More

Installing Visual C++ 2005 Express

Notice

This article is outdated!
Instead of following the steps in this article, just download and install the newer Visual C++ Express editions which already include the Windows SDK (previously known as the Platform SDK).

This article will explain how you can install the freely available Visual C++ 2005 Express Edition together with the Windows SDK required to create Windows applications and use most of the code available on the ‘net.

If you’re interested in doing Windows game development in C++, Visual C++ 2005 Express is a great choice because it combines a world class IDE with the optimizing version of the Microsoft C/C++ Compiler. If you’re concerned with standards compliance, rest assured that Microsoft’s compiler is among the best.

More Information

History Lesson: Microsoft and the C++ Standard

The idea that Microsoft compilers have poor standards compliance is rooted in Visual C++ 6.0, which was shipped before the C++ ’98 Standard had been completed but lived well into the C++ ’98 era. Visual C++ 2005 doesn’t have such problems at all and is actually one of the best – if not the best – compiler in terms of ISO/ANSI C++ standards compliance. With Herb Sutter, Microsoft has also won a famous member of the C++ standards committee for its own development team (see ISO/ANSI C++ Standards Committee Secretary Herb Sutter Joins Microsoft’s Developer Division).

The only obstacle for game programmers is that the Express Edition of Visual C++ 2005 doesn’t include the Platform SDK, Microsoft’s collection of headers and libraries for windows development, including the all-time famous Windows.h. This article will guide you through the entire process of installing Visual C++ 2005 Express, setting up the Platform SDK and configuring your build environment.

Read More

XNA Windows.Forms UserControl

Notice

This article is outdated!
This was a pretty cool achievement at the time, but XNA 1.0 is long gone. Microsoft now offers their own examples on how to do this:
WinForms Series 1: Graphics Device
WinForms Series 2: Content Loading

A topic that pops up every now and then is how to use XNA in a Windows.Forms application. This is rather difficult because the GraphicsDeviceManager provided by Microsoft creates its own window and will not cooperate with a normal Windows.Forms window, thus forcing the developer to roll his own GraphicsDevice initialization and management code (which is quite a bit of work!)

As can be seen in one of my recent news posts, I did just that while developing a world editor for my upcoming game Island War. Because of the great demand for such a component, I decided to release my XNA GameControl class to the public. You can download it here:

An XNA-based pong clone running inside a Windows.Forms application

How to use:

  1. Add a reference to Nuclex.GameControl.dll (or to the project if you integrated the project file into your solution)
  2. Create a new UserControl that inherits from Nuclex.GameControl. You can do this by adding a normal UserControl and replacing the : UserControl by : Nuclex.GameControl in the class definition.
  3. Override the LoadGraphicsContent(), UnloadGraphicsContent(), Update(), Draw() and so on methods as usual.

There’s one issue: Because the working directory will be set to the system’s temp folder when your control is shown in designer mode, you will not be able to view your game in the Visual Studio Forms Designer if it is loading content using the XNA content pipeline (well, unless you want to copy your project’s output folder into your temp directory whole). There will be no problems starting or debugging the project, though.

Island War Day 3

I decided to put some work into creating an editor that I can later use for building the levels and perhaps even include with my game. XNA gave me a hard time getting it to work inside a Windows.Forms application and I had to rewrite several of the XNA classes until I had a properly working XNA UserControl allowing me to render my game world inside the editor window.

Screenshot of a height map editor with dialog controls and a tool panel

Of course, the editor had to look modern and neat, with dockable panels and color gradients all over the place. As it turned out, there is no built-in solution for docking windows in the .NET Framework, so, given my plans to release the game’s source code, I had to find a solution that was both free and provided a decent user experience.

Read More

Island War Day 2

I know, as always, I’m a bit late with updates, but just in case you don’t know yet, the Microsoft guys finally opened www.xna.com. Finally, a complete website dedicated to XNA instead of the cramped MSDN section!

The developer area has been moved to http://creators.xna.com, including a wealth of tutorials and a revamped discussion area.

This weekend, I tried finally getting texture splatting to work for my Island War terrain renderer… and failed miserably :D. Look for yourself:

Screenshot of a height-mapped terrain with lighting and textures

There’s a lot of tuning to do until this crappy… something… looks like believable terrain. I’m not aiming for photorealism, but I’m not settling for a surreal landscape that stands out like a children’s painting would in an art gallery, either :)