Converting a Flash Game To HTML5

Hey guys,

I’m working on an interesting project now. A repeat client has requested that I convert a cards game I previously made for them from Flash to HTML5.

As you may be aware, Adobe is discontinuing their Flash player browser plugin by the end of 2020.

There really aren’t any true “conversion” tools out there. In other words, say you have a Flash project that consists of a few Flash FLA files with library assets in them, and maybe some exported to external classes, as well as additional external asses loaded at run-time, as well as external AS3 files. And your build process (what you use to generate your final SWF file) uses either Flash CSx/Animate or say, FlashDevelop (good tool, by the way – I highly recommend it if you’re using Adobe AIR to build mobile games).

There is no conversion tool that can just convert all that into a HTML + JavaScript files with all the assets extracted from FLA files, and present you with an HTML index file that you can simply run and be on your merry away.

That. Would. Be. Awesome.

If you want to convert a Flash game to HTML5, you pretty much have to learn JavaScript if you don’t already know it, and rebuild it from scratch).

Depending on the simplicity of your game, you may get some help from Adobe’s Flash Animate, but I’ve never tried it, and due to the complexity of the games I make, it’s likely to not work.

There are several other tools out there, your best bet may be to simple rebuild the code, but you can still use the assets.

However, if you have the original source code – the ActionScript 3 .AS files, sounds, and Flash .FLA files (which I do have because I wrote the original Flash project in the first place) – you already have everything you need to do this. Meaning, you don’t need to go through the trouble of decompiling SWF files and other dubious tasks.

Also, fortunately, the Flash game I’m converting doesn’t do any blitting of bitmaps. All graphics are either bitmaps imported into the FLA, or vector art saves as library symbols. The library symbols can be converted to bitmaps so they can then be used in the HTML5 version.

The biggest challenge for assets and layout is no longer having a super-convenient WSYISYG (what you see is what you get) editor like Flash CS/Animate. This allows you to place and size the objects in a scene as they should look when the game is running. Without this vital tool, you have a few options:

1). Hard-code all the sizes and positions of everything, and references to what everything looks like. (OUCH! This is not the old days of game development. I’m pretty sure we can come up with something quicker and easier, right? 🤔 )

2). Use an editor, like Phaser Editor. A visual editor to build your layout, position and size objects on the scene. This editor has a built-in code Canvas Compiler that will translate your layout into JavaScript code, placing and sizing all your objects for you. You can then focus on building the layout. Now…

For the most part, converting AS3 to JavaScript files is fairly simple. Although it’s a laborious task of recoding, ActionScript 3 and JavaScript share many similarities, both having roots in the ECMAScript standards for example. Sure, you can’t just copy AS3 code, paste it into a JS file and call it a day, but if you know both languages well, the conversion process isn’t all that painful.

Here a quick example of an original source file written in AS3 for Flash, and below it, the JavaScript counterpart.

public final class EZ_PlayerData {
  private var mvo_dailyScores:Vector.<BJ_DailyScoresData>;
  private var mvo_cardsData:Vector.<EZ_PlayerCardsData>;
  private var mn_betValue:Number;
  private var mn_credits:Number;
  private var mu_selectedHandIndex:uint;
  private var mn_tournamentCredits:Number;
  private var mb_isTournamentEnabled:Boolean;
  
  ////////////////////////////////////////////////////////////////////
  // ctor
  public function EZ_PlayerData(u_maxHands:uint, u_maxCardsPerHand:uint) {
    super();
    
    mn_betValue = mn_credits = mn_tournamentCredits = 0;
    mvo_dailyScores = new Vector.<BJ_DailyScoresData>();
    
    mvo_cardsData = new Vector.<EZ_PlayerCardsData>(u_maxHands);
    for (var u_index:uint = 0; u_index < u_maxHands; u_index++) {
      mvo_cardsData[u_index] = new EZ_PlayerCardsData(u_index, u_maxCardsPerHand);
    }
  }
  
  ////////////////////////////////////////////////////////////////////
  // public functions
  
  //==================================================================
  // addDailyScore
  //==================================================================
  public function addDailyScore(o_score:BJ_DailyScoresData):void {
    if (!o_score) {
      return;
    }
    
    mvo_dailyScores.push(o_score);
    mvo_dailyScores.sort(onSortDailyScores);
  }
  
  //==================================================================
  // betValue (get)
  //==================================================================
  public function get betValue():Number {
    return(mn_betValue);
  }
  
  //==================================================================
  // betValue (set)
  //==================================================================
  public function set betValue(n_value:Number):void {
    if (!isNaN(n_value)) {
      mn_betValue = n_value;
    }
  }
  
  //==================================================================
  // cardsData (get)
  //==================================================================
  public function get cardsData():Vector.<EZ_PlayerCardsData> {
    return(mvo_cardsData);
  }
  
  //==================================================================
  // credits (get)
  //==================================================================
  public function get credits():Number {
    return(mn_credits);
  }
  
  //==================================================================
  // credits (set)
  //==================================================================
  public function set credits(n_value:Number):void {
    if (!isNaN(n_value)) {
      mn_credits = n_value;
    }
  }
  
  //==================================================================
  // getDailyScores
  //==================================================================
  public function getDailyScores():Vector.<BJ_DailyScoresData> {
    return(mvo_dailyScores);
  }
  
  //==================================================================
  // isTournamentEnabled (get)
  //==================================================================
  public function get isTournamentEnabled():Boolean {
    return(mb_isTournamentEnabled);
  }
  
  //==================================================================
  // isTournamentEnabled (set)
  //==================================================================
  public function set isTournamentEnabled(b_value:Boolean):void {
    mb_isTournamentEnabled = b_value;
  }
  
  //==================================================================
  // removeLastDailyScore
  //==================================================================
  public function removeLastDailyScore():BJ_DailyScoresData {
    return(mvo_dailyScores.pop());
  }
  
  //==================================================================
  // selectedHandIndex (get)
  //==================================================================
  public function get selectedHandIndex():uint {
    return(mu_selectedHandIndex);
  }
  
  //==================================================================
  // selectedHandIndex (set)
  //==================================================================
  public function set selectedHandIndex(u_value:uint):void {
    mu_selectedHandIndex = u_value;
  }
  
  //==================================================================
  // tournamentCredits (get)
  //==================================================================
  public function get tournamentCredits():Number {
    return(mn_tournamentCredits);
  }
  
  //==================================================================
  // tournamentCredits (set)
  //==================================================================
  public function set tournamentCredits(n_value:Number):void {
    if (!isNaN(n_value)) {
      mn_tournamentCredits = n_value;
    }
  }
  
