Skip to main content


Showing posts from 2013

And now I need icons....

Well, the time has now come that I've been dreading. I need to figure out how to come up with some icons to represent each of Robo-Ninja's powerup abilities. I can probably find some free art resources for the general template of these icons, but I'll still need to do a bunch of graphics work to make the icons themselves. And come up with a consistent look between them.

This is going to get ugly.

So if anyone out there feels inspired to help me make some icons, let me know.

And sometimes things are easy.

Occasionally it turns out that my code design is actually decent, which means that on those rare occasions, adding things is easy.

Halfway through my cave level, I decided it needed boulders dropping from a hole in the ceiling that you had to dodge (by timing jumps when they go by). I didn't have any code in place yet for moving obstacles, although I had vague ideas about eventually including them, so luckily I had at least designed for the possibility.

Turned out, it was REALLY easy. It took about 15 minutes to find, download, and edit a Creative-Commons licensed boulder sprite. About 20 minutes to write the code for the boulder itself. Then about 15 minutes to write the code for initializing the boulders from the tile-editor level definition. BAM, the whole feature was working in less than an hour.

That felt good, after wasting so long reworking my collision code the other night.

Next I'll work on the 2nd cave room, which includes the first major ability powerup item. So I&#…

And this is why I do level design early.

So I started on a harder cave level, with some pretty hard and messy jumps and collisions.

