Swift Game development, Part 3

I’m happy to report that although I did not have much time this weekend to devote to game development, I was able to create a new SpriteKit Scene file, lay down a new tile map grid, and position my character sprite in the new level.

level1

The player sprite I made with Aseprite which is a very cheap yet very capable sprite editor.   I had to watch this video on how to make it transparent.  Teach yourself!

Swift Game Development, Part 2, fading a SpriteNode that doesn’t want to fade

Today I learned about the “isPaused” instance property of an SKNode object.   The problem I encountered was that after showing some informational text, such as when your player sprite “talks” to a non-player character (NPC), you want to fade the text out.  The code works fine on iOS, but the MacOS program refused to fade the text.

When you want to programmatically create a sequence of actions for a sprite node to execute, Swift and the SpriteKit provide a plethora of ways to accomplish this.   The easiest way is to create a few SKActions and then chain them together with sequences and finally run them:

        let wait:SKAction = SKAction.wait(forDuration: waitTime)

        let fade:SKAction = SKAction.fadeAlpha(to: 0, duration: 0.5)

        let run:SKAction = SKAction.run {

            self.infoLabel1.text = ""

            self.infoLabel2.text = ""

            self.infoLabel1.alpha = 1

            self.infoLabel2.alpha = 1

            self.speechIcon.alpha = 1

            self.speechIcon.isHidden = true

        }

What I discovered was that the run action was not executing.   After much reading, I found that the isPaused property on both the labels and the parent of the labels was “true”.   Very strange.   I did not find out why the nodes were paused, but when I added a check on the parent to see if it was paused and then toggled it if it was, the “run” sequence was able to execute:

        let seq:SKAction = SKAction.sequence([wait, fade, run])

        let seq2:SKAction = SKAction.sequence([wait, fade])

        if(infoLabel2.parent?.isPaused)! {

            infoLabel2.parent?.isPaused = false   //the fix!

        }

        infoLabel1.run(seq)

        infoLabel2.run(seq2)

        speechIcon.run(seq2)

Thank you Stack Overflow, you’re the best pair programmer ever!        

       

SpriteKit game development – Part 1

spritekit

Here’s a new series that actually began during Christmas holidays of 2017.  I had bought a shiny new MacBook in the Spring of 2017 so that I could get serious about iOS and MacOS development.   I studied several books and online tutorials on Objective-C and a little bit of Swift.  Fast forward to Christmas where I came up with my idea for writing a game that I’ve always been meaning to write.   This would be my third game.   I wrote a C++ game in the 1990s that was left unfinished.   My ambitions were too grand.   Here’s a shot of the gameboard in brilliant VGA.  Yes…DUNE!

just the board

Years passed and the advent of .NET presented a learning opportunity.  I would create a tile based Dungeons and Dragons homage to Ultima III.    I wrote this first in VB.NET with a proxy wrapper into the DirectX 2D Libraries.   I then ported it to C# targeting native DirectX libraries.   Unfortunately I don’t have a screenshot of that game and the libraries are no longer easily available.   I spent a lot of time on it and yet abandoned it as well.

The concept for the new game would be set in the Frank Herbert Dune universe.   I wanted to use the Traveller RPG game rules, with a mixture of Dungeons and Dragon’s Gamma World.   Mixed in would be a dialog based “choose your own adventure” plotline similar to Knights of the Old Republic game for XBox (awesome, awesome game).  I decided to use Apple’s Swift language so that I could learn a new skill and develop my portfolio on GitHub.

So, I studied and completed this course: https://cartoonsmart.com/role-playing-games-with-sprite-kit-and-swift-3-subscriber-access/    I recommend this site.   The tutorial teacher, Justin Dike, has a great sense of humor, easy disposition and very fun set of courses.

After finishing the tutorial, which was about 55 videos about 16-25 minutes each consisting of about an hour a video (watch, pause, write code, test, debug), I was ready to begin.

Using http://www.hacknplan.com to track my issues in a Trello like interface Jira board.  I’m already having to adjust my sprint because I’m behind!   It’s amazing that free resources like this are on the internet.

Using Articy https://www.nevigo.com/en/articydraft/overview/ (available via Steam) to do my storyboarding.   I bought it for $100, which I thought was super cheap.   When I get further along in my game engine I’ll start designing the flow of the game with this pretty impressive application.

I created a GitHub repo and initialized it with the iOS game kit created from the tutorial.  Then I created a develop and a feature branch.   Check it out here:  https://github.com/BacchusPlateau/DuneTraveller

The first step was to convert the iOS project to a MacOS target.  Even though this article used Obj-C (which I studied last year), the directions were applicable to Swift projects, and I was very grateful:  https://www.raywenderlich.com/70837/how-to-port-your-sprite-kit-game-from-ios-to-os-x     That took a few hours to tweak and get the new View (SKView) hooked up to the new build target.

The next step was to comment out all of the UIKit references from the iOS project and retrofit them with mouse and keyboard events.   That’s what I’m currently working on.  It’s difficult translating the iOS touchesBegan and touchesEnded to desktop events.  There isn’t a lot of documentation on desktop SpriteKit game development, but I’m relishing the time spent.

Stay tuned for my next update in the series.

 