  ////////////////////////////////////////////////////////////////////
  // private functions
  
  //==================================================================
  // onSortDailyScores
  //==================================================================
  private function onSortDailyScores(o_score1:BJ_DailyScoresData, o_score2:BJ_DailyScoresData):Number {
    if (o_score1.score >= o_score2.score) {
      return( -1);
    }
    
    return(1);
  }
}

And here is the corresponding JavaScript code:

(function(global) {
  global.Multiplay = global.Multiplay || {};
  Multiplay.PlayerData = Multiplay.PlayerData || {};
  
  //===========================================================================================
  //"public"
  
  //-------------------------------------------------------------------------------------------
  //ctor
  //-------------------------------------------------------------------------------------------
  Multiplay.PlayerData = function(u_maxHands, u_maxCardsPerHand) {
    this.dailyScores = [];
    this.betValue = 0;
    this.credits = 0;
    this.selectedHandIndex = 0;
    this.tournamentCredits = 0;
    this.isTournamentEnabled = false;
    
    this.cardsData = [];
    for (var u_index = 0; u_index < u_maxHands; u_index++) {
      this.cardsData.push(new Multiplay.PlayerCardsData(u_index, u_maxCardsPerHand));
    }
  };
  
  //-------------------------------------------------------------------------------------------
  //addDailyScore
  //-------------------------------------------------------------------------------------------
  Multiplay.PlayerData.prototype.addDailyScore = function(dailyScoreData) {
    if (!dailyScoreData) {
      return;
    }
    
    this.dailyScores.push(dailyScoreData);
    this.dailyScores.sort(this._onSortDailyScores);
  };
  
  //-------------------------------------------------------------------------------------------
  //removeLastDailyScore
  //-------------------------------------------------------------------------------------------
  Multiplay.PlayerData.prototype.removeLastDailyScore = function() {
    return(this.dailyScores.pop());
  };
  
  //===========================================================================================
  //"private"
  
  //-------------------------------------------------------------------------------------------
  //_onSortDailyScores
  //-------------------------------------------------------------------------------------------
  Multiplay.PlayerData.prototype._onSortDailyScores = function(score1, score2) {
    if (score1.score >= score2.score) {
      return( -1);
    }
    
    return(1);
  };
})(window);

AS3 takes the usual object oriented programming approach with classes, by defining an actual ‘class’, its constructor, and added properties and methods onto that class.

JavaScript uses protoypes, and a function of the same name as the “class” acts like a constructor. You then add functions onto the prototype which act like the class’s methods.

Due to the absence of public getter/setter properties, the JavaScript file turned out to be way shorter than the original ActionScript. However, you have to be careful when accessing members of the Multiplay.PlayerData prototype, that you don’t accidentally modify a member intended to be treated as private. In JavaScript, I precede such functions and members with an underscore ( _ ).

Throughout the conversion process, I highly recommend that you constantly test the code in small updates to ensure that the code is working as expected (much like you would when building any game, but especially here). I convert AS3 classes as few as possible at a time, then re-test for errors.

How Phaser Editor Helps

Other than the aforementioned benefits of using a WSYIWYG editor, Phaser Editor also allows you to write custom code in the same files that it creates with its canvas compiler.

In most cases, I prefer to keep the UI code separate from logic/business/implementation code, adapting some concepts from Model View Controller design pattern. This makes it easier for me to convert classes from AS3 to JS, since the UI and logic code will be implemented different in the two scripting languages.

That said, in the files generated by the Phaser Editor canvas compiler, I can add an “initialization” method call the editor’s User Code section, and from there, set up all the UI objects that were created on the canvas.

This one line is the only one I write in the Create tab of the User Code dialog. I prefer to keep code in here minimal and focus on write what the _init does in the user code section of the canvas JS file. Phaser Editor will reserve areas of the JS file as user code for you, and the code there will not be overwritten the next time you save the canvas layout (which will cause the canvas compiler to update the corresponding JS file, overwriting any unsaved changes – make sure you always save your JS file first before going saving new changes in the editor’s canvas!)

In the “user code here” section of the JS file (marked by Phaser Editor in a commented at the bottom of the file), I defined an empty _init function. This is where you can custom setup any UI objects, and we’ll be revisiting this later.

GameView.prototype._init = function () {
};
Converting a Button

Next, say I want to create (or “re-create”, as we’re rebuilding the original Flash layout 😉 ) a button on the canvas named btnBet1 (from the casino cards game I’m converting for my client). Because I also have the field property set to true, the canvas compiler will create a property on the JavaScript file of the corresponding canvas called fBtnBet1. I also have the callback property set to a method on this instance of the canvas object this._onBet1Pressed. In my user code, I can define the _onBet1Pressed function. You’ll also want to add the button frames for over, out, down, and up so your button can respond to the various button states.

The canvas file is actually a Phaser state, and the canvas compiler will automatically generate the following code in the state’s create method:

var _btnBet1 = this.add.button(931.0, 753.0, 'some_atlas', this._onBet1Pressed, this, 'bet_up_1_over', 'bet_up_1_norm', 'bet_up_1_over', 'bet_up_1_over', _buttons);
...
this.fBtnBet1 = _btnBet1;

In the user code section of the JS file, I can create the button pressed callback function like this:

GameView.prototype._onBet1Pressed = function () {
};

It’s similar to a MouseEvent handler from ActionScript 3 when setting up a button to respond to mouse clicks.

Keeping the UI code and implementation code separate, I won’t include what the button actually does inside this method. Instead, I’ll have it dispatch a notification, via a Phase Signal. I treat the signal is treated as a public property of the canvas object, and I define the signal in the _init method created earlier:

GameView.prototype._init = function () {
  this.onBetButtonPressed = new Phaser.Signal();
};

When the button is pressed, I want that signal to fire a notification to be handled by the implementation code. Modifying the _onBet1Pressed function, it now looks like this:

GameView.prototype._onBet1Pressed = function () {
  this.onBetButtonPressed.dispatch();
};

There is no logic code in this canvas JS file, since it’s for UI only. The implementation is handled by the code that processes the game logic. First, it assigns a function to be handled by the signal when it dispatches a notification:

var gameView;
...
gameView.onBetButtonPressed.add(function() {
  //do whatever when the button is pressed
});

Instead of inlining the function, you can also pass in a function reference:

gameView.onBetButtonPressed.add(onBetBtnPressed);
...
function onBetBtnPressed() {
  //do whatever when the button is pressed
}

That’s pretty much how all the buttons will be converted.

