Andy Moore

 

Today is day 7! I was really hoping I would have the game finished today, just to say I made the game in a week – but after 7 hours of work I’m having to forfeit. I’m travelling out to see the Indie Game: The Movie screening in Winnipeg early tomorrow morning, so I’ve got to pack and get prepared tonight!

The done stuff

The game is pretty much feature-complete. I took the two divergent core gameplay mechancis and mixed them together into a single, fun unit. There’s all sorts of polish – screen shakes, particle effects, animated (tweened) characters, high scores, game center integration, etc… All the little details that turn a game from a “good mechanic” to a game that actually feels good.

I’ve been playing a lot of the game between builds, which I think is a really good sign. I’m really enjoying how the game feels, and it’s an actual challenge for me.

Sven also got me a set of new art (some of it placeholder, but at least it’s better placeholder than my own stuff!), and I have to say.. it makes the game look completely different. I avoided sharing any screenshots of the game, and was very possessive of who got to see beta copies… Once you see the beta-art, the game is forever stained in your mind, I think. It’s hard to get over that first impression. This new stuff – even half-done placeholders – is way better and I’ll start sharing screens soon!

The not-quite-done stuff

Sven is making some glorious art for the game, and it’s really coming together in a rapid fashion. Unfortunately for me, he has a day job and lives on the opposite side of the planet – so a lot of the assets are still placeholder, and little things like static animations (to make the game really pop) are probably a few days away at the earliest.

But I think one of the worst things, is the game name isn’t settled on anymore. “Word Fishing” was going to be the title, but it’s already a title in the AppStore – time for more brainstorming! (and of course: it’s hard for Sven to do art for the title screen when there’s no name yet).

The official changelog for the day

  • Local high score storage and ranking
  • End-of-game best words list with point values
  • Better GameCenter score handling and timing
  • New set of art – backdrops, character, tiles. Makes the game feel way different already!
  • Gameplay balance tweaks to score and combo cooldown rates
  • Screenshake! Aww yes. Every game feels better with screenshake!
  • Aesthetic changes to particle effects, their numbers, and their behaviours
  • Built a system to swap in random art assets for variety
  • Added the ability to give up mid-game and not lose your score
  • End-of-game screen does a bit more hand-holding
  • Lots of little bug fixes and performance optimizations
 

After Global GameJam, I took some time off to recover. Yesterday (Tuesday) I put in about 6 hours of work… My heart wasn’t really into it (I had a really rough sleep) so I started by kinda just poking at things.

The Evil that is Refactoring Code

I’m a big fan of “just get it done,” and doing it as fast (and as messy) as possible. It’s this skill that allows someone to finish a game for a 48 hour game jam… Or heck, even in the 5 Minute Game Challenge I hold at OrcaJam. I think these skills translate very well to managing deadlines (in more structured environments) or actually finishing your game for the indies out there.

Your biggest enemy in rapid game development is that desire to do things right the first time. Over engineering is the devil! There’s time for that later.

For day 6, though, I was really not feeling that creative. Scrolling through my mess of code wasn’t making things better, and I decided I’d spend some time cleaning up. I shuffled out some new classes and moved things around – ultimately, simplifying and marginally speeding things up. I largely look at it as a waste of time, but there is one small benefit I gained: The exercise of cleaning up the code for 3 hours managed to dust all the cobwebs out of my brain, and I was able to actually get some work done for the remaining 3 hours.

Implementing GameCenter Support

Getting your AS3/AIR application to access some iOS-device functions (such as GameCenter, iAds, and in-app-purchases) is really tough. Sarah pointed me towards Milkman Games and their suite of tools for AIR/AS3 developers, and I thought I’d give the GameCenter component a whirl before I implement highscore functionality.

Yeah, it costs money – about $70 for this piece – but I swear I couldn’t find a single thing that came close to free in months of casual web searching. Getting this kind of thing working takes some talent, time, and some core development skills.

I am pleased to say that with about 10 minutes of reading the documentation and typing out the code, I had a complete GameCenter tie-in working (with score submissions and table browsing)… and it worked on my first compile, with no tests at all. (I spent another 20 minutes setting up my Apple Developer account, but that’s because their forms kept timing out on me. *shakes fists*)

MilkManGames did an excellent job of documenting this package, and even covered some gotchas at the end of their documentation, with sample code too. All in all, it was well worth the money and the package was very well put together. It’s not 100% perfect, and integrating it with FlashDevelop has a few minor quibbles, but I hear FD is working on a fix for that (not MMG’s fault).

