Making Mobile Games

And how I made one in a week


Have you ever wanted to make a game, throw it on the App Store/ Google Play Store, and make a fortune?

You're not alone. Millions of other people have tried this, and most of them failed. I failed as well. I've made 2 mobile games, so here's the story of both.

SPACER

In the spring of 2021, just as my Freshmen year was ending, I wanted to diversify a little and try my hand at a mobile game. To be truthful, I wasn't really trying to make a mobile game for the money, but because of the constant stream of content fed to me about kids getting rich off of one mobile idea, I thought there was a possibility.

I had this idea pretty early on about a flappy bird type clone, but with a little more to it. Some angular spin, some enemies, you know. It seemed pretty simple so I got to work with coding it.

Very early prototype for SPACER

I ended up calling the game 'SPACER.' It really wasn't anything special, but I didn't know much at that time, so it took me 2 months to make it. I did end up putting a lot of detail into it, and the game overall does feel okay, but the actual process of making it was not good.

I had no awareness of good programming practices at the time, and all the code was starting to become an obfuscated mess. I remember how the "special space ships" behaved as another normal ship. All the normal ships were orderd as "ship 1, ship 2..." and the special ships were "ship 13, ship 14..."

This meant that if I wanted to add another ship into the game, I would have to move all the special ships down, one by one. I had to rename how they were refered to by the player, I had to rename the files, and I had to rename all the code. Adding in a new ship would take like 3 hours, just for a simple addition.

Here is the "die" function that would allow the ship to die and make the game restart:


                func die():
                    remove_child($"Enemy detector")
                    remove_child($shoot_timer)
                    Globals.stable_events = false
                    Globals.last_ship = "ship " + str(Globals.ship_num)
                    AudioBus.die()
                    Globals.lives = 0
                    velocity = Vector2.ZERO
                    gravity = 0
                    $explode.emitting = true
                    $sprite.visible = false
                    set_script(null) #makes it so we cant jump or anything anymore.
                    Globals.alive = false
                    if Globals.low_performance_mode == false:
                        get_node("Back effect").queue_free()
                    get_parent().get_node("Node2D/PopupMenu/AnimationPlayer").play("popup anim") #grabs the animation player and plays it. no need to make it visible or hide it becase the anim player does that automatically.
                    get_parent().get_node("Node2D/PopupMenu/score test").text = "your score: \n" + Globals.add_commas(str(Globals.round_points))
                    if Globals.round_points > Globals.best_points:
                        Globals.best_points = Globals.round_points #sets a new highscore
                        Globals.best_ship = Globals.last_ship #sets the best ship.
                        get_parent().get_node("Node2D/PopupMenu/Best score text").text = "Your new best score is: " + Globals.add_commas(str(Globals.best_points))
                    else:
                        get_parent().get_node("Node2D/PopupMenu/Best score text").text = "Best Score: " + Globals.add_commas(str(Globals.best_points))
                    Globals.save_game()
                    if Globals.first_time == true:
                        get_parent().get_node("store info z index/AnimationPlayer").play("New Anim")
                    var string
                    var facts = {1:"You can hold down the shoot button to spam/autofire.", 2:"You can let 3 enemies pass you before you die. Try playing less risky!", 3:"You're doing great. Keep it up.", 4:"If you don't like the particles or vibration, you can turn it off in settings.", 5:"Keeping you ship in the lower half of the screen is proven to work the best.", 6:"Remember to check out everything in the store. There are really usefull things in there.", 7:"The enemy boss ship gives 10,000 points for killing it.", 8:"The enemy spawn rate increases very slowly.", 9:"The developer's high score is 90,000 using Gl!tch, and 106,500 using normal ship.", 10:"There is a reddit community for SPACER if you have any suggestions, feedback, or other content.", 11:"This game was developed in about 2 months using the Godot game engine.", 12:"Epic.", 13:"With this many points, it's probably worth it to watch an ad and double them. Just sayin'.", 14:"Bruh.", 15:"That's... a lot.", 16:"If you like SPACER, it helps us 			 if you rate it 5 stars.   ->>"}
                    string = facts[int(rand_range(1,4.99))]
                    if Globals.round_points > 4000:
                        string = facts[int(rand_range(5,8.99))]
                    if Globals.round_points > 10000:
                        string = facts[int(rand_range(9,13.99))]
                    if Globals.round_points > 30000:
                        string = facts[14]
                    if Globals.round_points > 50000:
                        string = facts[15]
                    if Globals.round_points > 2500 and Globals.round_points >= Globals.best_points:
                        string = facts[16]
                        get_parent().get_node("Node2D/PopupMenu/SPACER button").visible = true
                    get_parent().get_node("Node2D/PopupMenu/Did you Know").text = string
                    if Globals.ship_num == 7:
                        Globals.round_points = Globals.round_points * 2 #this is the double points ship
                        get_parent().get_node("Node2D/PopupMenu/score test").text ="your score: \n" + Globals.add_commas(str(Globals.round_points)) + " (X2)"
                    if Globals.ship_num == 11:
                        Globals.round_points = Globals.round_points * 10 #this is the double points ship
                        get_parent().get_node("Node2D/PopupMenu/score test").text ="your score: \n" + Globals.add_commas(str(Globals.round_points)) + " (X10)"
            

If you don't know too much about code, let me explain why this was horrible:

Anyways, you get the point. The code was bad. But I was still able to release the game, and I posted it all over my school. I had a few friends playing it, but it never got over 100 downloads.

I made like $5 in advertising, so the game certainly wasn't a success. Between it's horrible code and garbage game machanics, it was just a pretty bad game. However, it's a game that I made, so after making all those mistakes, all I've done is learn from them.

Jet.io

The year was 2023, and I was a junior in highschool. It had been a while since I had made a video game, so I wanted to make one again.

But I didn't want to drag it out for a few months, I just wanted something quick and easy. So I replicated one of those dumb runner-games and posted a tutorial on it on Youtube.

To summarize, you basically just grab assets from other websites and artist so you don't have to make anything else; just focus on the programming.

Ironically, despite making Jet.io in a week, it was much more maintanable than SPACER. With 3 years of programming experience, everything just kind of clicks more.

Now of course, I didn't even make a penny off of Jet.io. I knew better than to even care about trying to make money out of it this time.

I wish I had more to say about Jet.io, but it's just a pretty typical mobile game with no heart or soul put into it. It got like 10 downloads, because I never advertised it; the youtube video was much more important than the game itself.

Google Play is forcing me to include a Privacy Policy for Jet.io, despite it being super primitave and offline. So here it is.

Conclusion: You probably won't make money publishing mobile games. But if you keep trying, you'll start to get better at programming, which is good I guess.