icon-1024.png

Gravitas!

  Game Designer | Programmer | Graphics Artist | UI Designer | UX Designer

Gravitas! - iOS and iPadOS (Universal App) (2023)

Project Overview: I have always been a fan of unique puzzle games but one of my all time favorites is an old Nintendo DS title called Meteos.  I must admit that I was shocked to find that despite it’s critical reception (it was game of the year in 2005 in the puzzle genre) the game was not particularly popular and was never released as a mobile game.  I have searched in vain for Meteos on the App Store many times and came up empty.  While everyone seems to have made a Tetris clone as a portfolio project, very few people have strayed from the classic block puzzle formula.

In February 2023 I had the opportunity to begin working on a new game in my free time and I decided that now was the time to finally tackle a Meteos-like puzzle project.  I didn’t want to make an exact copy of Meteos so I made some adjustments in design, story, graphics assets, and the physics engine so the game behaved in a unique way but reminded players of Meteos because of the launching blocks, fun music, and bonus particle and sound effects that hit a gamer’s ‘lizard brain’ to release some dopamine when you begin scoring combo chains.

From a design standpoint I borrowed heavily from the fighting and shooting game genres.  I used particle effects liberally and tried to craft 20 unique levels with different environments, block types, and physics challenges (more gravity, for example).  I also decided to challenge myself with a real-time online multiplayer mode to allow players to go head-to-head against each other either locally via WiFi or over the Internet.  I utilized Apple’s revamped GameKit API to facilitate the online game play as well as providing leaderboards and achievements to drive replay and discovery.

Finally, when the player completes all 20 levels in the Classic (Story) mode they will unlock something called Grav-Lab mode.  This allows the player to take full control of the physics engine in the game and create their own unique levels.  This is more of a bonus reward for finishing the game and it’s quite fun to experiment with.

Overall, I’m quite pleased with how Gravitas turned out and it’s a good showcase for the variety of skills that I employ to develop a game on my own.

The various level block designs based on a theme.

Research Findings: The mobile games marketplace is tougher to break into than just about any market out there.  There are so many good titles, most of them free with various ads and in-app purchase gimmicks that a paid app can easily get lost in the shuffle.  Add the various subscription services from Netflix, Apple (Arcade), and even individual subscriptions in free-to-play games to turn off advertisements and I wonder if a stand-alone $1.99 game with no ads and no b.s. would sell or even get on anyone’s radar?  That’s one area I’m experimenting with for this project.  I’m going to launch as a paid app but if it doesn’t gain much traction, I may need to consider changing to a more traditional in-app purchase model down the road.


Addressing Feedback: I utilized friends and family for extensive play testing of the game as I developed it.  There were two main areas of feedback that I incorporated into the final product.

Enhancement #1 - Touch Controls and Block Sizes

The game played extremely well in the iPhone simulator on my Mac using the trackpad, but once I began playing it on an actual device it became clear that my fat little fingers were too big to adequately see what blocks I was tapping and where exactly I was dragging them.  Since the gameplay involves swapping one tile for the other by tapping and dragging, this was problematic.

Ultimately I resolved this problem with a little sleight of hand by implementing the following changes:

  • When a player taps on a block, I make a semi-transparent copy of the sprite that they clicked on and enlarge it by 33%.

  • I then change the sprites in the column they selected to showcase which moves are possible.

  • Finally, I restrict movement and input to a vertical column to reduce the chance that incorrect data is provided to the game engine if the player’s finger is a little off center one direction or the other.

This change ultimately resulted in better play control and a less frustrating experience for players regardless of the size of their phone or their fingers.

Enhancement #2 - iPadOS Native

I had requests to build an iPad native version of the game.  While at first I was hesitant about the game running on a 13” screen, I realized that if I created a special enhanced UI for the iPad that made better use of the extra screen real-estate that this version could be even better than the iPhone one.  This required some additional design work including a new UI and additional art assets, the end result speaks for itself.  Add the addition of being able to play the game with Apple Pencil or another stylus and the iPad version is as close to the Nintendo DS experience as you can get (because the DS had a stylus).