Converting Fonts

Fonts is a big one. In Flash, you can embed fonts directly into the SWF file to make sure that the fonts will show up, even if the fonts aren’t installed on the end users’ machines. However, you can’t do this with HTML5. Instead, you have to either use web fonts something like this, or you can use bitmap fonts. Phaser Editor can not show all the fonts installed on your system. A quick excerpt from this page about fonts in Phaser Editor:

Phaser Editor uses JavaFX to render the scenes but Phaser uses the browser for the same purpose. This means that in some cases the text object is not rendered in design-time like Phaser renders it at run-time.

Note that Phaser Editor can use the fonts installed in the OS, but the majority of them are not available in all platforms, so we recommend to use safe fonts or load the font files in the CSS of your game.

I decided to go with using Bitmap fonts. Phaser Editor also supports bitmap fonts. This means, I have to create a texture atlas and corresponding XML for all the fonts I want to use. There are a few tools out there for this task:

For this project, I went with the Generator. While it’s not as powerful as Littera in terms of customizations, because it supports font formats other than only True Type. And this game does use some True Type fonts, and I want to be as faithful to the original implementation as possible.

A quick note on using the Generator. When it creates your text image atlas, you’ll also get a .FNT data file. This is the XML file that Phaser (and Phaser Editor) uses when setting up bitmap fonts. You can simply rename the extension from FNT to XML, and you should be good.

That’s the jist of what I’ve done, and so far, I’m not running into any major hurdles. It’s just a detailed process, and you should convert and test in small increments. I may write future updates to this if I encounter anything that warrants an article. I’m thinking timeline animations, but because I didn’t use any in this game, I don’t expect any issues there.

That’s all for now guys. Thanks, and I’ll talk to you next time. Take care!

– C. out.

Added Brickout Game To GitHub

Hey guys,

The source code for one of the earlier games I created, Brickout, is now available on GitHub here. If you’re interested in looking at games under the hood, have a look!

Screenshot of Brickout.

This game is the first completed game using HTML5 + Phaser. To build the level, I used Tiled. I found level graphics on OpenGameArt from Matriax.

The bomb explosion animation was also on OpenGameArt, by Jetrel.

Meanwhile, I’m working on some new 2D games, made in either Phaser or Unity, so there’s more to come!

Like this:

The image above is a screenshot for a Unity game I’m currently working on. This is from the course on Udemy: Complete C# Unity Developer 2D: Learn to Code Making Games.

It’s the last project in the course (I’m almost done! YEAH! 💪🏿) , and it’s a tile-based, 2D, side-scrolling platformer, one of my favorite game genres, and I can’t wait to use all the skills I’ve learned in this course (and outside of it), to really go beyond the course material, and finish it! Though it’s gonna take me a while (AS IT SHOULD), because I have a lot planned for this game.

If I may digress for a moment: Speaking of finishing things, if you’re like me, and you find it challenging to sometimes finish your side projects, watch the following video.


John Sonmez talks about how to become a finisher and finish shit.

It’s from John Sonmez, founder of Bulldog Mindset, a company that helps people, particularly software developers, become better, stronger versions of themselves and get more out of life by improving their soft skills, mindset, philosophy, wealth, investing, and relationships. He also wrote a book called Soft Skills. It’s a great read; I invite you to give this book a read.

I’m also working on a simple RPG that will use an Active Time Battle System. I’ve always been a fan of battle systems in RPGs. I’m way more interesting the the working of battle systems than I am in the story lines. ⚔

Ever since I was introduced to the ATBS in Final Fantasy IV (and it was elaborated on in Final Fantasy VI), I’ve always been fascinated by it.

There is so much involved in this type of game, such as inventory, moving around in maps, stats, and the various intricacies involved in building a battle system.

This is a very exciting project, as I’ve never worked on an RPG before. Neither as side project (until now), or a client project – though I’d LOVE to work on a client’s RPG!

By the way, if you’re looking for a coder to help you build a 2D tile-based, single-player RPG, get in touch with me through this contact form, or e-mail me directly at cartrell@gameplaycoder.com. 😉

That’s it for now, guys. Take care,

– C. out.

P.S.: And should I survive all that, let’s not forget about card games, which I’m still considering specializing in. I want to make a battle card system (think collectible card game), that has mechanics similar to Yu-Gi-Oh!. It’s really the automation of the mechanics of this game that fascinate me. This will likely be THE most difficult game I’ve ever worked on, but I’m looking forward to the challenge.

The Android version of Thunderjack! is Now Available in the Google Play Store!

Hey there!

At last, Thunderjack! is finally completed, and its now available for free in the Google Play Store! Hell yeah! 💪🏿

Get Thunderjack! on Google Play

This game started out as a side project from the Android Basics Nanodegree course that I took, offered by Udacity. I got into the Nanodegree course (which I did complete, by the way) as qualifying recipient of their Grow with Google Scholarship challenge, and I made this game on the side while taking the course.

This is the main game screen as shown on an Android device.

After several months of hard work, I finally reached a point where I felt comfortable (somewhat, haha) putting out out there, so we have Thunderjack!, which is, as you know from my HTML5+Phaser version, my take on Blackjack.

Also, if you’re into code, and want to look, the project is open source, and you can find its repo on GitHub here.

I invite you to head on over to the Google Play store, give Thunderjack! a try, and let me know know how your experience was!

That’s it for now. Thanks for stopping by, and take care,

– C. out.

7 Tips on How to Hire A Freelance Game Coder To Help You Create A Small Game

So, you have an idea for a game you want to make. You want to bring it to life. And you’ve decided on hiring a freelancer developer. You know that, in order for the project to be finished, you’ll need to bring a game coder on board to write the code.

In this article, I’ll go over seven suggestions you can use when looking for a coder, and how to help your game coder help you complete your game.

But before I get into those seven tips, let’s figure out: what is a game programmer?

Image by StockSnap on Pixabay

This is the person who creates the functionality of the game to make it work. They write the code that allows the game to do everything from displaying characters and objects on the screen, moving them around, playing music and sound effects, presenting messages to the player, or allowing the game to handle keyboard, mouse, or touch, among many other things. The programmer is the one who makes the game do things. They often are the glue, combining the work and talents of the artist, music, and game designer, into fully functional game to be played and enjoyed by (millions of?) people.

Note that the game programmer, or coder, is different from the game designer. The designer is the person who comes up with the concept and idea for the game. The designer focuses on what the game is about, its theme, how the graphics should look, what type of sounds, and how it should respond to what the player does. The designer and programmer often work together, with the designer sending specifications over to the programmer as to how these various aspects of the game should function.

