I want to talk about the development of my latest game, to talk about the time you need to put into it, to talk about its failure and why I shouldn’t be surprised that it did.
I’ll just start off by saying that I realize that I should not have expected more, and I didn’t really, but there was always the hope in the back of my mind that the game would be an immediate success, despite being my first completed game.
How it started
I started working on Beat up the face! in November 2014. I had initially set out to make a game in under a month, because the last game I had made took two years, and although I’ve had some good Let’s Plays done, there was still a lot of work to be done. I wanted something I could put out quickly and maybe even get some recognition for, asBioch was fun, but it was too hard to get into and doesn’t get more niche than roguelikes.
Inspired by the old flash games where you punch a president’s face for a while as it gets bloodier and bloodier, I started reading up on different Android frameworks I could use. Now, I’ve never done anything in Java, so I just started by getting an Eclipse Android project set up, and I got as far as setting up Hello World on the emulator before deciding that I’m okay with not knowing Java, and found Cocos2d-x, this fantastic framework that lets you write C++ and then uses the JNI to transpile into bytecode and then builds you an apk. Even cooler, I was able to get it building for iOS too, with very little effort.
The framework
The problem with Cocos2dx though, is that it’s not developed by native English speaking devs, and since it was primarily based on it’s sister framework, the Objective-C cocos2d platform, much of the information online is written in Objective-C instead. I’ve actually contributed a rewrite or two of their programmer’s manual, and helped port acocos2dx plugin in order to make it easier for other devs to get into it. Not to harp on it too much, but Cocos2dx really is fantastic and takes care of so much stuff for you that it’s almost too easy to get a simple app going.
Thanks to Cocos2dx’s open source codebase, I was able to step through most of the issues I had with it, most notably this strange issue with Visual Studio where if I checked out a different git commit for the sake of debugging, going back to the latest commit, the build would run this distorted version of itself. Eventually I realized I just needed to relink the cocos2dx library and VS would figure itself out. Another issue I had was that cocos2dx’s project settings copied your assets over from the common folder to the windows/android/ios platform folders as you build to project which is awesome if you change the assets as you update your codebase too, but if you ever need to change your assets without changing the code, no build action takes place, and the xcopy
command never gets run. Other than making a system call from the C++ code to copy the resources over each time I build, I copied the post build event handling into the post link event, and bound the Link Project keys to Ctrl Shift G so that I’d only need to hit Ctrl Shift G after I’d updated my sprites or shaders, instead of recompiling my game. Made a world of difference.
The way it feels
So like I said, I wanted to make a game that your every day person could play and enjoy. This meant that it had to be simple. I wanted to make a game that you’d play in 10 minute bursts. That meant it’d have to be a small and tight game. Finally, it’d need to be fun despite the simplicity. That meant it’d have to feel really good to play. So what steps did I take to try to make a fun, simple game with great gamefeel?
I watched Juice it or lose it and The Art of Screenshake , which are great talks about the little things you can add to your game that really sell the whole experience, like screenshake, frame freezes on contact, and immediate reactions to any actions the players take. They touch on how all these little things add up to something greater, but how I look at it is the player wants to experience new, interesting things, and to play a game, not just move numbers around on a spreadsheet (EVE Online excluded). You need to make mask that you’re really only manipulating a set of variables. Each little bit of polish moves you a little bit away from the spreadsheet towards this experience that the players want to go to. If you don’t add an animation here, or a particle effect there, you’re not keeping the illusion up, or worse you’re breaking the flow. This goes both ways though, too much of animation can slow things down and the player spends more time watching something happen, than making something happen. I know how much I prefer playing over watching in games, so I tried to keep those lapses in action to a minimum.
Here’s an example of how game feel in my game works. Take a look at this video of it early in development here without screenshake, sound effect and immediate facial reactions Just look at how boring the first game looks. You don’t want to spend any time playing it, do you? It looks like you’d be wasting your time. But here it is with all those little things. It looks way more interesting and punches look like they actually do something.
UI and polish
As they say, the first 90% of the game was getting the game working, getting the menus and UI to work properly, but the last 90% was adding polish to everything. I just want to talk for a second about how much effort it takes to make a simple menu, even when the framework you’re using adds buttons with callbacks for you anyway. As a person who spends enough time using HTML, you forget how much stuff there is to get wrong about UIs. But dude, you’re saying, you just need to hook it up so if you click on the button something happens! I say you’re right, but making sure the button is in the right spot, that it’s bound to the right thing, that it says the right thing, that when the context changes the button changes, or even does what it does when you tell it to are all things you need to worry about. Not to mention scaling across different resolutions and text sizes.
Beyond that, the in game UI changed a lot too. I first made sure everything looked right, in the proper spot and did the right thing, but then I went and gave the things the polish, so the weapons do this little launching effect, the fist buffs change the combo cooldown bars, the progress bars have that trailing white bar, different actions have different sound effects, so punching the wall sounds different than punching the face sounds different than punching the air. Making it so critical hits feel differently than just the regular hits. Having the face’s attack change depending on whether you’re blocking or not. The game would not feel as fun as it does unless those things were all in, but the kicker is that if you hadn’t told the player that they existed, they never would have noticed. The game as it is now is still rough around edges, the menus are pretty boring to look at, and there’s not loading screen when the game starts up, so there’s just a blank screen for a second or two, but it’s come a long way from where it started out.
What the game was going to be
Something I struggled with, after I’d decided that I want this to be a sincere game, instead of a one off, is that I’d need to make the game legitimate in it’s design. I’d need a win state and a lose state. I’d need goals and unlocks. It needs to look, sound, and feel good. Initially it was one face you’d punch over and over, earning coins to buy more combos, but that wasn’t enough to keep you interested, so I added more things to buy in the shop, including the ability to charge up a fist, and in the interest of integrating that into the game, I added the charging fist as part of the combos.
Instead of Left, Right, Left punch, it might be Left, Right, Charge Left, Right, but that led to a strange pause in the flow of the game. It wasn’t fun or rewarding to stop everything for half a second just to get a combo going, there was more interesting things to do. I tried adding temporary buffs like increased damage, and reducing the time it’d take for the charged punch to complete, but that wasn’t enough either. I decided to add more things, like a rocket launcher, a grenade, and a variety of effects you could apply to your fists, to motivate people to earn more coins to keep them playing, but I couldn’t keep people interested in playing for more than 30 seconds.
Realizing that there wasn’t a good way to keep the game interesting beyond completely overhauling the fighting mechanics, I decided to break the shop down and move from one face forever, to levels with objectives and unlocks, while the shop still has the temporary buffs. This has the benefit of keeping the fights short, quick turn around on the unlockables, and I can add more variation to the faces between levels than I could altering one face as it got more beat up. But I’d need art.
Even working alone, there’s a team
I couldn’t produce any art on my own, and the artist I had worked with for BiochRL was busy, so I turned to reddit to get an artist. After talking to a bunch of very talented people, I decided on going with an artist, surfinbirdzx who was able to draw out what I was looking for. It was nice because even with a language barrier and a limited set of instructions I sent his way, he was able to turn it into what you see here. Although it took some time from my initial email to his response, the quality was topnotch.
He gave me sketches, asked for feedback and fleshed them out really well. As before, it was great to work with someone who is able to take feedback and work with me to make something great. All in all, it cost me about 800$ to get the UI, backgrounds, logo and faces.
For the music, I asked djsirgold for some help with the music, who offered to do it for free, because like me, he just wanted to work on something other people would enjoy. He sent me some menu music, a transition clip and a fight theme, along with a sweet shop theme. No one could have captured the intensity of the game contrasted with the relaxing shop theme like he did.
I grabbed most of the sound effects off FreeSound and SoundBible and had a friend throw a few more together to really make those punches sound like they hurt.
I wouldn’t have been able to make the game feel as good without the help of these dudes, so that was awesome.
For testing, I brought the build nearly daily to my friends who’d give me helpful feedback, about how things worked nicely or how they didn’t feel fun to play, who told me whether or not something was too easy, or too repetitive. More than that though, it was really important for me to have a group of people to show my game off too. With BiochRL, I needed to drag them over to my desk and sit them down; with my android app, I could whip out my phone and harass them no matter where they were. I have no doubt that there was a point where they were probably sick of me asking ‘Hey, have you seen my game’ because invariably it was ‘yeah, you showed it to me this morning’.
Keeping it going
Having people try out the game regularly kept me on track. I’d try to work on it as much as I could, but knowing that the next day I could have some people to show the game off to was an incredible motivator for me. I worked on Beatup part time, which meant that I spent most of my weekends on the game, but
I wanted to get this game done, because as you know, finishing a game is a skill , so I endeavored to make a commit every day and get my game done. It wasn’t always fun, but I knew at the end of the week I didn’t have to make those small 5 changes I did throughout the week, and I could work on something else instead. Sort of like the opposite of a death by a thousand cuts, I chipped away at the game, piece by piece.
My current streak is 99 days, but that’s not exactly right, some of those commits are just a line of whitespace, just barely enough to count as a commit, just so that my attention was on my game for at least 5 minutes that day.
What’s next?
I’m not really sure. I’m going to keep fixing the bugs that crop up, but I’d like to still add more to it. There’s a lot of room in the macro feature space, like I’d like to add some sort of base building mechanic to give the coins even more meaning. Other than that I’d like to try to make a new game, one with some story, something that doesn’t get made too often, but it’s hard to think of exactly what.
All I can say is that it was an amazing 11 months, even if it wasn’t the breakout hit I was hoping, and I’m stoked to spend another year on my next one with all the stuff I’ve learned, given that I’ve built myself a decent platform to work on now.
tl;dr Worked for 11 months to make this, learned a lot, felt good about what I made, got cocky, 4 people downloaded the game, realized I’m not a gamedev god, and wrote this
Hello, My Name is Dorian. I saw your update to the cocos creator c_++ plugin to add layout support. I just wanted to say thank you and that you have saved me lol. Most of my games components are supported, except for text field. I wanted to ask if i use this link https://github.com/cocos2d/creator_to_cocos2dx/wiki/How-to-support-a-new-feature-of-creator is it possible for me to add text field support?
(a year and a half later 🙁 ) sorry, I’m not sure. I never finished the Layout PR and haven’t done much for Text Field support. I use the Creator one, then have a custom function I use to turn the Creator one in to the older Editor one. The one in Creator used the OS to put a textfield within the app, and the one I’m using now uses a Label renderer so it actually works in fullscreen.