Tag Archives: software

Steam Early Access: Four Weeks In

So it’s been four weeks since we launched Drifter on Steam Early Access and I figured it might be worthwhile posting about our experience launching there. The short version is it’s definitely been a very positive experience so far and assuming that we can continue to grow interest in the game while we work on it this will be the best year yet for Celsius Game Studios.

Continue reading

A Simple Data Serialization System for C++

It’s been a while since I last blogged, as I’ve been quite busy working on Drifter; both the game and the physical rewards for Kickstarter. Many of which, I might add, have already been produced and sent off to my backers. Also a close family member was diagnosed with cancer over the summer and that threw me for a bit of a loop so things have been a bit out of sorts, however while they’re not out of the woods yet things are looking very promising. So in an attempt to return to some level of normalcy I’m going to try and get back to my “hectic” one-blog-a-month-or-so schedule.

Continue reading

Quickly Convert Your Game Music to AAC on OSX

This is just a quick post aimed at iOS developers covering the incredibly easy command-line method to convert your music files to AAC format. The reason you might want to do this is because MP3 is encumbered with a patent which covers the distribution of MP3’s commercially, even as part of a game (see here). It should also be noted that Apple’s license for their hardware MP3 decoder does not in any way cover your distribution of MP3’s in your game.

You could convert to OGG Vorbis, which is of course free and clear to distribute as you please, however many devices (including iOS devices) do not support hardware accelerated decoding of OGG Vorbis files so you are losing some of your CPU cycles for your music decoding. Luckily, there is a third option: The Advanced Audio Coding or AAC format, which of course is supported in hardware by all of Apple’s portable devices. There are patents surrounding AAC but none of them restrict the distribution or streaming of files encoded in AAC.

Anyway now that I’ve spent all that time leading up to a single command, here it is…

afconvert -f m4af infile.mp3 outfile.m4a

And that’s it! As far as I’m aware you can use any of the iOS SDK methods for music playback with this new file.

Chromodyne: A Successful Failure

I’ve been thinking for a while about writing up a postmortem of my first crack at making a Real Game, Chromodyne, for a while now. The worry is, of course, that someone may look at this as some sort of horrific waste of time and tell me I’m mad for trying to break into the App Store when… oh my god it has how many apps? However in all honesty, despite the less than stellar sales leading to what one might declare a failure on the App Store, for a number of other reasons, I feel Chromodyne has been incredibly successful and I wouldn’t have it any other way (well, except maybe the whole not selling well part).

What the hell are you talking about?

What I mean when I say “successful” I mean that on the whole, even considering the time I spent working on it only to have it sell a few hundred copies so far, I still learned a lot of valuable lessons, met a lot of awesome other developers, and it helped prove to me that I had what it takes to develop an entire video game from start to finish and to kick myself in the ass and finally decide that I should follow my dream of becoming a game developer.

What went wrong?

There were a few key things that I feel went wrong that, hindsight being 20/20, I would have done differently. Here they are in no particular order:

  • Not enough exposure – I didn’t enter into this whole App Store dealio completely blind to the fact that in order to become successful people need to know about your app. I definitely made a decent stab at it, but my relative newness to the whole scene plus working a full-time job at the time hampered my ability to really get the word out.
  • Poor branding – I fretted a long while over trying to give the game a neat and catchy title, as you should try to do, however I really didn’t think this whole “Chromodyne” thing through. After trying to explain the game to others in person, it’s definitely a clumsy name when spoken and makes it difficult for that whole “word of mouth” thing to work when people don’t know how to spell it to look it up online. Also, in retrospect, the icon could probably have used a bit more work to make it pop more on device and on the app store.
  • Fiddly controls – One problem you can not ignore in game design is how your players interact with the game. If the player is constantly fighting with the controls they will never truly get to enjoy the game and you run the risk of them abandoning it for something else. In the case of Chromodyne, I was well aware of the issues with the controls and tried to minimize their impact as much as possible, but by the very nature of the game field layout it meant that the inner-most rings were difficult to touch accurately. As well, I felt that with practice people would become better at the game and that’s what many of the reviews revealed. However, as the cliche goes, the first impression is the best impression.
  • Choosing an over-represented genre – Approximately 105% (or so) of the games on the App Store are match-3 games. Even though one cynical critic (the only bad web review I received, I might add) accused me of trying to jump on the App Store Gold Rush Bandwagon(tm) the reason I decided to try my hand at a match-3 game for my first game was because I felt it would be much easier for me to complete a game with a smaller scope in a reasonable amount of time. Speaking from experience, I have a tendency to come up with grand designs which would take a large team a couple of years to complete, so I had to learn to work within my own ability to actually make something.