Some other stuff

I managed to get a nice tweened animation for the main character as you’re playing, which helps give the game a bit of flow. I also settled on a core mechanic and re-introduced certain elements, like combo-multipliers and timer cooldown systems. I also did some work on the end-game to make it a bit less weird (but still retaining that not-so-jarring experience).

All in all, a good day, considering how I felt at the start. :)

 

During the Global Game Jam, someone leaning over my shoulder remarked on how quickly I was able to dump audio into my game. I’ve gotten quite a few requests for my audio handling library, so I thought I’d make it publicly available here.

I’m no audio expert, and it’s very simple, straight-forward, and to the point. I’m sure it’ll work fine for basic needs, but if I made any huge mistakes or anything… Let me know! I’m still learning too.

RadialSound works seamlessly with any AS3 build, including AIR builds for iOS and Android, but I’m mostly saying that because mentioning “iOS” in my posts increases my web traffic by quite a bit. :3

The File

Instead of quoting all the source I’ll just link to the class I’m currently using, here. I named the file “RadialSound,” to give it a unique-but-short name, and also I’m a big grown up with my own company (Radial Games).

Personally, all of my utility and commonly-used references are in their own simple, flat, one-level folder. I then use FlashDevelop to import that folder via the Project > Properties > ClassPaths window. This allows me to share all of my common code easily across projects, without having to do all that “com.andymoore.crap.”

You don’t have to get all fancy, though; to use this file, just drop it into your project’s root source directory. That works too.

Setup

RadialSound uses a static instance to work across your entire application, but first you’ll need to initialize it. This can be done anywhere in your code, probably near the beginning/first boot of your application:


new RadialSound();

Then you just have to tell RadialSound what audio bits you want to have access to. It’ll accept URLs to audio files (good for streaming in long Mp3s), generic classes for embedded audio, or specific classes from a compiled source (such as SWC libraries of assets). We do this via the “storeAudio” interface, which wants both the class and a label to identify it later:


// Stream an Mp3 in from a web server

RadialSound.storeAudio("track1", "http://test.com/music.mp3");

 

// Standard audio file embedding:

[Embed(source = "fireGuns.wav")]

private var fireGuns:Class;

// And recording that in RadialSound:

RadialSound.storeAudio("fire", fireGuns);

I’ve always been conscious of SWF file size and of bandwidth consumed; you don’t want everyone that loads your SWF file to have to [at least start to] download six tracks of music before they can see the main menu.  What if the majority of your players never make it to track 5? Why waste all that bandwidth? And why annoy players with large .SWF file sizes, too?

You might as well host as much of your audio seperately as you can, and load it on-demand. If you have a particularly popular game, storing your music tracks on cloud-hosted servers (like Amazon S3) might be a good idea too.

To help work with these solutions, I’ve added some extra functionality to the storeAudio interface. By default, it will simply store the URL of your externally-hosted music, but not actually start to stream it into your application until it is actually requested for playback. This can result in a half-second (or worse?) delay in playback, though. You can override this behaviour and force-load assets immediately, if you wish – useful if the exact timing of the sound is important (at least for the first playback):


// Final bitflag determines streaming time

RadialSound.storeAudio("track1", "http://test.com/music.mp3", true);

 

There’s a bit more functionality in there, but I’ll leave it for you to discover.

PlayBack

Now that we’ve told RadialSound what exists, playing them back is simple:


RadialSound.playMusic("track1");

RadialSound.playSound("fire");

I’ve separated music from sounds for a couple of reasons: music will loop indefinitely by default, and will immediately change tracks when you feed it new input. Audio on the other hand will allow 10 (number tweakable) sounds to be playing at any given time – the oldest sound getting bumped for any new requests.

There is also behaviour in the class to mute/unmute all sound, and even a quick and simple way to pass it an art asset and have the class build the mute button for you. Explore! The file isn’t all that big, and is pretty self-evident. :)

All in all, it’s anything you could want from a simple flash audio player.

Again, download link RIGHT HERE to RadialSound.as. Let me know if you improve upon it!

 

Heya! Anyone going to GDC?

I’ve thrown a GDC party in the past and I thought I’d make this year a bit more organized.

MARK YOUR CALENDAR:  March 8th, 8:00PM PST

Location is still TBD at this point, depends on how many are showing up. Social board/card games and beer are the order of the day. Stay tuned for more details (or hit me up via email or twitter).

 

