© 2023 by Andrew Jonhardt. Proudly created with Wix.com

  • Andrew Jonhardt

I finished the Ghost thing

I finished Ghost to Text last weekend. You can play it here, if you'd like:


I planned to finish the project in 1 weekend, and ended up needing 2. The main reason for this was the surprising difficulty in getting the enemies to work.

You know that script I posted in my last blog update, the one that was supposed to allow an enemy to track the player position? Yeah, that script was wrong. This is what I ended up with:

func _process(delta):

self_pos = self.get_global_position()

player_pos = Global.Player.get_global_position()

distance = self_pos.distance_to(player_pos)

if distance <= distant_check:

var direction = (player_pos - self_pos).normalized()

var motion = direction * SPEED * delta

position += motion

This script gets the player's global position, the enemy's global position, compares it, and provides a variable to move the enemy toward the player if the player is close enough. I'm not sure what I was thinking with the previous script, but all it did was move the enemy forward in a straight line.

I tried to craft a script for one of the enemies, called Hand, that would allow Hand to launch itself at high speed at the player, stop, re-orient towards the player, then launch itself again. Basically, the Hand was supposed to be a self-directing missile that would become blind to the player whenever it moved. So, Hand would need to stop and find the player again.

I never got Hand working correctly. Correcting and getting all other aspects of the game to a working state took too much time, and in the end I left Hand only with the ability to see the player's position 1 time. Once Hand reaches the last player position it recorded, it just stops.

The script for Hand is basically just the previous script above modified so the "motion" and "direction" variables are only set once (I put them in a different function). I tried a few alternative solutions, so as to provide Hand time to re-find the player's position, but I didn't find a real script-only solution. If I try something like Hand again, I'll just use a timer.

The art included in this post was created using a program called Krita. Krita is a free art tool that bills itself as a "professional" paint program. I'm not enough of a professional to confirm if Krita's assertion is accurate, but I can say the program is relatively easy (I was expecting alot more fiddling with the interface) to use. Krita doesn't use the majority of the Photoshop keyboard shortcuts, which is annoying, but that didn't slow me down as much as expected.

I've got 1 major gripe with Krita so far: You need to enable a specific "Docker" (sub-menu, under Settings > Dockers) in order to even retrieve color codes! This may not seem like alot but, if you ever need to re-create assets or you actually know how to use a color wheel and standardize the colors of your project, color codes can be worth a great deal. I'll also say that color codes appear to be only retrievable in Hex, but I actually prefer Hex color codes over RGB or CMYK so this doesn't bother me.

Basically, I'm saying Krita is a solid option if you're looking to make 2D art and you're not enjoying the GIMP interface. I've never been a huge fan of GIMP myself, as GIMP has always felt to me like a lesser version of Photoshop instead of a competing Photo-editing suite. Krita, in my non-expert hands, feels like it's own product.

That brown splotch that looks like a puddle of poo is supposed to be a rock. I refuse to call myself a 2D artist. As far as programmer art goes, though, I'm pretty happy with what I was able to throw together.

I'm afraid to say I was unable to get anything else done this weekend. I was dogged by a persistent headache for most of it, and was unable to create a testable prototype of that board game I mentioned last week. There's a good chance I won't be able to work on the board game this week, either.

My inability to meet all of the goals I set for Text to Ghost, namely time for the inclusion of sound, has me worried about the scope of my next project. Titled "A Beginning for Pointman," one of the biggest features I'm planning is an open world and the dynamic loading and unloading of said world.

Open world design tends to require the breaking of said world into chunks to save on memory. I'm planning a 2D world, so dynamic loading and unloading probably isn't necessary. I was hoping to give the problem of loading and unloading the world, also called streaming, a shot, but I'm now thinking such a task may be a bigger hurdle for my current skillset than anticipated. Additionally, open world design is generally fairly complex, as you're dealing with interactions of systems on a much larger scale.

I'm going to spend the rest of this week seeing how much planning and pre-testing I can get done. I may decide to change aspects of Pointman. I'll have more to say next week.