Self-disciplined Surfing at Work

I found, given recent political developments, that I get tempted to access news sites, social media sites, and other non-work related websites at work more and more often lately.    I wondered what I could do to force myself to be more disciplined.

One day as I was rigging my hosts file to point to a particular webserver to do some testing, it occurred to me.    I should make it harder for me to access these sites by modifying the hosts file for this purpose!

What is a hosts file?   If you’re a computer newbie this might be a revelation to you.   The hosts file is a legacy system that has plenty of useful applications in today’s networked world.    I won’t go into them here, but for the purposes of this post, we want to edit the contents of the file.   On most computers, you will need elevated access (Administrator on Windows, root on MacOS) to save changes to this file.

The location of this file on Windows is in the \Windows\system32\drivers\etc folder.   It’s named “hosts” without a file extension.   This follows the UNIX convention, although years ago it was “hosts.txt”.

Normally this file is almost empty but usually has the “loopback” address there as a lonely entry:

127.0.0.1          localhost

You can leave that there.   On a new line, you can start making entries to start blocking access to websites.   Here’s a few of mine:

127.0.0.1 http://www.facebook.com

127.0.0.1 facebook.com

127.0.0.1 http://www.twitter.com

127.0.0.1 twitter.com

127.0.0.1 foxnews.com

127.0.0.1 http://www.foxnews.com

127.0.0.1 cnn.com

127.0.0.1 http://www.cnn.com

Make sure to save the file and close all open browser tabs and the browser itself.   Now when you access twitter in an impulsive moment, you’ll get a nice 404 message.

twitterFail

Note that this technique is also useful for blocking out ads without triggering the “You’re using an adblocker” warning from the website itself.   I recommend adding this in, too:

127.0.0.1 tpc.googlesyndication.com

127.0.0.1 googlesyndication.com

Bye-bye Google ads!

I’ve done this to my work computers several months ago and I’ve found myself to be tremendously more productive.   Now, if I want my internet fix I pull my phone out while getting coffee.   Hope it helps you too.

Initiative

initiative

If you are unfamiliar with the subculture of Dungeons and Dragons, allow me to enlighten you with one of the rituals of the game.   Role playing games are part narrative where the “Dungeon Master” who is the emcee of the game plays referee as well as storyteller.   Another part of the game besides narrative is rules based where inflection points such as combat between your brave virtual heroes and monsters is decided by chance with the roll of the dice.   When you first start a battle “round” you have to roll initiative.   Usually this is a standard six sided die that is thrown both by the Dungeon Master (on behalf of a monster) and the player character.   Whoever gets the highest value gets to attack first.   This is important because if you are against a tough opponent, dealing a mighty, mortal blow first will likely benefit you due to your foe reeling from your righteous onslaught.

Hold this concept in your mind as we now turn to a team setting in the office.

If you are a manager, then likely you have a team of people who are at various stages of development in their career.   What typically happens with junior developers is a cycle of  work where you the manager fill the employee’s work queue based on prioritization driven from business needs or internal business owner lobbying.   The junior developers will pick a task up, work it, and when they are finished come back to the queue and ask for the next task (or even better just grab the next task off the queue and start).

What do you suppose happens when something comes up, such as a pet project from an executive that appears, usually in the context of a “drive by”?    Nine times out of ten the developer will immediately stop and ask the manager, “Which one do you want me to do?”  What ensues is a painful back-and-forth that might go like this:

“How much more work will the existing project in flight take to finish?”

“How long will the pet project take to knock out?”

Seasoned developers should know better than to engage in this banter.   They should proactively negotiate a deal with their manager.   If the new task takes a few hours to knock out, then it should be done so that the team scores a quick win with management and then the developer can context switch back to the original task.   Nobody is asking you to multitask, we want you to preemptively multitask.   This is computer-speak for pausing on the original task, devoting a time-slice to a new task, and then switching back.

Now that’s one version of initiative that seems to be in scarce supply.    A second type I want to discuss is one that separates employees from “goto guys”.   A “goto guy” is someone you go to when you want something done.   Goto guys anticipate needs and already can tell you three ways to implement it.  Goto guys think holistically and recognize an opportunity in the code / the business / the business funnel / etc and they speak up.    They come to your desk and tell you about an idea they have they want to work on.  EVEN BETTER – they have already done a prototype instead of working on their Facebook likes and they want to show it to you like an eager child showing a parent their finger painting from art class.

What is the environment that would be conducive to this behavior?   What can we do as managers to encourage and reward employees that bring this attitude to work with them?   I don’t know but I wish I could figure it out.   Sometimes it seems people get worn down by the corporate grind and lose that edge that motivates and pushes us.   If I see this second kind of initiative I will laud the employee and remember it come bonus or review time.

Ataribox inches towards release

ataribox1.0

Read more on ArsTechnica:   Ataribox

If you ever visited my home, you would know I have a trove of 1980s Atari computers and game console parts stacked on a wall.   Besides the nostalgia of that time in my life where my brother, cousins, and friends spent hours around the TV playing games (and programming!) I honestly hope that Atari has a second life.

The unit purportedly is priced below $300.   Still no release date, but as the article I’ve linked to states, at least this isn’t a 3D rendering of a prototype.