Shawn Blais taught me all I needed to know about mobile optimizations of my AS3 code. His blog only has a dozen or two articles, but they are chock-full of interesting information (and even sales figures!). The most useful stuff for me, at this point, is the graphics pipeline optimizations.

The thing that ties the following three steps together is one unifying theory: use bitmaps for everything. You can start with MovieClips and vector Sprites, and you can even stick with Flash’s DisplayList to keep things organized. But the actual image data? Bitmaps! Always bitmaps.

Step One: Use the GPU rendering mode

When designing a mobile application, you’ll have an “application.xml” (or similarly named) file that contains all sorts of nice settings. One of those is going to tell the mobile device whether to render using the CPU or the GPU. Most defaults (including the FlashDevelop template file) will point you to CPU, and that may be fine for flash’s standard vector art. Switching to bitmaps and the GPU setting will give us much better performance.

Open up application.xml and make sure this exists:


<initialWindow>

<renderMode>gpu</renderMode>

</initialWindow>

(source article is same as step 3)

Step Two: Lower the Stage Rendering Quality

AS3′s stage-rendering quality setting determines how vector art (probably your “Sprite” and “MovieClip” classes) is rendered. The thing is, even with a low setting, the stage still respects your bitmaps “smoothing” flag and draws it without any discernible difference. No need to spare the CPU cycles on something we aren’t using!


stage.quality = LOW;

If you have vector art you are loading and converting during runtime (see step 3), AS3 even lets you change the stage quality on the fly! Just use this:


stage.quality = HIGH;

convertMySprite(); // Or whatever your function is

stage.quality = LOW;

(source article)

Step Three: Use Bitmaps, and Cache them

This is probably the best performance-enhancing-drug my mobile apps have used so far, but it only gets the big performance gains if you use it in conjunction with Step 1 (GPU render mode).

The basic idea is to take all of your image data, and cache the bitmap data only once - dynamically – to a dictionary reference.  In GPU render mode, this stores the data as a texture in GPU memory on the mobile device. As long as all duplicate images are pulled from the original data, no new memory is used and creation of new graphics is lightning fast.

This works particularly well for common images used frequently – say, badguys, bullets, and common tiles. But I use it for everything!

Shawn’s original article laid out some source code and a longer explanation if you want to get into details and performance charts. His code does all of the conversions automatically for you, and the discucssion in the comments of his article improved upon it. I added a few tweaks myself, and it is now the only class I use for any type of image data. Imported .PNG file? Sprite or MovieClip in a .SWC? Class reference to an object you custom made? Doesn’t matter! All automated, all quick, all easy to use. Best of all: the code is really short, simple, and easy to read in about a minute. 

It’s a bit too long to paste here, so here’s a link to the class I use right now. Feel free to use it, just let me know if you improve on it :) Copy and paste it to the root of any project and you should be able to start using it right away.

(source article)

Bonus Step: Convert MovieClips on the fly

I haven’t tried this step out yet, but it’s an extension of the class I offered up in Step 3: automatically convert each frame from a MovieClip to cached bitmap data (and store that stuff in the GPU). If I had animations in my most recent games, I would be all over this too!

The Drawbacks

The biggest drawback I’ve found with the GPU-rendering mode is that you lose your runtime access to all filters and blendmodes. If you want to put a nice glow filter on a flame graphic, it’s easy to pre-bake that. But dynamically adding things – like adding a stroke to a font – are pretty hard to workaround (using system fonts, as opposed to spritesheet based font rendering). Hit me up if you have trouble with these, I’ve found some solutions (but not all).

A secondary detriment is that a complex DisplayList will slow down your app a bit more than usual. Try to avoid nesting that goes too deep. But you were doing that already, right? ;)

A compounded drawback here is that GPU-rendering isn’t available on your desktop (without Stage3D routines). That means when you do a test-run of your mobile app on your desktop, you will still see your filters and blendmodes, which can lead to some confusion, particularly if you’re porting a complex app written for desktop use.

The Gains?

The most complex scenes I’ve created with these methods run beautifully on my two-year-old Nexus One. I ran an hours-long performance test on my iPad – constantly drawing new moving objects to the screen (and never removing them). Though things (understandably) dropped to about 3FPS after quite a while – memory usage was nominal and the app never came close to crashing.

Most importantly, and this is a pretty big thing: this performance boost is BETTER than what you get from blitting on a mobile device. That means following those 3 basic steps will give you better performance than Flixel and FlashPunk’s default rendering engines.