This article is not about game design, but you can check this out for more information on it. Instead, it’ll focuses on helping you hire a programmer to help you with your game, and to help ensure that you and the programmer are a good fit for each other. This article will also cover, on a high level, some explanations the more technical aspects of building a game. Don’t worry, you won’t get overwhelmed with any code here. (:

The topics up for discussion are:

  1. Be clear about the kind of game you want
  2. Make sure your programmer is qualified
  3. Make sure your programmer is interested
  4. Know which platforms on which you want to release your game
  5. Have graphics ready
  6. Managing your project
  7. Budget and project scope

Let’s get started, shall we? (:

1 – Be Clear About The Kind Of Game You Want

While you don’t need a hefty game design document to build a small game, you should still have a good idea about the kind of game you want to build will really help your programmer out. Having lighter documentation to help your programmer out will go a long way.

More often than not, programmers are not the best game designers. More often than not, their game design skills suck balls. That said, keep these three points in mind when looking for a programmer:

  • a) Don’t rely on your programmer to come up with the game idea
  • b) Decide on which graphics to use
  • c) What type of experience should the game present to the player?

Let’s go over these three points:

a) Don’t rely on your programmer to come up with the game idea

It’s up to you to provide your programmer with clear details about what your game is about and how it should function. Your programmer can’t read your mind. If you have a very industry-specific game (for example you’re in the casino gaming industry), don’t assume or in some cases, expect, your programmer to be familiar with all the lingo and rules of the game you are creating.

You may find that you need to break down the rules. Teaching a skill to others is often considered one of the best way to learn something, as this can reveal potential gotchas in your own logic of the game’s design. (Or your programmer may ask you a “what if this happened in the game?” type of question that reveal something you hadn’t considered.) Although you understand the game’s rules effortlessly, breaking them down into steps to be implemented into a game can prove to be a bit of a challenge, especially if you’re new to making games.

b) Decide on which graphics

There are two systems for graphics: 2D or 3D. There are programmers who make both, or who specialize in only one or the other. It would be of a great help to your programmer if you know which type of graphics you’re looking for.

Again, programmers are typically not the best ones for this task. You’ll really want to bring in an artist for this. A few sources where you can find talented artists on freelance sites like Upwork or Fiverr .

c) What type of experience should the game present to the player?