And realized my collision code wasn't good enough. 
I had originally gone for an overly simple collision model, which I hoped would be good enough: check for collisions at each corner of Robo-Ninja, and deal with whichever is the "most important" collision.  Well, as Robo-Ninja is taller than a single 16x16 "block", I was running into instances where the head would go above the block without colliding, then the feet would collide with the block from beneath, and all sorts of brokenness would ensue.  This also got me into trouble when I put ramps too close to other collisions, as it would get confused about what is colliding where.
So tonight I overhauled and reworked the collision system. Which, once again, leads me to my previous statement: Ramps are weird. It only took me about 30 minutes to get the basic collisions working with my new model (checking multiple points ar…

Working on some early level design

So I decided to put the actual programming on pause at this point, and do some early level-design. Mainly because I don't actually enjoy the details of level design very much. I really enjoy drawing a big rough map of the world, and planning out the overall gameplay. But the details of each little level? It's tedious.

Which is weird because when I was a kid that dreamed of making video games, I loved drawing out each level in minute detail on paper. Now that just bores me. Maybe because when you are 8 years old and drawing levels, you don't have to pay attention to making them the appropriate difficulty level, and interesting to look at, at the same time.

Anyway, so I've started on the first couple of "real" levels/rooms in the game. The first is pretty simple, without many things that can kill you. The second is full of death. And I'm realizing it's going to take a lot of work to make the challenge level right for this game. I'm not yet good enou…

Silly Mistakes

So I'm realizing that with this project, I don't have as interesting things to talk about as I did with Anguna. Anything that takes more than 30 minutes to implement in Robo-Ninja is usually because I made a silly mistake, not because I have to do cool stuff to make it work.

Tonight I was working on handling the back button on the Android build.  I wanted it to pop up a simple exit-confirmation type of menu.  LibGDX provides a nice handler for catching the back button (see the docs and this post on Stack Overflow), and it was pretty easy to pop up the menu. Quitting the game or canceling the menu were both no problem, but I kept having trouble whenever I'd use the "Main Menu" button.

I could get it to take me back to the Main Menu without issue, but the next time I'd hit the back button, the menu wouldn't appear. I spent a good 30 minutes stepping through with the debugger before I figured out my mistake:

When I started the game over, I instantiated a new…


Ok, I'm trying again to talk about LibGDX.

When I got it in my head that I was going to make a new game, I wanted to make my life easy, and actually have hope of getting it done in some reasonable amount of time, which meant using an existing game framework/library.

On Anguna, it was a lot of fun building everything from scratch, but I spent A LOT of time just doing the basics: animating sprites, building characters out of multiple sprites, getting backgrounds to scroll properly, etc.  On an device like the GBA, learning the weird tricks to do all that was a lot of fun. This time, on a modern smartphone platform, I just wanted to spend my time focusing on the game.

So I started evaluating different tools.  Unity and Marmalade (which used to be called Airplay, which I originally started using for the iPhone port of Anguna) are the two that seem to have the most use, but are also a bit expensive these days for a hobby project that might never get finished.

So then I stumbled upon Li…

Blogger app for Android (don't use it!)

Hmm, so I started typing a long post about LibGDX, using the Blogger android app. That was a mistake. While typing, I toggled over to a web browser to check something. When I came back, it had deleted my entire post. Turns out that wasn't a one-time thing, that's just how it works. I guess whoever at Google made the thing didn't read their own document about  the Android Lifecycle. Ah well.  Maybe I'll try again tomorrow.

Ramps are weird

So I've got most of the real core of Robo-Ninja complete. Not that that means I'm anywhere near complete. The basic core (map loading, characters moving and animating, collisions, etc) is the easy (and fun) part. The details are what takes all the time.

Anyway, after getting the basics of collisions working, I suddenly decided (for reasons I haven't really figured out) that I needed to add ramps. I wish I would have been smart enough to think of that earlier, as my design for collisions didn't really take ramps into account. And ramps are weird.

Overall, wall collisions are pretty easy, although slightly harder in a game like Robo-Ninja than they were in Anguna. In Anguna, you just check for collisions, and revert the character's position if he collided with a wall.  There were a few other gotchas, (type of wall, since you can sometimes walk over water. Or checking vertical collisions separate from horizontal so you could "slide" diagonally across a wall)…

An unexpected turn of events

So one thing I didn't count on is my 5-year old son become interested in the process of making this game.

The other day while he was bored, I was letting him play with my phone, and he discovered a new game in the games folder, Robo-Ninja. And even though there were only 2 short levels, and they were pretty hard, he loved it.

This morning he wanted to play it again, and asked why it was so short (he didn't realize it was a game I was in the process of making). So I explained that I was making it, and could make some more levels for him. (and some easier ones). Then I had the realization that the level editor was easy enough that HE could make levels. That REALLY got him excited.

So we spent a good while this morning letting him design some levels. They're a But he loved it. And I loved helping him do it.

But now I have a dilemma. He's going to want to play his version on my phone. But I'm going to want my version on there to show off, mess with, …

Starting a new game

Well, I'm finally starting a new game.

Actually, I've been working on it off and on for a couple months now, but I've been hesitant to talk about it, as I'm not sure I'm mentally committed to finishing it.  I'm still not sure I'm ever going to finish it, but I have trouble not talking about things. So despite the fact that I hate yapping about things that I'm not sure I'll ever finish, here goes.

Like Anguna, I'm attempting to make a game that I want to play. (See my discussion of where I failed to achieve that mark for Anguna)

So I'm working on a cheesy little game called "Robo-Ninja." The main character, is in fact, a robot ninja.

So what I really want to make, a large metroidvania-style adventure game, generally requires better input mechanisms than a phone provides. There's a reason there's 8 million tap-to-jump games (Like The Impossible Game, which did it the best, and Wind Up Knight, which got tons of attention but w…

Pebble New SDK

Well, go figure.

A week after I finish writing my medsAlarm, Pebble releases their new version of their SDK. Which isn't backwards compatible. And has new better ways of doing everything that I'm doing. I guess I need to rework a number of the bits of functionality in the app now.

Pebble MedsAlarm

So I previously mentioned the Pebble Alarm Clock App that I've been working on. I just came here to say that I think it's finally finished. If anyone is interested in helping me test it, let me know, as it's probably full of all sorts of bugs.

And just to clarify, MedsAlarm (my terrible name for it), is an alarm clock app for pebble that lets you manage up to 10 "complex" alarms. The alarms are all configured using a simple web interface on the server component. Each has a name, and can be set to go off either at a certain time each day, or repeat every X amount of time throughout the day, and each alarm can have a different "snooze time" setting. The watch syncs (via httPebble) with the server app when it is available (But attempts to function independently when it isn't, so it can be used in situations where cell phones aren't allowed). In the evening you can optionally press a button to put the watch "to sleep" so that repeating ala…


So a lot of what I do at work ends up being targetted for the web. Despite me thinking web programming is a blight on humanity. Realistically, I've managed to abstract away the web-ness of most of it behind some decent libraries, so I can pretend it's not the web. But occasionally I have to actually write some HTML and CSS.  And let me tell you, my opinion is that CSS is AWFUL.

Here's why:

1. It's unintuitive and inconsistent.

I'm not talking about the general concept, or the block model. Sure, you have to learn those. But they aren't hard. I'm talking about stupid stuff like vertical-align, which means two completely different things depending on the context. In a table cell, it means one thing. In an inline element, it means something completely different. 

Or absolute positioning. One would think positioning of "absolute" instead of "relative" means positioning the element absolutely. Instead, it's just a different type of relative…

Debugging on Pebble

So I'm currently working on a fancy alarm clock app for Pebble for a friend of mine.  It allows up to 10 independent alarms, with different schedules (and different types of schedules, ie "every day at 9am" or "every 2 hours"), and the ability to sync (using HttPebble) with a web app so that the alarms can be managed from a web page, and to synchronize their status (since there's no persistence on the pebble itself).

Let me just say, this has been harder than I expected.

The first draft, to get the alarm functionality working, was actually pretty straightforward. I wrote the code, pushed it to the watch, and, with a couple obvious tweaks, it just worked. When does that ever happen?

The next step was to use the HttPebble protocol to sync stuff (yes,  my friend uses iOS) This has been the painful part.  Let me count the ways:

1. I have to do a fair bit of string manipulation in passing data back and forth. Anyone who's done much with C knows how primitive…

Pebble review revisited

Well, it's been a few months since my rather negative review of my Pebble. So now that they've released a couple versions of the SDK, it's time to restate my opinions.

First, please note that I'll be specifically referring to using the Pebble with an Android phone. Due to the developer restrictions in the iOS world, my coworkers and I haven't found iOS apps that interface with the watch to make it do cool things. There's a primitive http tunnel app (HttPebble) that lets watch apps communicate with specially coded websites. But that's all I've seen. (if anyone knows of any, please let me know!) Until things change, I wouldn't bother with a Pebble if you use iOS -- you can't do much more than you could when I wrote my last review. Sure, there are a few watchapps that don't require communication, but those are of limited functionality. And the HttPebble tunnel is limited enough to keep it from being a general solution for integrating with many…


Ok, I have to rave about my favorite thing for Android -- Tasker. If you own an Android phone, and you enjoy the process of fiddling about to make it more and more useful, then Tasker is the best thing ever.  It's an app that lets you basically attach various actions (changing settings, playing notifications, launching apps, etc) to various triggers (locations, times of days, phone sensors, phone calls/texts -- just about anything you can think of) in all sorts of interesting and complicated ways.  It's relatively expensive for an Android app (around $6), but worth every penny.

The only problem is the user interface -- it has a goofy unintuitive UI that makes it pretty cumbersome setting up complex profiles. I'd pay another $6 for a decent editor on my actual computer. (It's tempting to write one, as tasker saves and loads its profile scripts as xml).

That all being said, here's the things that I currently use it for:

When headphones (without a microphone) are inser…

My Pebble Review

Since everyone and their uncle is talking about their brand new Pebble, I guess I can chime in with my review of the current state of the Pebble. I've had the Pebble for a few days now, so I've had some time to play with it and see what it has to offer.

First, the physical appearance and feel (the unimportant stuff). It's a little bigger than I'd really like, but still fits comfortably on my wrist. The included watch band feels a bit rubbery and cheap, although it's a standard band and easily replaceable, so I'm not too concerned about that (as a side: the Pebble makers seem awfully proud on their twitter stream about the fact that the band is customizable. Maybe that's because nothing else on the watch is customizable yet?) It's held a charge well so far (I charged it 4 days ago), so it will easily last a long weekend, which is my cutoff for real use (I don't want to haul along a watch charger for a weekend trip!) So overall, the physical package is…