In many cases, it’s possible for your mobile devices to outperform your desktop thanks to the direct GPU access. Hopefully this will change with Stage3D? Until then, blitting engines (like Flixel and FlashPunk) are probably your best bet for desktop and browser performance.

For all sorts of performance charts and figures, stress tests and numbers, check out Shawn’s posts (linked in the respective steps above). He sees up to a 4000% speed boost.

 

Wow! What a rough Global Game Jam. I didn’t get very much sleep – a lot of laying in bed, thinking about code. I missed out blogging about development on Saturday; I worked for around 8 hours then.

Sunday was the final day, and I only got in 2.5 hours of work before the 48 hour buzzer rang.

Llamas to Space: A success?

I’m not sure how to measure success here. Llamas to Space’s core mechanics – essentially, two games that affect each other – were very new to me. I was building for a platform that I am not entirely familiar with (the iPad). The game I made wasn’t super fun and I probably won’t release this iteration on the AppStore, but I do still feel like it is a success:

  • I was able to show off a complete, functioning build – with art assets, audio, a goal – I mean, the game is actually playable. That, to me, is a successful “jam game.”
  • The game has hints of fun too, and I like how the mechanics for the two games mix. It’s not “mega awesome fun” and definitely needs tweaking, but it’s good to play once or twice and think about sequels.
  • I tried out some new things, stepped outside of my comfort zone, and learned. New graphics display techniques (blog post on that soon!), multiple-touch-point support, and refinements in my development pipeline for mobile apps. Everything I make from now on will be better.
  • I successfully educated at least four people that it’s possible to transfer your AS3 coding skills to mobile devices. This makes me feel really good.
  • Someone said what I made was “some epic shit” :D
  • I met several new folks and even worked with a new partner (on the artistic side of things).

All of that – and I only put in 13.5 hours of work in the allotted 48 hour span. Something to be proud of! That’s a standard crunch-day in a AAA game factory.

Anyway, after this weekend I’ll be happy to lay it to rest for a while, and get back to the word game I was building last week!

One small sigh

Of course, the biggest compliments I was getting on the game were for little animated things; items falling off the screen in a bezier curve, a spaceship bouncing off the ground and arcing away, grenades being lobbed in nicely timed arcs over the battlefield.

Of course, none of this was thanks to me; it was courtesy of an awesome tweening library (called Tweener) that emulates a lot of Flash CS’s built-in transitions. I had used Tweener to do the airplane transitions in SteamBirds as well, so it’s an old friend of mine (and I LOVE looking at their animated examples page. Simplicity, and beauty!).

It’s always the flashy stuff that gets the credit. :(

Want to try it out?

The game isn’t in any sort of state to release. It requires a bit of explanation; there was no time to build tutorials or finish touching up the art. If you’re dying to see it, meet up with me in Winnipeg next week, GDC in March, or the local bi-monthly Victoria meetup group and I’ll be happy to show it off. :)

 

I’ve gotten a lot of EMails over the last few days demanding to know how I can make mobile games on a PC.  Some ask about Android, most ask about iOS, and everyone is all jaw-agape that AS3 code runs on these devices in some sort of native format (as opposed to in a browser instance).

Then they get all wobbly in the knees when they figure I’ve done it using completely free software.

There are plenty of (IMHO: Over-complicated) tutorials out there, and my knee-jerk reaction is to just … well, LMGTFY. After all, I didn’t divine this knowledge myself; it came with a  bunch of research, and thankfully following the path of other people.

I think I can simplify most of the tutorials though. Check it out.

Step 1: Boot up your PC.

These steps are for Windows operators only. The software listed here doesn’t play well in Apple environments, but then again, Apple users don’t have a lot of the iOS-related problems I do in the first place.

Step 2: Install FlashDevelop.

When I say “install FlashDevelop” I mean for you to install the latest version (4.0.1 RTM at the time of this writing). This is important: the next few steps don’t make any sense if you go even 1 version older. Also, don’t mess around with the default install folder, and don’t mess around with what sub-components are selected in the installer.

FlashDevelop is a development IDE, similar to Flash CS or FlashBuilder, except this one is free. After it installs, it also goes ahead and installs the Flex SDK (free flash compiler) and the Air SDK (the magic bit that makes it work on phones) automatically for you, and then links it all up internally – saving you like 4 dozen more steps.

Step 3: Start a new project in FlashDevelop.

This one’s easy. Open up FD, select “NEW PROJECT” from the “Projects”  menu, and select “AIR Mobile AS3 App” from the list of templates. This is the magical step that will auto-generate for you a bunch of instructions, batch files, certificate directories, and everything else you’ll need to get going.