The additional space allowed for me to add new content to the UI. One of my favorite additions is the target view screen where you see explosions near the wormhole when shooting blocks back at it.  In two-player mode, your opponent’s Game Center Avatar is shown here taking damage when you send matches back at them (and they eventually explode when you win).

The difference in the UI between the iPhone and iPad versions of the game.


Game Engine: Similar to PetriPet 2, in the case of Gravitas I broke up the development process into two parts.  Part one was developing the game engine with placeholder graphics (a plain background and simple colored blocks) and once the engine was solid I added all of the art, sound, and music assets.  This process allowed me to play test the game to determine if it was fun before bothering to develop all of the rest of the artwork and finishing touches like particle effects and the overall UI.

To develop the engine I used Apple’s SpriteKit.  For each frame update, I’m calling a number of functions that update a handful of arrays that determine the location of each block on the board.  It checks for vertical and horizontal matches of three or more and then calls subsequent functions to launch the blocks into space.  For the physics engine, I utilized the SKPhysicsNode properties of SpriteKit to assign values to both the blocks and the environment.  Gravity, Restitution, Mass, and Velocity values are all used in conjunction with applying various types of force to the blocks when they match to create the rocket-like movement up.  Collision detection is used extensively to determine when the blocks are cleared from the board and how the blocks interact with each other.

In addition to the engine’s visual and gameplay elements, I also built a loader function to parse JSON files that describe the level’s design, physics, and assets.  This makes it very simple to add new levels by providing a sprite atlas, background image, and JSON file to the engine.  Ultimately the game engine is very portable and I’m already thinking about what I might do with it should the opportunity to develop a sequel to Gravitas ever present itself.  At bare minimum, the way the engine loads levels, graphics, and more allows me to make additional levels or create special events around various national holidays (maybe a level around St. Patricks Day full of Irish bling or a Christmas level with ornaments raining down around the holidays).


Challenges: There were a number of challenges I overcame when developing this title.  Here’s a quick description of the most common ones.

  • Multiplayer:  Apple makes this quite simple to pull off due to the extensive Networking calls and backend infrastructure they provide through GameKit.  Despite this fact, it was the first time I had ever dealt with real-time online gameplay and there was a learning curve.  A lot of effort went into handling the unexpected events like network disconnects, forfeits, etc.

  • Physics Engine:  I really enjoyed developing with the SKPhysics libraries, but because I do not have a mathematical physics background, much of this was trial and error where I manipulated variables to see their effects.  This was new and challenging but ultimately rewarding.

  • Supporting iPad and iPhone:  As mentioned above, a lot of extra effort went into providing a unique and enhanced experience for iPad players.  Well worth the effort in my opinion but it was like developing a whole second game to fully support and take advantage of the iPad’s capabilities.

  • Mixing SwiftUI and UIKit:  This is something that I think Apple needs to address and hopefully will address in future versions of iOS/iPadOS/Xcode.  Much of the SpriteKit and GameKit libraries rely on the aging UIKit library.  For example, the GameCenterViewController that Apple provides is a UIKit ViewController and is not yet available as a SwiftUI View.  I spent a good amount of time working with both UIViewRepresentable and UIHostingController to integrate newer SwiftUI Views together with UIKit ViewControllers where needed.  Limitations of this approach definitely impacted the overall navigation flow of my app.  I felt like some of the tradeoffs I made in navigation were acceptable for a game, but would never fly in a productivity app.  Still, there are part of the navigation in the game’s selection menus that irk me as a UI/UX aficionado.


Technologies Used:

  • Apple Xcode 14

  • Swift 5 & SwiftUI 2 + UIKit

  • SpriteKit, StoreKit

  • Apple Keynote

  • Adobe Photoshop

  • Procreate

  • TechSmith Camtasia