What kind of game are you making? Is it an action or arcade game? Something more casual like a puzzle? An educational game? Or maybe a card game like Thunderjack! ? Sorry, couldn’t resist. (:

How many players are in your game? Is it a single-player, meaning, only one player plays your game? Or is it multi-player, meaning several people can play your game all at once, interacting with each other, in real-time? Very important for your programmer to know, because a multi-player game is much more difficult to develop than a single-player one, takes longer, costs more, and not not all programmers specialize in multi-player game development.

What is the aim of your game? Think about the reasons why you play games, and what draws you to play certain ones over others.

2 – Make Sure Your Programmer Is Qualified

This one goes without saying, but you want to make sure your programmer can do the job that you’re hiring him or her for: to write the code for your game. With freelance sites like Upwork, you can look up the skills that various programmer have, jobs they’ve done in the past, and even their portfolio if they have one (they should, unless they’re just starting out). If you already know which technology platform (which we’ll cover later in this article) or programming language, you can ask for samples specific to those areas.

You want to make sure they are a FINISHER. That they can stick with the project until it is finished, and won’t abandon midway through. You can ask them for games that they’ve finished. If you have good social skills and are adapt at reading people through their voice, you can get them on the phone for a voice call. You can listen to how they talk and see if they sound confident.


Be a finisher! (Image provided by Sarah Williams)

Make sure your programmer is a team player. Many programmers realize that they are the “glue” behind a game project, and they let that go to their heads. You want someone who communicates with other team players respectfully, asks for help when they need it, and are willing to help others on the team.

3 – Make Sure Your Programmer Is Interested

In addition to a qualified programmer, you want to have a programmer who takes a genuine interest in what you’re trying to accomplish, and is not in it just for the money.

Someone who enjoys the work they’re doing will more often go an extra mile to improve the qualify of the game.

Image by 470906 on Pixabay

You can always view a programmer’s past projects to get a feel for what they’ve made. Especially for freelancers, who have more control over the type of work that take on. If you see that a programmer makes lots of retro arcade like games for web, and you present them a simple 2D casual puzzle game, or a hyper-casual game that runs on mobile, they may not be interested. Of course, it never hurts to ask. 😉

4 – Know Which Platforms On Which You Want To Release Your Game

There are many platforms on which you can release your game. What I mean the by “platform” is the technology or device(s) on which your game will run. We’ll be talking about these four major platforms:

  • Web browser
  • Mobile
  • Desktop/PC
  • Console

Not all programmers will specialize in these platforms. On a side note, I recommend starting with one platform, and if your game is successful and applicable, then you can target other platforms.

You may find one platform to suit your needs over others. I’ll go over some pros and cons of each one.

Web browser

Your game runs in a web browser. If you’re going this route, this is often the easiest for players to get started with your game, because there is nothing for them to download and install. Popular web browsers ones include Mozilla Firefox, Google Chrome, and Safari.

Games that run in the web browser are often made using HTML5, and a common library that your programmer may use for this is Phaser. Phaser is by no means the only one out there, but it’s my library of choice for HTML5 games. Phaser makes it easy to get a some simple graphics up and running on the screen.

Plug for Richard Davey and his Phaser library.
Pros of a web browser game

Instantly available: The biggest pro of a web browser game, in my opinion, is ease of access. You can appeal to people’s need of instant gratification by providing them with a game they don’t need to install; they can begin playing right away. There are basically three technologies that your game can run on when in a web browser: HTML5 Canvas, OpenGL WebGL, or SVG, with the first two being the more popular.

Easier requirements: Because the game runs in a browser, all your player needs is just that: a web browser. The hardware requirements of a browser are less that those of a PC.

Cons of a web browser game

Performance This can be a double-edged sword, especially if you’re planning to build your game for web mobile, it may take a performance hit.

I won’t go deep into details, but while WebGL is more powerful than Canvas. While WebGL often works great on PCs, it has minimal support on mobile. Many devices don’t support WebGL at all. On the other hand, Canvas has a wider range of support, including mobile, but performance on mobile isn’t nearly as good as on PCs. If you want to build a mobile game, I’d suggest making a native mobile app, and putting it on the Google Play Store (for Android) and/or the App Store (for iOS). A native mobile game app can perform on a mobile device much better than a hybrid web game mobile app.

This post on Game Development Stack Exchange sums it up nicely in layman’s terms.

There is also Adobe *cough*Flash*cough*, which was the ABSOLUTE KING back in the 2000s. Was being the key word. You see, but unfortunately, Adobe is ending support for Flash by end of 2020. So, sadly, I’d no longer consider Flash an option (though I’ve made over 50 Flash games for clients, and had two of my own games sponsored back when Flash game sponsorships were a thing! ^_^ ).

Mobile

With mobile internet traffic occupying almost half of the world’s global online traffic as of 2018 (approximately 48.2%), mobile has become a very popular choice for game developers. According a report by Sensor Tower, in 2016, 20,958 games apps were released in MAY ALONE, and stats like these don’t seem to be slowing down anytime soon.

Games just blew all the other categories out of the water. Reminds me of Super Mario 3 when it first came out. I mean the lead was so high it was ridiculous.

Before I go any further, let me define what I consider “mobile” here. There are two big players: Android (made by Google), and iOS (made by Apple). And there are also phones and tablets. So, when I say “mobile”, I’m talking about these:

  • Android phone
  • Android tablet
  • iOS phone
  • iOS tablet

You should have an idea of which mobile platform you want to support, which orientation, and if your game will be for phones and/or tablets. Don’t just tell your programmer (or your designer for that matter), “I want to make a mobile game”. You’ll need to be a little more specific than that. 😉

That said, let’s get into the pros and cons of mobile.

Pros of a mobile game

Exposure: With everyone on their phones now, game developers left and right are jumping on the mobile bandwagon, and have been for years. With it’s relatively low barrier to entry (much more so for Android than iOS in my opinion), and game dev tools now offering cross-platform support, it doesn’t take much to get an app up and running on a mobile device.

Cons of a mobile game

Oversaturation: The mobile market is extremely saturated, and can be very hard to stand out among all the noise. You have to have a very good game to stand out.

Different screen sizes and orientations: You see, with mobile, there are lots of devices with different screen sizes. This is typically not a problem on web games, and to a lesser degree, not a problem on PCs. However, you can’t just make a mobile game and expect it to look the same across all mobile devices, unless you’re targeting a very type of device, which is usually not the case.

Here’s an image of what the two orientations look like:

Image by GR8DAN – https://openclipart.org/detail/168418/portrait-v-landscape-device-orientation, https://commons.wikimedia.org/w/index.php?curid=70072698, used under license CC0

In addition to various screen sizes, you can hold your phone or tablet on of two ways: portrait (the tall way, much like a phone); or landscape (the wide way, much like a wide screen TV). You may have noticed that many apps will only display in one orientation or the other. But, if your game should support both, then you’ll need to have your designer build separate layouts for each. Sometimes, this can mean re-locating various elements on the screen, or removing them altogether. In my opinion, it’s best to support only one orientation or the other for the entire game session.

You may find that, especially on phones, your user interface is very tiny and hard to see, or buttons may be hard to press. Also, you may find white space along the left and right sides, or top and bottom of your app, or even worse, essential parts of the game screen are cut out of view on some devices (but look find on others).

To rectify this and make the most of your screen real estate, you may have to build what’s called a responsive layout, which is one that adapts to the screen size of whatever device the app’s running one. This is because devices have different aspect ratios, and some can show more content length-wise or width-wise than others.

While a good programmer should understand these terms, and also be working with either you or a designer to decide how the game’s visual elements will fit into the game.

Fragmentation: As it pertains to mobile, fragmentation is the concept of having multiple versions of a mobile OS in service. People use various version of Android and iOS devices alike. While not as big a problem on iOS as it is on Android, this may or may not be an issue for your game.

What I mean is, certain features and functions of a particular OS may not be available on earlier versions of the OS. Also, not everyone has the latest and greatest version of Android, as older versions take up more of the market share than newer ones. While this exists on iOS as well, it’s not as widespread.

Getting into the mobile stores: Okay, okay, I did mention before that it doesn’t take much to get an app running on a device. However, getting the app into its corresponding app store (Google Play for Android, and the App Store for iOS) is another story, especially for iOS.

It’s a bit easier to get an Android app into Google Play. You do need a to sign up for a developer account, review the distribution rules and guidelines, and pay a $25 registration fee. But, if you want to build and test an game on an Android device, you can do this without setting up the account; the account is only required when you are ready to upload your app to the App Store. When testing the app, the programmer can simply forward you the APK (the file extension for Android apps) file, and you can sideload it onto your device.

However, with iOS, it’s not so simple.

You can’t even test or install the app on a device until you’ve set up an account on Apple’s Developer Program. And it costs $99/year. Yes, you heard right, it’s a recurring subscription. On top of that, in order to test the app, you’ll need to have a Mac OS to do this.

Note: The only way to upload your app even for testing is to use Xcode or Application Loader.

I’m a Windows guy; I don’t own a Mac, nor do I intend on buying one anytime soon. However, I’ve still managed to upload apps to the app store for clients by using a service called MacinCloud, which allows you remote access to an actual Mac OS in their cloud. Use of a Mac makes it waaaaay easier than trying to do it from Windows.

Because I use Adobe AIR to target iOS, not Xcode, I can use Application Loader to upload the IPS file (the file extension for an iOS app) to the App Store Connect, which from there, you can distribute the build to other team members to test, or submit to the app store for approval.

Finally, Apple’s submission process is, in my experience and opinion of course, a bit more strict than Android’s. It’s not uncommon for Apple to reject a submission for a myriad of reasons. Some, in fairness, could be simple oversights on your part, but other reasons are just plain ridiculous.

But hey, it’s their platform, they’re the gatekeepers, and if we want out games on iOS, we have to play by their rules, whether we like ’em or not.

Desktop / Personal Computer (PC)

Sometimes called “desktop”, but can include laptops as well, your game is designed to run as a stand alone application on a PC. If going this route, some operating systems to consider are Microsoft Windows, Mac OS, and Linux.

Pros of a desktop game

Distribution: You may end up putting your game on Steam, which is a distribution platform where you sell directly to the customer. Steam has made it relatively easy for developers to get their game onto their marketplace.

Performance: Nothing kills a game experience faster than a slow or laggy game. When compared to say, a web game, a game running as an app directly on a desktop machine will be able to take advantage of the computer’s hardware better than its web counterpart. A smoother, faster running game, will create a better experience for your player. But performance is one of those aspects that they typical gamer won’t notice when it’s there, but will notice when it’s not there.

Cons of a desktop game

High saturation: Again, with Steam, a low barrier to entry results in an over-flooded market. This means more competition for your game, especially considering much of the competition is from lower-quality games. You’d have to make a really good game, which again, is why good game design is so important.

Fragmentation: If you’re making a desktop game, fragmentation may be an issue. While cross-platform development is common nowadays, and there are tools like Unity to bride the gap, you may still encounter issues in the game that appear only on one operating system (or different versions of the same operating system), but not on others.

Distribution: Unless you have your own system for distributing your games, this may be a challenge for you. Steam seems to have become de facto standard for digital distribution of PC games.

However, there are other places you can distribute your game. If you’d like more, have a look at this article, Other Than Steam: 7 Game Distribution Alternatives. Some of them apply to mobile only, but there some that are suitable for PC game distribution.

Console

Like desktop, console game development is not my specialty, so I’ll briefly go over pros and cons of a console game here. Today’s console gaming systems (at the time of this article) include: PS4, Xbox One, Wii U, PS3, Wii, and the Xbox 360.

Pros of a console game

Exposure: Much like Steam, there is a potential for exposure as Microsoft, Sony, and Nintendo all have their own distribution platforms.

Cons of a console game

Development time and costs for a console game are much higher than those for web, PC or mobile. Unlike those, the barrier to entry is a bit higher as the top AAA companies have higher standards.

5 – Have Graphics Ready (or Coming)

Whew! Section 4 of knowing which platform you want to target was a big one, and if you went through all that, congrats on still reading this far! 💪🏿

If you really want a happy programmer on your hands, unless they have a talent and desire for creating the game’s art, do not, and I repeat, do not rely on him or her to create the art for your game.

This task belongs to the artist or graphic designer. He or she can create custom graphics and animations for your game. Everything from button images, to headers, banners, backgrounds, characters, dialog windows, and more. They’ll even have make better choices than the programmer on color schemes, and which fonts to use to fit the theme of the game.

Image by DavidRockDesign on Pixabay.

It’s not uncommon for the programmer and the artist to work together while you can keep the project on track with proper management. If you’ve been clear about the type of game you want, and your team understands what kind of game you’re building, they can often complete milestones with little to no intervention on your part. You may not hear from them until an update is ready, though you should be touching base with them at least once or twice a week, just to keep everything on track.

6 – Managing Your Project

Other than you, if your team has other members besides just the programmer (and it really should!), do not depend on him/her to manage the project, and stay on track. If you want to get really savvy, you can use a project management tool. There are free ones, like Trello. If Trello isn’t your thing, there are several other free alternatives out there. Note that your programmer may or may not be familiar with them. I took time out to learn Trello, which I find to be very helpful with its Kanban-like functionality.

Example of a Kanban board by Dr ian mitchell

7 – Budget And Project Scope

This is the last topic I’ll cover in hiring a programmer. Budgeting can be a tricky one, but make no mistake, developing a game is not an inexpensive endeavor. A game can cost anywhere from $2000 (for a low-quality game) to tens of thousands of dollars (for ambitions games with several people working on a team).

The cost of the programmer could easily be the largest investment for your project. Programmers in the U.S., Australia can charge well over $50/hr for hourly projects, and your project can take months to complete. (Though price-per-project may be more common among experienced game programmers.) Please have a look at this article for cost of freelance mobile app developers, for example.

My advice is to not automatically go for the cheapest option. As the saying goes, “you get what you pay for”. Going for the cheapest option will likely not return you the best experience in building your game, and you may end up with a unqualified programmer, either in technical skill, soft skills, or work ethic.

About project scope: This is related to knowing what you want from your game. As your programmer sends your small, iterative game updates (he/she should!), you may want to start adding more features that weren’t originally discussed. Unless these can be worked into the current contract, and the budget adjusted, avoid doing this. In fact, I’d avoid this unless it’s absolutely necessary.

Now, this is different from correcting issues that may arise along the way, as issues will come up. But if you keep inundating your programmer with more changes every other update, or when the project is almost finished, and you decide at change a bunch of things at the eleventh hour, this will frustrate your programmer to no end.

Not only do they want to finish the game project, but often times, additional requests don’t always fit in well with the current game’s build. Meaning, they may have to tear down, and re-code various parts of the game to make your new changes work, because they weren’t in the original scope of work.

Feature creep has been the death of many gaming projects, and can easily kill off your project if you’re not careful.

Image by Rosenfeld Media license CC BY 2.0

Well, that’s about all I have on this topic, as I’ve covered quite a bit of what you should consider when hiring a game programmer. These are some general guidelines that you can follow. You don’t to have every single I dotted and T crossed, but a competent programmer can help you in some of these other areas. Just remember that their primary job is to write code, and if you keep that in mind you’ll be fine.

And finally, if you’re looking to hire a game programmer to help you build your next 2D, single-player game for web or Android, or if you have a specific 2D, single- or mulit-player card game you want to build, then you’ve come to the right place! Get in touch with me by e-mailing me directly at cartrell@gameplaycoder.com, or by contacting me here. Thanks!

– C. out.

Featured image by geralt on Pixabay.

Thunderjack! HTML5 Game: Project Now Available on GitHub!

What’s up 💪🏿

The project source code and assets for the HTML5/Phaser version of Thunderjack! are now available on my GitHub account!

You can check out the repo here.

If you want to use the project, you’ll also need the following tools:

Choosing An Open Source License

It’s come to my attention that it’s a good idea to include a license to your open source projects. A site called ChooseALicense.com lists the common licenses and what they are suited for. I particularly like the breakdown of these licenses here. The MIT License looks like the best fit for Thunderjack!.

If you’d rather play the game instead, you can check it out here.

Finally, if you’re looking for a card game programmer to help you on your next card game project, let’s connect! You can e-mail me directly at cartrell@gameplaycoder.com, or you can send a request on my contact page. You can also fine here on LinkedIn.

That’s all for now guys. Take care,

– C. out.

Featured image provided by Alex Prunici, under license Attribution 3.0 Unported (CC BY 3.0).

Thunderjack! HTML5 Game Update: A Few More Adjustments

Hey, what’s up!

Ok, I can’t believe I uploaded the game without addressing these few functions! Ha! I guess I was so excited (:
Anyway, here’s what’s “new”:

  • You can no longer start a round without placing a bet (doh!)
  • Dealer’s second card is hidden until it’s the dealer’s turn (I had his hand fully revealed while testing and forgot to hide its second card)
  • Added self-promotion on intro screen (of course!)

I’ve also been exploring minifiying JavaScript files and combining them into one file, and found UglifyJS.

UglifyJS can be run as a command-line tool, and it can accept a list of all the files you want to combine. I tried combining the Phaser JS file, but was having problems. So I ended up combining only my own source files, as well as the files generated by the Phaser Editor canvas compiler.

On the page that hosts the game, it no longer loads a bunch of JS files (currently 44 files), but just two files: the Phaser source file, and a minified Thunderjack! source file.

You can play the game here.

That’s all for now guys. Take care.

– C. out.

Thunderjack! HTML5 Game Update: A Little More Polish

Hey there.

I made some more adjustments to the Thunderjack! card game.

The updates include:

  • Sound effects
  • The Thunderjack! effect (lightning + thunder sound + screen flash + screen tremor)
  • Added a preloader
  • Cleaned up text visuals (use of BitmapText)
  • Cleaned up loading (some assets were being loaded twice from various Phaser state files per Phaser Editor. After studying the editor a bit, I may write an article about setting up assets in pack files, and a basic understanding as to how Phaser accomplishes this. )

I’ll be making one more change to the game: How to minify the JavaScript code. Currently, all the JS files are being loaded individually. Although most are small (less than 10 KB), there are quite a few files, and it causes the web browser to make many HTTP requests to the server.

By having files “minified”, it combines several JS files into a single one (and can optionally compress and/or mangle the files’ contents), reducing load times, and number of requests. I’ve been looking at tools like UglifyJS, which is also caused me to look at tools like Node.js ( https://nodejs.org/en/ ) and npm … Looks like I’m going down the damn rabbit hole whether I want to or not! 😏

And I’m not done with card games, especially consider how many I’ve made for a client, Squarejack Gaming.

Also, not only will I get into not more traditional type of card games, but also other non-gambling relatively simple ones, like Concentration (Match). Even a battle card game may be in the works later down the road.

And I’ll really be going deep when I start adding multi-player aspect to these games. Lots of exciting things ahead!

So, go ahead and give have some fun playing Thunderkjack!. 👍🏿

Finally, if you’d like me to code your next card game, please get in touch with me at cartrell@gameplaycoder.com.

That’s all for now. Talk to you later, guys. Take care.

– C. out.

Thunderjack! HTML5 Game Update: Done!

Hey there!

I’ve some exciting news!

Thunderjack! is finally ready for you to try out!

I’ve still some adjustments to make to it (like add the damn preloader display), but it’s 99% done at this point.

You can play the game here. Try it out and let me know your experience in the comments below.

And if you’d like me to code your next card game, please get in touch with me at cartrell@gameplaycoder.com.

Thanks guys, talk to you later. Take care.

– C. out.

Thunderjack! HTML5 Game Update: Adding Sound Effects (Yeah!)

Hey there.

Well! At this point, the game play is all done. Woot! 👍🏿

Now, you’ll add sound effects to your game. You should add some sound effects to the game to make it more engaging. In this game, sound effects do not affect the game play itself, which is why we’ve deferred adding them until now. However, this does not mean that the sound effects should be an afterthought. When designing your game, you should have an idea of which events that happen in the game will produce sounds, and what those sounds should be.

That said, we’re going to do a little bit of design work here. First, we want to determine which events will produce sounds. Based on the elements in this game, here are some events that could make sense for adding to this game:

  • Button clicks
  • Player wins (at the end of each round, player won more credits than they spent)
  • Player bust
  • Player gets a Blackjack
  • Player gets a Blitz
  • Player gets a Thunderjack
  • Player doubles down
  • Player splits
  • Player surrenders
  • Dealer busts
  • Player or dealer hits
  • Player or dealer stands
  • Shuffling cards
  • Card is dealt
  • Player adds bet
  • Player clears bet

Note: You can use any sound effects you like for these events. You can also come up with your own events to add sound effects for. This article will not cover adding an event for every single event mentioned above. Once you know who to do it for a few events, you’ll have plenty of opportunities to practice adding sounds for the other events.

In this article, I’ll be assigning sounds only to the following events:

  • Player wins
  • Player busts
  • Player gets a Blackjack
  • Player gets a Thunderjack
  • Dealer busts

After adding a few sounds, you’ll get the gist of how to add sounds to your game.

Well, let’s get started!

Adding Sound Effects To Your Project

After you’ve decided which events that will play sounds, you need to add the sound files to your project. Phaser Editor can handle this. ⭐

Phaser Editor uses an asset pack manifest file that defines all the assets and the keys that Phaser uses to reference them. Instead of writing the code to load each asset, only this asset pack file needs to be loaded. It is a JSON file, and if you’d like to know more about assets management, visit this topic.

For this project, I have a manifest file called pack.json. After you have a pack file added to your project, this line of code is how Phaser loads the pack file:

phaserGame.load.pack('preload', 'assets/pack.json');

You’ll probably want to add that line to the preload function of your preloading game state.

Next, let’s add the sounds to the pack file using the following steps:

  1. Open the pack file in the project explorer by double-clicking on it.
  2. From the Assets window, select the preload folder (or a different section if you’d like to add the assets under a different one).
  3. Press the Add Asset button.
  4. On the Asset Type dialog, button, select audio from the list, then press OK.
  5. In the Audio Selected dialog, select the sounds you want to add to the pack file under the section you selected, then press OK.
  6. Save the pack file.

Note: After adding sounds by default, the key that Phaser Editor assigns to each sound is the name of the sound file. The key is how you will reference the sound in your code so you can play it. If you want, you can change the key of any sound by editing the key text field. If you do, make sure the key is unique to all the other keys.

Finally, if you need to later, you can add more sounds to the audio group later on, or remove sounds that you will not be using.

Now that the sound files have been added to the asset pack file, let’s start using them for some events in the game.

Add the Player Wins Sound

First, we’ll add a sound that plays when you win. “Winning” is defined as winning more credits that you spent during the round.

We’ll return to the endRound function that we last saw here. Make the following edits to it:

endRound
GamePlay.prototype._endRound = function() {
  if (this._dealerData.isBust) {
    this._presentPlayersWinViaDealerBust();
  } else {
    this._compareCards();
  }
  
  this._showBetUi();
  this._playWinSound();
};
playWinSound
GamePlay.prototype._playWinSound = function() {
  if (this._playerData.credits > this._startingCredits) {
    this.game.sound.play("snd_win01_12");
  }
};

The Phaser game object contains a sound property, which is a reference to SoundManager object. The SoundManager has a play function on it, and the first parameter is the asset key for the sound that was loaded.

Note: The snd_win01_12 string is the key of the win sound I used when loading the win sound in to the asset pack file. The key of your win sound will likely be different.

We’ve seen PlayerData.getTotalBet before, but what’s this this._startingCredits property? Hmm… 🤔

Well, we want to compare the number of credits the player has at the end of the round to the number of credits they had at the beginning of the round. The this._startingCredits property will track how many credits they had, just before they started the round (before having their credits deducted).

So, we can define this._startingCredits in our onBetButtonPressed function with this modification:

onBetButtonPressed
GamePlay.prototype._onBetButtonPressed = function() {
  if (!this._canAffordBet()) {
    //can't afford the bet - cancel the bet placing method, and don't start the game.
    return;
  }
  
  this._startingCredits = this._playerData.credits;
  this._payRoundCost();
  this._hideBetUi();
  this._beginRound();
};

That should do it for the win sound. Let’s see how it looks (and sounds like!) so far. The win sound should only play when you’ve won more credits than you spent:

Add The Player And Dealer Busts Sounds

Next, we’ll add a sound that plays each time a player or the dealer busts.

We’ll revisit the beginPlayerBust function, and make the following mods:

GamePlay.prototype._beginPlayerBust(player) {
  player.isBust = true;
  if (this._isPlayerId(s_playerId)) {
    this.game.sound.play("snd_bust");
  } else {
    var as_dealerBustSoundKeys = [ "snd_dealer_bust1", "snd_dealer_bust2" ];
    var s_dealerBustSoundKey = Phaser.ArrayUtils.getRandomItem(as_dealerBustSoundKeys);
    var dealerBustSound = this.game.sound.play(s_dealerBustSoundKey);
    if (dealerBustSound) {
      var f_onSoundStop = function(sound, marker) {
        this._setNextTurnPlayer();
      };
      
      dealerBustSound.onStop.addOnce(f_onSoundStop, this);
      return;
    } else {
      this._setNextTurnPlayer();
    }
  }
};

Added quite a bit to this one! 😅 If the player busts, we just play one sound. But if the DEEEEELUR busts, well, let’s get just a little fancy here. 😎

We’re doing two things here:

First, we’re choosing one of two sounds to play randomly (the dealer will have different busts sounds, just for the hell of it, and we want to stick it to the dealer when they lose).

Second, we want to wait until the sound has finish playing before we continue. Say the dealer busts, and the dealer bust sound plays. Also, say the player also won this game. What would happen is both sounds would be playing together – the dealer bust sound, and the player won sound. This isn’t what we want. So, we’ll wait until the dealer bust sound has completed playing before proceeding.

It’s worth pointing out that the f_onSoundStop variable is a function setup as a callback for the bust sound’s onStop Signal. We register the callback by calling the signal’s addOnce function, and specifying the callback as the first parameter. When the sound finishes playing, the Phaser will automatically call the f_onSoundStop function.

And here are the player and dealer bust sounds in action:

Add Blackjack and Thunderjack Sounds

Next, we’re adding sound effects that play every time a player wins with a Blackjack or a Thunderjack.

Let’s start with the Blackjack first.

Once again, we’ll be revisiting some code. In particular this pseudo code from this article will now be updated to:

var playerWithThunderjack = checkIfPlayerHasThunderjack();
var playersWithBlackjack = checkIfPlayersHaveBlackjacks();
var doesDealerHaveBlackjack = hasBlackjack(dealer);
if playerWithThunderjack {
  handleThunderjack(playerWithThunderjack);
  endRound();
} else {
  if doesDealerHaveBlackjack {
    handleDealerBlackjack();
    endRound();
  } else {
    if at least one player has blackjack {
      //play the blackjack sound here
    }
    setFirstTurnPlayer();
  }
}

The checkIfPlayersHaveBlackjacks will function return an array of all the players who have blackjack, so if this array has at least one player in it, we’re good.

Next, we’ll tackle playing a sound if a player has a Thunderjack.

Coming from the code above, we’ll modify the handleThunderjack function:

handleThunderjack
function handleThunderjack(player) {
  player.handData.hasThunderjack = true;
  //play the thunderjack sound here
}

That’s it for adding the Thunderjack sound! 👍🏿 And here are the sounds in play:

Most of the events are just finding the place in your code where it would seem most appropriate to add a playing sound. Only in special cases would you need to wait for a sound to complete playing before proceeding.

We’ll finish this article here. If you have any questions for me about anything I’ve discussed so far, feel free to ask in the comments below. If you’d like to add more sounds to more events, by all means have at it.

Or, if you’re looking to hire a coder to build your next card game (and add all your desired sounds into the game as well!), get in touch with me by e-mailing me at cartrell@gameplaycoder.com, or filling out my contact form.

Thanks guys, talk to you later. Take care,

– C. out.

How to Create a Blog That Boosts Your Software Development Career

Hey guys.

No updates for Thunderjack! in this post, but they’ll be back soon.

This post, I wanted to take some time to reiterate why I created this website.

I previously mentioned in my article, The “Taking Control Of Your Life” Contract, that I’ve been following John Sonmez for a while now. He is the founder of Simple Programmer, a company that helps software developers improve themselves, both professionally, and personally.

In efforts to improve my career as a freelance gameplay programmer, I found John Sonmez, SP, and his free course on creating a blog. This inspired me to go, “You know what? Fuck it. I’m gonna take the plunge, start start this blog, and see what happens”. 😠

It’s a five-part course that goes over several topics, such as getting set up with web hosting, choosing a theme, coming up with post ideas, and a very important aspect, remaining consistent. The course is split up into sections, and each section contains actionable to-do items that break down the process of getting started.

Staying consistent in keeping your blog updated at some regular interval is so important and is . I’ve made a commitment to one post per week. Occasionally, I can squeeze two in there, but as long as I can post at least once, I’m fine.

At the end of the course, John would like you to share his free course, and talk about it on your blog. Hence this article ✔

If you’re a software developer of any kind, and you do not have a blog, I invite you to consider starting one. A blog can help with improving your job opportunities, get your name out there, and establish yourself as an authority in your area of expertise. It will take time (think years). It won’t be a success overnight, and there are no guarantees that anything will happen.

John has one of many videos about blogging:

Finally, on a side note, John also has a book out called Soft Skills, which is a book that helps you to improve on that that – your soft skills. It covers topis like marketing yourself, learning how to learn, improving your career, productivity, and even fitness, finances, and spiritual balance. While the book is geared towards software developers, anyone can read this book. It’s an awesome book; I highly recommended it.

Well that’s it for this article. Look forward to additional on developing those soft skills.

Thanks for your continued support. I’ll talk to you next time. Take care.

– C. out.