You don’t need to even bother writing a quick “Hello World” application, as this template should compile immediately for you. Just hit up “Project > Project Properties” and give the app a bright pink background, then hit F5 and watch it run on your PC.

Yup, at this point, only at Step 3, you’ve already got your mobile-device-simulator installed (a cheap AIR projection version anyway), and you can start developing your application.

Step 4: Follow the included instructions.

The best part about FlashDevelop’s mobile project template is that it includes two text files in your project directory:

  • AIR_Android_readme.txt
  • AIR_IOS_readme.txt

They’re both around 6-steps long, and in painstaking detail (with web links, references, and cited blogs) tell you exactly how to get your app working on your mobile device.

After following those instructions, you’re DONE! That’s it! You are now making games that compile and run on the precious iPads of the world.

Now, those extra text-file steps can be easy (if you’ve setup certificates and things before, or have your phone drivers installed), or they can be new and intimidating. So I’ll outline some of those steps here. I’ll start with Android to give you a baseline of what the experience could be like:

Step 5: Install your Android USB Drivers.

There’s a link included right in the readme file to a website that just asks “What kind of phone do you have?” and points you to the appropriate download location. Easy as pie.

Don’t forget to turn on “Debug mode” on your android phone at this point (Settings > Applications > Development menu).

Obviously you only need to do this once.

Step 6: Generate an Android Certificate.

FlashDevelop automatically made a “generateCertificate.bat” file in your project folder. Run it. Yes, it’s that easy. And yes, this only has to be done once as well.

Step 7: Run the game on your Android Device.

Plug your Android phone into your (rear) USB ports, then edit “run.bat” in your project folder. There’ll be a little commented-out section that says:

goto desktop
::goto android
::goto ios

Just comment out the desktop line, un-comment the android line, hit F5, and BAM.

You’ll see your game fire up on your Android device.

I am serious, it is REALLY that easy.

Step 8-ish? iOS Steps?

iOS setup is a teensy bit more work; it requires the installation of Open-SSL (or an equivalent if you don’t already have one installed) for certificate generation. And it requires you to pay $99 to Apple if you haven’t already, and requires you use their development portal to generate keyfiles and things called “mobile provisions.”

You see, Apple is terrified you will take a compiled application, and put the .IPA file up for sale on your own website – circumventing their internal app-store. To get around this, they require that all your beta/in-progress software specifically list each device you are intending on testing it on. The only way around this is to sell the app through the app-store.

A “provisioning certificate” is an encrypted file that contains all the unique device IDs, and your unique game ID, all in one place. When you compile you’ll need this certificate.

But, you only have to do all that setup once, and not necessarily per-project. And again, those steps are clearly detailed in the included readme file. Take it step-by-step and you won’t mess anything up.

The final step here could be you installing iTunes, and trying to install your app there and transferring it to your iDevice. I highly recommend signing up for TestFlight instead; it’s totally free, and it removes a dozen headaches and makes this whole step way easier, and allows you to easily distribute the builds to your partners/beta testers. I don’t even have iTunes installed on my development laptop.

Selling your Game

For Android, there’s not really any extra steps here; just upload your finished product to the marketplace. Done!

For iOS, there is one unfortunate final step. Apple decided to remove their webpage-based upload-to-app-store feature several months ago; you do need (at this time) access to a Mac simply to upload your .IPA file to the developer portal. But that’s all it is: uploading a file. If you have any friends that own a Mac, you can just beg/plead them to do it for you; or maybe by the time you are reading this, us PC developers will have finished writing another work-around.

Frustrating, I know, and I hope this won’t be a problem for much longer.

To sum up,

It takes 3 very easy steps to get started developing mobile apps.

It takes 3 additional (very easy) steps to get starting pushing it to Android devices, or 5 additional (annoying) steps to get it pushing out to iOS devices.

And one final step to sell your application in the marketplace.

 

I’m taking on a side-project from my side-project this weekend in celebration of the Global Game Jam.  They’re a bit related, though!

The Diversifiers of Inspiration

GGJ does its best to help spice things up a bit by posting not only a theme, but also “diversifiers.” Diversifiers can be thought of as challenges or achievements to strive for you in your game development, and are usually a diversion from “standard” gameplay mechanics.  I particularly like them as they spark my imagination.

The list of diversifiers this year was full of inspiring angles on gameplay (even if they are a bit technically heavy this time around). The ones that jumped out at me were numbers 3 and 4:

3. Asymmetry
(Every player is different)
The game requires more than one player, but each player has entirely different goals and rules.

4. Collaborative Casual/Hardcore
(Two players: one casual, one hardcore)
Collaborative play for two, but one player has more to do than the other (or the difficulty level is different between them).

I’ve been on a recent co-op kick;  the barren wasteland of co-operative video games drove me to board gaming, where I’ve been having a lot of fun. I’m often pining for titles I can play at my computer – and with my girlfriend, who has significantly different tastes in games.

This particular mixture of asymmetry, differing skill levels, and my own personal desire for co-op play, seemed to open up several doors in my imagination. Maybe I could fill this void! Llamas to Space was born!

Setting Up

I’ve been developing for mobile devices for the last week, but a lot of my time spent has been learning the ropes. I feel like I know enough now to make something much faster than before, if I build on what I learned. I decided right from the start that Llamas to Space would be:

  • iPad only
  • Co-operative, 2 player
  • Simultaneous gameplay
  • With two very different games for each player
  • … but the two games have intermixed mechanics; one players performance can effect the other player.

I hope that mix will make engaging gameplay, encourage discussion between players, and be a fun game that can be shared across diverse gameplay preferences.

I also settled on a bit of a backstory and plot to help guide the style and development. I’ll save that for later. :)

I slapped together a few placeholder pieces of art, and set out to do what I do with all my jam games: learn something new.

Work so far

The first thing I needed to tackle was handling simultaneous touch inputs for two different players. This is something I’ve never done before, wasn’t sure was possible using AS3/AIR, and I definitely had no way of emulating it on my PC dev environment.

After some scouring of the internet I figured out how the touch event listeners worked, I got my first tech-test app built surprisingly fast!  Took me about 30 minutes to have the basic arena setup with two player inputs being tracked seperately.

I actually spent much more time figuring out how to work around the PC emulation problem. I can’t develop very quickly if I have to push a build to my iPad every time I compile. I didn’t find a good solution so I just hacked another layer of mouse event listeners on top of everything else. It’s messy, but that’s what gamejams are for: messy code!

All in all, I only put in 3 hours of work today (we had a late start and some technical issues at the GGJ venue). But I manged to pull off this:

Glorious programmer-art! The brown line is the divider that cuts through the middle of the iPad screen; one player plays on the bottom (cropped in this photo), the other player plays on the top.

What I’m demonstrating here is a basic “castle defence” style of gameplay; badguys stream in, and you have to repel them by hitting them with lobbed mortars (missle-command style, I suppose). I’ve got a lot of ideas for making this a difficult, unique action-gameplay experience. For now, I’m happy to say that player 1 actually has something to do, with actual win/lose conditions!

I’m also excited to have implemented what is, essentially, mini-blitting for the first time. The backdrop gets “stamped” with death and crater images; they aren’t unique gameplay objects, and they don’t fade with time. I’m guessing the battlefield will be pretty piled up at the end!

I haven’t worked on player 2′s game yet so I’ll save that for another post. :)

Hope everyone else is having fun at GGJ this weekend!

 

(Check out the first 4 days here)

It’s Thursday! Party time!

In these devlogs I’m trying to avoid describing the core mechanic of the game; I’m not absolutely certain it’s final and I’m still experimenting. So if things seem a bit vague: don’t worry! It’s intentional.

I didn’t get a whole lot done today. Probably only put in about 2 hours of work, but that’s allright. The big changes for today? A brand new game mode, and some tweaks to the scoring and gameplay start/end. Most exciting though: solidified an artistic relationship!

Artistic design in games

I want to stress here that I put a huge amount of value in artistic direction, and significantly less value in actual artistic execution. Not to be unfair to the more artistically minded, but to be frank: a simple artist is a dime-a-dozen. I get emails from talented folk on a monthly basis; all they need to work is a specific direction, and plenty of hand holding.

For example, you might ask for an image of a penguin. The artists in question might say “sure! but… How big should the beak be? Should the eyes be big or small? What palette do you want to use?”… The level of hand-holding here is very aggravating. It’s like the easiest way to communicate is to just mock-up all the art assets myself and just have them draw over it, but better.

And that’s exactly what I don’t want. Sure, I have preferences and intended artistic themes for my games. But I also have enough experience to know I don’t know what’s best, and I should just shut the hell up and leave it to the pros. This is one of the reasons that I fawn over amazing designers like Greg Wohlwend and Dan Cook so much:  They can completely design – from the ground up – a projects entire image, and execute on it  with amazing talent and precision. I wish I knew appropriate artistic lingo to drool over them professionally.

