My LD47 Post Mortem

My 11th Ludum Dare was once again filled with ups and downs, but I did manage to put out a game. This is the story my LD47 Jam entry, The Pongs. This blog contains an overview of my development weekend and some technical details.

Day 1

There’s not much to talk about for this day. Once the theme was announced (“Stuck In A Loop”), I do what I always do… come up with no ideas. Usually, I like to review the themes before they are announced and come up with some basic ideas, but I did not get that opportunity this time. After a few hours coming up with nothing, it was now early Saturday morning (EST) and I decided to call it a night.

Day 2

Saturday morning, and still no good idea. I had a couple of ideas, but nothing I wanted to really work on. It was at this point I decided that LD47 may not be for me, and I shut it down… discouraged as always.

Not one to totally give up, I decided to give it another try and put out something rather simple. I played around a bit, and got a pong-like game working where you try to shoot the squares out of the loop they are stuck in. Progress was slow, and the game was not all that interesting to me.

I used some basic Photoshop skills to create the loop. Using Unity, I rotated the loop, and added basic square and triangle shapes to create the pongs and the center firing mechanism. I was going for a retro look, so the white shapes seem to fit well. Physics added to everything.

By the end of the day, I had pongs bouncing around inside a rotating loop, and I can fire bullets at the pongs. I’m still not loving this concept, and considered giving up so many times, but I kept going.

End of Day 2… Nothing Special

Day 3

It wasn’t until I decided to add faces to the Pongs that the game started to interest me. Back to Photoshop to add eyes and several mouth styles. The face script is pretty basic, but here is where the pong’s character is created. The eyes will blink randomly every 4 to 6 seconds. The mouth will change shape depending on what happens. The default is a smile, and will change to a frown if it hits a wall. It will change to a surprised look when a bullet collides with it.

Keeping with the retro look, I added some blips and a chiptune soundtrack. At this point, I found myself laughing at the reactions of the pongs while I was play testing and I began to think I may have a game here after all.

I added some additional sounds for when a pong finally escapes. I recorded myself doing some “Yay!” sounds, loaded them up in Audacity and raised the pitch. I think it came out well, and really adds to the game.

Day 4

Since I didn’t really get a good pace on development until Day 3, I of course missed submitting for the Compo, but there’s still time for the Jam, and now I’m “all in”. I no longer had time to put together a way to increase level difficulty as the game progresses, so I decided to create the options screen where you can choose the number of pongs, the speed of the loop rotation, and (if you are daring), the option for a second loop.

Technical Things

  • I used the following tools to create The Pongs: Unity, Photoshop, Paint.Net, Audacity.
  • I originally started using Unity’s new Input System, and it worked well while playing the game, but I just could not control the UI correctly… maybe it’s because I am new to it or it is still a work in progress, but I just could not get it to work. I finally decided to scrap it and try Rewired (I used it before and I like it a lot), and I had a similar issue when trying to navigate UI. I guess that problem was me indeed! Finally, I pulled out all controller libraries and used the old-fashioned KeyDown commands since there is basically only 3 keys used in the game anyway.
  • I used my open sourced pooling library to pool the pongs and bullets… you can use it too!
  • I created different eyes and mouths for the pongs. Eyes blink at random intervals. Mouths change based on what the pongs hit.

What Went Well

  • Again, I submitted a game! Always a good thing.
  • My motivation increased once I made some simple changes like changing the sprites and adding some basic sound effects.
  • I think adding the options menu worked better than trying to figure out a way to add levels to increase the difficulty of the game, and some of the people who played/rated the game agreed.

What Could Have Gone Better

  • Maybe I should learn how to use a controller library before using it in a game jam? Figuring out the complexity, failing, and then removing everything took a lot of time.
  • Lack of motivation was strong in this LD. It wasn’t until the end of Day 3 that I really felt that I had a workable game and that did have an affect on the overall submission.
  • I decided on a “lower the score, the better” scoring system, but I think perhaps a “fastest time to clear” may have been a better system to implement (or maybe some combination). It is possible to wait around to see if some of the pongs leave the loop on their own which definitely impacts the current scoring system.

Conclusion

It was a difficult Ludum Dare for me, but I have a submitted game that I liked playing and developing. I am happy with the way my game turned out, and I am considering enhancing the game and doing a full release… there are a lot of features I would like to add.

CoronaSDK, Solar2D, And My Plans

Well, it was a bit of a shock, yet somewhat expected at the same time, but Corona Labs has been shut down, and the 2D game engine I have been using on and off for about 8 years has gone open source. Due to an unfortunate circumstance, a name change was in order… Corona SDK has been renamed to Solar2D.

I have 8 games and several plugins written with Solar2D. The following are my plans for these products.