What went right?

  • Learned a lot about game development – If anything I took away from this whole experience, it was a lot of experience about the game development process, including learning things about the iOS platform, the App Store, and various new programming techniques that helped make it a lot easier when I started work on my second game, Red Nova.
  • Made something I’m proud of – Despite all I’ve said about Chromodyne so far, it’s my creation and I’m really happy that I made it. It may not be perfect, but it has gotten some good reviews and on balance it may not be the best game in the world but it’s still pretty darn good. As well, I think the thing I’m most proud of are the story and characters I created for the game and maybe some day in the future Gary and Zarlax will ride again :)
  • I’m following my dream – As I’ve mentioned in an earlier post, I’ve struggled over the years trying to figure out what direction I was going to take in my life. Games and game development have definitely been a passion of mine, and it’s something that I’ve always wanted to do professionally, but ultimately I had to make Chromodyne first to prove to myself that I had the ability. So Chromodyne was the catalyst of this at times scary but entirely exciting new path I’ve taken in my life. Also, it helped to show the people at the Genesis Centre, the startup incubator I’ve been accepted into, that I have what it takes to, as they say, do this thang.
  • Met a lot of amazing people – Through all of this I’ve met and connected with some really great people in the game development community on the internet at large and it’s really helping me feel like I’m a part of the industry now, however small my part is at the moment.

What’s next?

After six months in development, I’m on the verge of submitting my new game Red Nova to the App Store, and from all I’ve learned and all I’ve worked towards I’m confident it will be more successful than Chromodyne. How successful, I have no idea, but hopefully enough that it will allow me to keep working on adding updates to Red Nova and to start making other even more complicated games in the future. That being said, I’m currently working on getting into a position where I’ll be able to hire a 3D artist early in the new year. In addition to taking Celsius Game Studios from “one guy hacking on games in his living room” status into “if you squint hard enough, it looks like a real company” territory, it’ll help me focus solely on game design and development and allow for the creation of a larger variety of and even better looking art assets than I can eke out with my meagre art ability.

Finally, in celebration of Chromodyne being on the App Store for a little over a year (since October!) I am going to, tongue firmly in cheek, declare Chromodyne and Chromodyne HD Celsius Game Studios Not-Quite-Greatest-Hits and drop the price permanently to $0.99. You can learn more about them at the game’s page.

A More Robust Game Center Availability Check

I just wanted to share the small addition I made to the isGameCenterAvailable() function Apple provides for checking to see if Game Center is available/supported by a particular device.

The reason this is necessary is because the iPhone 3G supports iOS 4.1+ however it does not support Game Center, therefore the Apple-provided isGameCenterAvailable() will say GC is supported, when it is in fact, not.

Enjoy!

Edit: Some people have questioned why I should do this, especially when Apple themselves recommend against it. This is because the current Game Center login dialog as presented in-game when calling authenticateWithCompletionHandler has absolutely no information as to the purpose of the login. While most people will rightfully assume it’s for Game Center, there are still a number of reports of users getting angry at developers thinking that they are trying to steal their login information. So the idea here is to use this code in conjunction with a friendly dialog explaining the impending Game Center login and how awesome it is, thus reducing the potential for user confusion. The reason you want to check for the 3G is so you don’t present your “I’m about to log in to Game Center” dialog and then… not log in to Game Center.

If the situation with the dialog improves, or the 3G is ever graced with Game Center support, it is easy enough to update your game to take out the check for the device.

#import <GameKit/GameKit.h>
#import <sys/utsname.h>
 
bool isGameCenterAvailable()
{
	// Check for presence of GKLocalPlayer API.
	Class gcClass = (NSClassFromString(@"GKLocalPlayer"));
	// The device must be running running iOS 4.1 or later.
	NSString *reqSysVer = @"4.1";
	NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
	bool osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);
 
	if(gcClass && osVersionSupported)
	{
		struct utsname systemInfo;
		uname(&systemInfo);
		//iPhone 3G can run iOS 4.1 but does not support Game Center
		if(strcmp(systemInfo.machine, "iPhone1,2") == 0)
		{
			return false;
		}else{
			return true;
		}
	}else{
		return false;
	}
}

Red Nova Beta Testing

Edit: Just wanted to say thank you for such an amazing response and beta testing is now nearing completion! Thanks for your interest, and hopefully Red Nova will be out soon!

I have a few more device slots that I’m able to set aside for beta testing of Red Nova, so I’m wondering if there’s anyone else out there who wants to help me make the game as awesome as I possibly can.

I can’t offer much in compensation right now except for a “Beta Tester” credit in the credits for the game and the satisfaction that you’ll gain in knowing you helped me make sure Red Nova doesn’t cause people’s iPhones to explode violently when adjusting the in-game volume (I promise I’ll try really hard not to explode your iPhone, violently or otherwise, during the beta). Also, you get to be among the first people ever to play Red Nova which I think, despite my obvious bias, is pretty damn cool.