Another name to add to that list is Sven Bergström - an indie developer with a lot of passion from South Africa. I’d say he’s a newcomer, a rising star on the horizon – but really he’s just new to my personal network; he’s been making games for longer than I have, and knows a lot more about – oh, let’s say mobile development, than I do. I wish I knew he existed sooner! He’s the one that helped revamp the visual design on my personal blog here a few months ago, and he’s super talented in all that he does. I’m excited to have him on board!

Sven just started working on this mysteriously-titled “Word Game” yesterday, and I asked if he could put together an image to share with you.

Check that out! Character design for the game. This is the first stage of evolution for our lead character! I love reading about this kind of stuff. I learned things today about character design!

Two types of player

When I take a look at most word games, there seems to be two camps.

On one side is the person that likes to find long words. These are the people that like Boggle, or a lazy Sunday spent staring at a Scrabble board. In the mobile space, you pretty much just look at the games that have no time limits or external pressures. The goal is to be your best. I like to put SpellTower in this category.

On the other side is the person that likes action, and would be just as happy dazzling you with an array of 3-letter-words. These types of players tend to play the faster-paced, more hectic games. Games like PuzzleJuice, or tournament Speed Scrabble. Sure, there’s bonuses in it if you have long words, but the score to be gained by just going fast is the prime target here.

I like both styles of play, and I’ve been trying to work them into a single game mode. This has been failing! Balancing long words versus big “combo multipliers” is very tricky indeed. I fought my urges to unite these two camps and instead built a second mode into the game.

Now, without changing any mechanics (just the scoring algorithm), I have two different game modes: one that rewards long words, and one that rewards lots of small words in rapid succession.

The jarring end

One thing that is a common occurance in word games is that brick-wall ending. Maybe you have a word half-spelled, maybe you are massaging your temples as your brain cascades through all the potential letter combinations. Then BAM! The game suddenly ends, your tiles disappear, and you are left holding nothing.

I think this ending is hugely anti-climatic and I really dislike it. I reworked the game to instead allow you one more super-move after the timer expires. Sure, you can sit there for as long as you want and hunt down the best possible word – but in Speed mode, your combo multiplier soon runs out and you’ll not gain much for it. In LongWord mode, it’s the final cherry on top of your sundae.

I’m playtesting this new feature now; I hope some variant of it will stay make it into the final game.

On a smaller, but similar note: the big mean ol’ nasty countdown clock doesn’t start ticking until you’ve actually made your first word. Terrain in this game changes a lot in just a few seconds, so being able to plan out your first move isn’t a huge advantage.

Other odds & ends

I got TestFlight setup so I can start an actual iOS closed-beta program for the game, and get some feedback before launch. I also made my first iPhone build (so far it’s been iPad only) and I was very pleased to see that the game was simulating nicely without any modifications at all. I’ll have to actually see it on-device before I declare it a success, though.

There’s a few mobile-specific features in the game now too; things I consider housekeeping: rotation locks, proper (mockup) icons and loading images, pivot behaviour hooks, specific code for android “back” button mis-presses, and customary stuff like remembering to pause the countdown timer if you swap out of the game (and reducing the game to 1FPS in the background, so it doesn’t suck up your battery). Whenever folks talk about mobile development having a lot more “gotchas,” this kind of work makes it seem very true. However, I did all of these tweaks in about 30 minutes of code. The only trouble they’ll give anyone is if they simply forget about them before launch!

I think the most notable thing about today is that I spent way more time playtesting than I did coding. I think that’s a very good sign.

 

Hey everyone! I haven’t spoken a lot about game dev recently, but I started doing a side project and thought it would be good devlog material.

The Inspiration

Last Saturday (January 21st) I topped off my evening by rocking all the high score tables in the new word game, PuzzleJuice. I really love that game, and as I drifted off to sleep that night I started thinking about how easy it would be to make a word game of my own.

(EDIT: My girlfriend informs me that I had the idea a week before PuzzleJuice, but my brain has re-written history and I don’t believe her.)

I mean, how hard can it be? Get a little dictionary of words, spell some things out… Should be no problem, right? I decided to find out. Laying there in bed, I wasn’t heart-set on releasing a commercial product; I just wanted to see if I could make something up quick.

Day One: Sunday

I spent my morning coming up with a theme. I wanted something casual and cute; my girlfriend suggested penguins as a central theme, so penguins it was! I thought up a quick and easy central mechanic (a variation on a Boggle-like interface) and started prototyping what was initally dubbed “Word Fishing.”