My Games

I am currently rewriting Spell Them Out in Unity, since there are a lot of updates and features I want to add, and the current Solar2D version is somewhat difficult to update.

For the remainder of my games, they will remain in Solar2D and will see minor updates and features along the way. As stated in my 2019 End of Year Summary, I plan on updating all my games to Unity eventually, and this will happen as needed.

All new games will utilize Unity going forward.

My Plugins

Things may change, but right now, these are my thoughts on my plugins:

  • GBC Data Cabinet is a free plugin that helps the Solar2D developer create and manage session and persistent data. I am unsure at this time what I want to do with this product, but I will probably release the source code or package a plugin on the GBC Data Cabinet GitHub page.
  • GBC Language Cabinet is a free plugin that helps the Solar2D developer localize in-game text strings, including strings with dynamic data. I am unsure at this time what I want to do with this product, but I will probably release the source code or package a plugin on the GBC Language Cabinet GitHub page.
  • GBC Object Pool creates and manages pools of game objects that can be reused within your game. Object Pooling enhances performance by eliminating the creation, destruction, and garbage collection of similar objects throughout the life of your game. This plugin had a cost of $5.00 USD and sales were not as I expected. I am pulling this plugin from the market, but if there is a change in demand, I may re-release it. This plugin took a long time to engineer, and I do not want to spend the time supporting it if there is no demand.
  • GBC Text was a work in progress. GBC Text is a library that supports enhanced text management. If interested, there is a very brief proof-of-concept video here. This is another plugin that requires a lot of engineering, therefore it will most likely remain unreleased unless there is high demand.

The End of an Era

I am saddened to see CoronaSDK and Corona Labs fold. It is truly the best 2D game engine out there, but it was difficult during the last few years to stay relevant for some reason. There is a lot of instability at this time, but I do wish Solar2D much success as an open source project going forward.

My 2019 Wrap-up and 2020 Game Dev Plans

Time for another end of year article on what I accomplished in gamedev this year, and what I want to do next year as I end my 8th year and begin my 9th year developing games.

My 2019 Accomplishments

The following is a list of my accomplishments for the year.

Achievement: I participated in 1 Ludum Dare event

I participated in Ludum Dare 44, which resulted in Wizard of Worth. You can read about the game in my Post-Mortem article. I decided to take a break from LD45, as I just wasn’t “feeling it”.

Achievement: I rewrote Tappy Holidays using Unity

The Corona version of Tappy Holidays was somewhat flat and boring. I wanted to experiment with the beta of Unity 2019.3 to see what the Universal Render Pipeline and 2D Lighting Effects can do, so I decided to rewrite a small game and compare the results. Tappy Holidays with Unity was recently released on Google Play. You can read all about it here.

Achievement: I rewrote Tappy Easter in Corona

Strange. Tappy Holidays went from Corona to Unity, and Tappy Easter went from Unity to Corona.

the Unity version of Tappy Easter was so frustrating to support. Google Play Game Services and Admob just did not play nice under Unity, so I decided to scrap it, and create a Corona version. The process was successful, although I am having doubts around continuing to use 2 game engines (more on that later).

Achievement: I Updated my Object Pooling library

My free Object Pooling library for Unity has been on GitHub for a couple of years now. I use it in all my projects. I recently added a Custom Inspector to easily add and remove object pools within the editor. I also am thinking of adding a few features in the next couple of months as well. Of course, since this plug-in is open source, you can grab a copy for your use, and help add enhancements!

Achievement: I developed an awesome, yet unreleased, CoronaSDK Plug In

I wanted to enhance the text features of Corona, so I developed a plug in called GBC Text. GBC Text allows you to create a sprite sheet of letters to create and display text strings. I have a small demo video that shows a sample of what GBC Text can do.

This was one of my most challenging projects ever, and it came out very well. I started using GBC Text in my projects, and I felt that it would make a great Plug-In for others to use.

Unfortunately, I under-estimated the demand for this type of plug-in, although at the time there was a lot of talk about better text libraries for Corona. The demand was very low, so I decided not release it on the Marketplace. If demand increases, I may change my mind.

I spent a lot of time on this library, and I feel it is one of my best projects of 2019.

My Plans for 2020

I have a lot of game development plans for 2020… I hope to get some of these completed. Some of them are massive.

Goal: Update (Rewrite) all of my mobile games

I have 8 games on the iOS and Google app stores… some going back to 2012. I’ve supported them over the years with updates and features, but after looking at them more closely, I think they are starting to show their age, so rewrites are in order. It’s a good opportunity to build in enhanced features from the start.