Anyway, that being said what I’m looking for is both feedback on the game itself as well as help in finding any bugs in the code.

If you’re interested you can email me at colin[at]celsiusgs.com (after replacing the [at] with the appropriate symbol :)) or @reply me on Twitter with whatever devices you have and when I’m done compiling the list of potential beta testers I’ll get back to you if I’m able to add you to the beta or not!

As for the beta itself, I’m planning on making a pre-beta build available sometime this week for those that are interested in trying out the gameplay. I’m still in the polishing stage, so there are some rough edges and things that are just plain missing. I’m pretty excited though and I really want to share the game with others to see if they feel the same way.

The plan after that is to seed the first full beta in a week or two, once everyone has had a chance to play around with the pre-beta build and I’ve had a chance to take a grinding wheel to the rest of the code ๐Ÿ˜‰

Retina Display, Open GL, and You!

Over the long weekend, I took some time to code support for the iPad and iPhone 4’s Retina Display into Red Nova. It was a fairly painless process, after Paul Pridham pointed me in the right direction.

If you are using OpenGL for your app on the iPhone and are using an Orthographic projection for your 2D bits, you shouldn’t have to change much of your code to get it “Retina Ready”.

Setting the View Scale Factor

First, your Open GL View class if you add the following in your init code it will tell the OS that you want to display your graphics at 960×640:

if([[UIScreen mainScreen] respondsToSelector: NSSelectorFromString(@"scale")])
{
	if([self respondsToSelector: NSSelectorFromString(@"contentScaleFactor")])
	{
		self.contentScaleFactor = [[UIScreen mainScreen] scale];
	}
}

If you run your app at this point you should see the content running in the corner of the screen because your GL viewport is still running at 480×320. So that brings us to…

Setting up the Open GL Viewport

Note: If you haven’t already you may want to make a wrapper function that returns the current device scale factor. I did and it’s very useful in code that needs to properly deal with displaying your graphics at the right size.

Anyway, this is the next and pretty much final step.

Find your call to glViewport, and modify it thusly:

glViewport(0,0,usefulGetScreenWidthHelper()*usefulGetScreenScaleHelper(),
	usefulGetScreenHeightHelper()*usefulGetScreenScaleHelper());

Obviously change the width and the height to correspond to your app’s layout.

If the rest of your code sets up your projections (2D and 3D) based on 480×320, when you compile and run your app you should get glorious retina display goodness! You will of course have to adjust your 2D bitmapped assets (fonts and images) to reflect the higher resolution of the display, but the end result is that your app thinks in 480×320 (this is how Apple manages it with Cocoa Touch, as far as I can tell, amusingly enough) but displays at 960×640!

GameFontMaker

GameFontMaker Icon

GameFontMaker

July 9th Update: GamefontMaker is now at 1.0.0 beta 2 and itโ€™s also been released under the GPLv2. You can find the latest version and source over here!

It’s been a while since I’ve posted anything to the blog, so I figured I’d do something a bit special to try and get into the swing of things. So, I present to you what I think may be the first native Cocoa bitmap font creation tool for games, GameFontMaker!

At least, I think it is… Maybe… I didn’t do a lot of research, but I have seen a lot of fellow iOS devs wishing something like this existed for OS X, as the only other alternative runs under Windows.

Even if it isn’t, I was getting sick and tired of my really awful bitmap font creation tool that used FTGL, SDL and duct tape and generally produced hideous bitmaps without a lot of fudging of numbers. This is much, much better than that.

Anyway, GameFontMaker is currently in “beta” so don’t come crying to me if your computer explodes or anything. Though in my defense it hasn’t caused my MacBook to explode, and it was way less stable when I started it about 12 hours ago!

This is also my first Cocoa app, so forgive me if it’s a bit rough around the edges.

That being said, if you do find a bug or have a suggestion you could always drop me an email at: colin[at]celsiusgs[dot]com.

So, you’re itching to create some decent bitmap fonts for your game? Well, GameFontMaker is pretty easy to use. From the main window:

GameFontMaker Main Window

GameFontMaker Main Window

You can select the font by clicking on the “Fonts” toolbar button, doing so updates the preview. Once you’re satisfied with your selection, click “Export Font” which opens a file dialog. Choose the file name here, it will automatically choose a .png extension. Once you make sure you’re not overwriting an important system file or your taxes or what have you, click “Save”. This will invoke an ancient spell designed to end the world (and generate fonts) and will cause GFM to spit out a PNG file with all the printable ASCII characters in a line, also it will produce <filename>.png.xml which is an XML file that describes all the character dimensions. It has the following format:

<?xml version="1.0"?>
<fontdata>
	<glyph>
		<character> </character>
		<width>7</width>
		<height>25</height>
		<offset>0</offset>
	</glyph>
...
</fontdata>

Right now the output isn’t ideal for using directly as a texture atlas, but hopefully the PNG plus the XML file can be put to some good use. Once I get some more time I will add support for defining the PNG size and altering the XML output.

Anyway, GameFontMaker is free to use for all sorts of purposes, however if you do find it useful you could always have a look at my games or maybe follow me on The Twitters. Enjoy!

Did Not Finish

Cries of Hypocrisy Prevention Edit #2 (July 7, 2011): Due to IAP and free-to-play becoming a viable model for actually making a decent living on the App Store I have to say my previous rant just seems a bit too narrow-minded. While having a fixed price clearly still works, it is growing increasingly difficult as an independent developer to drive sales to a paid app. Free to play isn’t just a sales model, it’s an advertising model as well and it’s obviously working. Definitely food for thought, anyway.

Cries of Hypocrisy Prevention Edit (Nov 2nd, 2010): Just a note that due to the ever-evolving nature of the App Store and the whole Long Tail thing, I’m thinking there may be a place for $0.99 price points for older apps. Kinda like the PlayStation “Greatest Hits” and all that jazz.

They call it the “Race to the Bottom” on the App store, where everyone tends to price their app towards 99 cents because they feel that will compel people to buy their app because it’s so cheap. Well, I’m not so sure that is working anymore. Also with the new finish line apparently being set at $0, I think I’m going to pull out of this race.

Put a big “Did Not Finish” next to Celsius Game Studios in the Great Race to the Bottom as even if we reached the finish line, nobody is winning.

Partially inspired by this Gamasutra article “The 0.99 Problem” by Canabalt Co-creator Adam Saltsman, the huge amount of noise at the 99 cent level, and by the fact that if people want to play my games they’ll also more than likely pay a reasonable price for it, CGS games going forward will not be priced permanently at $0.99. To prevent future cries of hypocrisy I’ll state now that you may see a sale at $0.99, but at the very least that’s the new Free for a Day as far as I’m concerned.

On my part I promise I’ll continue to deliver games that are worth more than 99 cents to you, my wonderful audience.

To that end, the $0.99 “introductory sale” on Chromodyne for the iPhone and iPod Touch will be ending this weekend and as of Monday, April 12th, it will be priced at the still inexpensive $1.99.

Mark it in your calendar. Or not.

Mark it in your calendar. Or not.

Thank you for your continued support :)

Chromodyne… HD!

Well, the iPad is out and Chromodyne was successfully ported after a marathon session of epic proportions. Amusingly, Chromodyne HD was submitted after Chromodyne v1.1 and was approved before. Some may say I amuse easily, but I was amused.

The Port

Thanks to some experience writing game engines for other platforms before, about 90-95% of Chromodyne’s graphics code was already resolution independent. After updating my XCode to the 3.2 Gold Master, I clicked the handy little “Convert this project to iPad” menu option and was playing Chromodyne in the simulator in mere minutes! Though everything else was really horrible looking because none of the 2D assets were scaled properly and some of the menus looked like crap on the huge screen.

So really, most of my time was spent creating high-res 2D graphics (even though the cutscenes are pixel art, for the most part, those are seriously high-def pixels!) and fiddling with the perspective/view on the gamefield because it was way too freaking big keeping the same perspective as the iPhone version.

I don’t know about the final build yet, but the simulator in the GM release of the SDK didn’t have 3D acceleration! I can understand why some devs were reluctant to release their apps sight-unseen to the App Store.

The iPad Only Version

If anyone actually wonders why I went with a stand-alone iPad version of Chromodyne, the biggest motivator is that the app bundle for the HD version with its 1024×768 graphics assets is larger than the 20 MB OTA limit. Basically I still want people to be able to get the iPhone version over 3G.

The Price

I’m also selling Chromodyne HD for $1.99 instead of 99 cents. I figure the larger, higher resolution game experience warrants a slightly higher price point. We’ll see how that plays out in the days to come anyway… at least I can have a sale at some point without going directly to free. Definitely something I regret when I priced Chromodyne originally.

The Numbers

I’m half-tempted to post sales numbers for Chromodyne HD as time wears on. If anything to see how things are going. I’ve seen that the game lists for the iPad don’t have any top lists for subcategories yet, which is pretty bad news for small devs such as myself. Sales for Chromodyne have not been anything to write home about, but they’ve been steady at least.

Anyway it’s been a fairly exciting few days, and at least I can say I was here from the start. Whatever that actually means, only time will tell.