I spent a lot of time toying around with different UI design elements, and fleshing out the codebase for what was to come (game-jam style, not proper-engineering style). I only put in 3 or 4 hours this day, but it was good start. Most of all, I got a bunch of research done on what lay ahead of me.

Day Two: Monday

On Monday I setup my first dictionary-lookup chunk of code – an older, out-of-date word database with an OK search algorithm. The best part was that it was mostly cut-n-paste from some fellow devs – it pays to network!

I then moved on to actually implementing the gameplay. I got some temporary art in place, implemented a simple mouse click-to-select interface, and was able to actually play what I had envisioned less than 24 hours before. Hooray! Prototype #1: Complete.

As I was playing the game into the evening, I was surprised at how fun it was. I mean, I love Boggle to start with – but this new twist on mechanics seemed to be playing out really well. There was no timer implemented yet, so it felt somewhat freeform… That would go on the to-do list.

It was around this point I decided to make this a proper commercial application!

Knowing a word game would work much better as a mobile application, I started eyeballing my 2-year-old Nexus One (Android phone). I’ve never made a mobile application before… could I do it?

Monday night was spent downloading Android development interfaces, debugging tools, and drivers of various sorts – the whole time being hand-held by the wonderful FlashDevelop documentation. That’s right, I just pressed “New Project > Mobile App” and my folders came pre-stocked with all the batch files and automated certificate generation routines I could ever want.

I got the app working fine in the Android simulator on my desktop, but I couldn’t manage to get it over to my phone… Very frustrating. But still, I put in about 6 hours of work this day, and I’m starting to get really stoked.

Day Three: Tuesday

The first thing I did on Tuesday morning was fix my deliver-to-phone problems. Turns out it was really stupidly simple: the USB port at the front of my computer wouldn’t maintain a debug connection to my drivers. Everything else worked fine, but moving it to the back panel solved all my problems. Sometimes computers are really really frustrating!!

I was avoiding implementing a touch-friendly draw-to-spell interface (it just felt like grunt work!) but I managed to pull it off with just an hour of work. I patched all the memory leaks, converted all my graphics to cached bitmaps, switched my phone to GPU-rendering, and generally worked on mobile optimizations. For my first stab at doing all of this, it was much, much easier than I expected.

In the evening I implemented some visual pizazz – particle effects, simulated gravity for falling blocks (instead of prototype-instant-teleportation), and other things that just give the game a bit more “crunch.” It was around this time I started looking for a proper artist to dress the game up for me.

I topped the night off by updating the dictionary words to the official, tournament Scrabble word list (the tournament version includes naughty words, unlike the home version).

In total, the day was probably 7 or 8 hours of work, and the Android app was running really nicely on my older Nexus One. My thinking was, if I can get the game performing really well on that old equipment – I wouldn’t have to worry about further optimizing for newer equipment.

Day Four: Wednesday

After not getting enough sleep, I spent Wednesday morning trying to cut down on the CPU overhead. One of my best optimizations was rewriting the dictionary search routine – now implementing a Binary Search Algorithm. I also implemented “live spellcheck” (it detects proper words while you are spelling, instead of waiting to search after you’re done), which changed the game a surprising amount.

More mobile optimizations in the afternoon – in this case, the simple act of deliberately manipulating the frame rate to very low numbers when there’s no action. Other than saving CPU time, this also has the benefit of not bleeding your mobile battery dry. No reason to render the motionless Main Menu at 60 FPS!

In the evening, I finally bit the bullet: I signed up for the $99 Apple Developer account, installed iTunes, and created some certificates. With only 2 hours of work, I had my first-ever iPad app running on my device!

Of course, transitioning my app from the smaller-screened Nexus One to the larger-screened iPad2 unveiled a bunch of scaling errors I made in my code. I spent the bulk of the evening fixing up all of my dynamic-screen-size handling classes and trying to make things pretty.

And that brings us up to date. It’s Wednesday night as I write this! I’ve put in about 6 hours of work today and the game could be launched in the app-store right now, if I wanted to shoot myself in the foot marketing-wise.

Coming Up

Now that I’ve got the last few days out of the way, I’ll try to update my blog once-per-day with more details on what’s going on.

I think it’s really exciting that I was able to take my AS3 coding skills and a free IDE (FlashDevelop) – and use them to generate a market-worthy Android and iOS application in just 4 days of part-time work.

© 2012 Andy Moore Suffusion theme by Sayontan Sinha