I think I am going to standardize on Unity for all my rewrites. Other than maintenance of my existing games, I think I am going to finally move away from Corona. I’ve been putting this decision off for a few years… I love working with Corona, but there have been changes with the company and the product that I just don’t like. If there is any interest, I can write a separate post on my decision.

Goal: Finish Johnny’s Flip Book Adventure

I was well into development of Johnny’s Flip Book Adventure, when I (of course) decided to restart it. At this point, I have a working game with 2 modes. The first is a rewrite of my Ludum 42 entry, and the second is a version of Space Mission Survival.

The start again, stop again saga of Space Mission Survival? I just don’t know. I think I started that game back in 2016. Each time I restarted it (7 times now!), I get very far, but I never put the finishing touches on it. I have doubts about the success of this game… a game with the same game play, but just using different graphics may be not something that people will want to pay for. I personally love playing the mobile version of this game, and maybe if given some time, I can restart it for the 8th time, but in the meantime, I decided to combine Space Mission Survival and Johnny’s Flip Book Adventure.

Right now, Johnny’s Adventure has the 2 modes that are completely separate. Playing the game, I don’t think the Ludum Dare mode stands on its own. I have decided to combine the LD42 and SMS modes into a single game. The game will be Space Mission Survival with tearing away pieces of the play field. Let’s see how this goes.

Conclusion

It’s been a productive year, and my goals for 2020 are aggressive, but I look forward to giving it a go. Lack of community support is discouraging at times (completely my fault since I do not spend massive amounts of time on social media services… something I should improve on), but I will carry on and hopefully have a better 2020 and create something you want to play.

Happy New Year!

GBC Object Pool (Unity) Update

Just a little note to tell everyone that I made an update to my free, open-sourced Unity asset, GBC Object Pool.

GBC Object Pool is an easy to use and light-weight object pooler for Unity. This update allows easier set up through the Inspector. Just create some pools, drag in a prefab add a name and amount of items to pool, and you are all set.

I plan on some more updates in the new year, and since this is open-source, I encourage you to contribute!

Tappy Holidays: The Rewrite

I decided to play a bit with the Unity 2019.3 beta… I was interested in seeing what the 2D lighting effects and the new Universal Render Pipeline can do, and what better way than to create a small game? Even better… what better way than to take an already existing game and upgrade it?

I took my existing game, Tappy Holidays, and rewrote it using the beta version of Unity 2019.3 and it was a pleasant experience (although there were some issues, that’s beta for you!). As of this writing, Tappy Holidays is available for Android, and should be available on iOS soon.

The left screenshot is the Corona version, the right is the Unity version. Look at the improvements on the Unity side: 2D lighting effects the nearby sprites, superior text with drop shadows, and particle effects on the title screen. Impressive.

Tappy Holidays screen shot

I wanted to get this game out around Thanksgiving, but due to some beta issues with Unity, it took a little longer. Once a release candidate of Unity was available, it was easy to package and release.

I hope you give Tappy Holidays a try. Let me know your thoughts and if you run into any issues. The game has always been free, but as an added bonus, this version contains no ads!

Tappy Holidays!

My Unreleased CoronaSDK Plugin

I have 8 games created with CoronaSDK, some going back to 2012. I do revisit them from time to time to add features, fix bugs, and update libraries that I used. For the latter, I have used and purchased several libraries, and I have created a few as well. If I feel that there is a market for them, I release them as Plugins on the Corona Marketplace.

Over the years, I have developed and integrated GBC Data Cabinet, GBC Language Cabinet, and GBC Object Pool into my own projects.

  • GBC Data Cabinet manages your data. You can create storage “cabinets” to read, write, and save data for later use. This eliminates the need for global variables, and makes management of data between scenes much easier. And… it’s FREE.
  • GBC Language Cabinet manages translation within your game or app. You create the text for each language you want to support, and GBC Language Cabinet will handle grabbing the correct text, including the inclusion of any variable data. And… it’s also FREE.
  • GBC Object Pool manages your game objects so they can be reused. Instead of creating and destroying objects repeatedly (bullets or enemies, for example), GBC Object Pool creates game objects and manages them throughout the lifetime of your game. Performance using object pooling via this Plugin is noticeable. It’s not free, but it is a reasonable (I think) $5.00 USD.

I have one (well, actually two; more on that later) plugin that I have not released, GBC Text, which is a bitmapped-text manager.

GBC Text – The Highs

GBC Text started out as a replacement for a once-popular, but no longer sold/support text library that I purchased back in the 2012 time frame. I wanted similar features, since Corona’s text library is very basic, so I decided to write a library. The results are demonstrated in this Proof-Of-Concept video.

As of now, the library can do the following:

  • Allows you to load and use multiple bit-mapped fonts.
  • Displays the fonts in various sizes.
  • Left/right/center alignment.
  • Sets anchors.
  • Flows text.
  • Can change text dynamically, without the need to destroy/recreate.
  • Allows you to animate text as a whole or as individual letters.

I put a lot of time into engineering and developing this library, especially the last 2 features in the list above, and I feel the results are great. I have begun integrating this into all my current games, and will add additional features as needed.

GBC Text – The Lows

After reading thread after thread on the limitations of Corona’s text system, I felt that a plugin like this, at a reasonable price, would be greatly welcome. I posted a message on the Corona Forums showing the proof-of-concept and asked for feedback. I was surprised that there were close to 200 views, but only 2 replies. A bit discouraging, no doubt.

Reason for Not Releasing

This is eerily similar to my experience releasing GBC Object Pool… there was a lot of talk about performance in creating/destroying objects repeatably, and I wanted to develop a method to manage objects easily within Corona. I spent a great deal of time on the library to enhance performance, remove bugs, document, and prepare for Marketplace. The development and engineering, as well as ongoing support, requires time, effort, and money, so I decided to release it for five bucks. Sales in the two years since release are dismal (maybe this plugin is a solution to a problem that does not exist), and I do not want to go through this again with another plugin.

I had high hopes for GBC Text, but based on the lack of responses in the forums, and on Twitter, I am no longer sure if people would pay for an enhanced text library, so for now, this library will remain an internal library for my own use.

“Free” you say? “Open Source” you say? Maybe at some point, but not now.

Oh, My Second Unreleased Plugin?

I also developed another library I have been using for years. It is sort of a game center library to manage the iOS Game Center, Google Play, and Amazon GameCircle (when it was active) plugins. I also spent a lot of time on this library, since Apple and Google enhance their SDKs quite a bit, and each platform has their quirks on how they handle leaderboards and trophies. I also want to add PC and Mac support at some point. I am not sure about releasing this plugin either, since this library requires a lot of maintenance when Game Center and/or Google Play changes something on their end.

Ludum Dare 44: Post Mortem

Another Ludum Dare completed (my ninth!). This one was my toughest one yet for me. Lots of highs, lows, frustration, failures, and success. All of this, and more, will be discussed as I detail the development of my entry, The Wizard of Worth.

Day 1

I had a hard time with this theme. In the days before theme selection, I looked at the possible candidates and wrote down some ideas for each one… except this one. Of course, “Your Life Is Currency” was selected and I spent almost 3 hours thinking of an idea.

Once I got a working idea (my son helped with some suggestions), I decided to create some graphics first, which is something I normally do not do. I knew I had to create graphics at some point, and I wanted to give Aseprite a shot to see if I can handle it.

At this point, its about 2:00am, five hours into the Compo, so I decided to call it a night. At the end of Day 1, I had some graphics created, and a basic game where the enemies chase down the player.

Day 2

I got about 5 hours of sleep, got up, and went back to work. I added some particles, a coin retrieval system, and a player shooting system. After a few rounds of playing this game, I came to the conclusion that its terrible! So discouraging.

I had about 10 hours of solid development time and the game was horrible. I took a couple of breaks during the day and came back to tweak and add/change features, and every time I played my game, I hated it more. No matter what I tried, it was just not fun, and I was so discouraged that I decided to take an extended break.

Day 3

I said I was taking an extended break… how about a 24 hour break? That’s what I did. During that time, I thought about whether I should continue, give up completely, or start with a new idea. After speaking with my wife and son, I got some pretty decent ideas on how to improve the game, and that started the drive to finish and submit this game.

I wanted to add a lot of things… more minions to chase you, different types of minions, multiple weapon types, and more. The problem is that it is now very late on Sunday, and I only have a few hours left.

I improved the player shooting (shooting towards the mouse pointer), added a back-story, sound effects, some additional graphics, and the title and game over screens, and submitted later than usual, but before the deadline. These changes really improved the game, and its much more fun to play.

What Went Well

  • Despite the ups and downs during the event, I did submit an entry.
  • Even though I had very limited experience with Aseprite, I managed to create some graphics (and some crude animation) using that tool.

What Could Have Gone Better

  • The 24 hour period where I “gave up” really put a dent in the time left when I decided to re-enter the compo. I wanted to add different minions and demons, each with a unique strength and weakness, but I ran out of time.

Conclusion

Looking through several of my other LD Post-Mortem posts, it looks like I fall into the same pattern where Day 2 is a bit discouraging, but I always manage to find a way to improve and finish.

This Ludum Dare was no different, but the lows were unprecedented for me; to a point where I walked away knowing I would not come back. If it were not for some encouragement from family, I would of packed it in and regretted the lack of submitting a game for the first time. I am glad I went back and continued.

[divider]