Tag Archives: pixelart

Jetboard Joust Devlog #85 – Conqueror Worm

Yes, it’s been too long since the last update. Far, far too long. This last boss has been the most time-consuming of them all, but I don’t really mind as I’m really pleased with the end result and the bosses are now (just about) finally out of the way which is an enormous weight off my shoulders!

I wanted a kind of creepy giant worm for this one. In my head it would be somewhere between the giant sandworms of Dune and the real-world creepfest that is the Bobbit worm. It ended up having a healthy dose of H.R. Giger in there too! I’m currently calling it the ‘squirmer’.

Before starting on the art I thought I’d better knock out a quick prototype of worm-type movement as, if I couldn’t get that right in code, no amount of pixel-pushing would make things look any good. I spent some time pondering how to do this and in the end settled on a very simple skunkworks physics type approach (it’s probably less than ten lines of code) which, to my immense surprise, worked out incredibly well. There’s a really nice ‘slither’ effect to the tail motion which I really hadn’t predicted at all.

To get this effect I first move the head of the worm. I then iterate through each segment in turn (from the head downwards) and see if the distance to the previous segment is greater than a specified ‘joint length’. If it is I move it towards the previous segment by the appropriate amount. I then store the amount of movement as momentum so that the next frame each segment will move according to its stored momentum as well as being pulled by the next segment along. That’s the basic principle anyway.

Once I knew I had that pretty much nailed I started on the art. It didn’t take too long to get something that had the vibe I was looking for, what did take a long time for this one was animating it. The motion of the teeth itself was fairly simple but, for some reason, getting the mouth to look right around the teeth whilst it was opening and closing was tricky. I ended up having to make the whole head expand and contract slightly. For some masochistic reason I decided I should try making the whole mouth rotate (it just seemed as if it should do this) but the process of splitting everything out to get this to work ended up being extremely fiddly and time-consuming. I think it was probably worth the effort though.

I also spent a long time dithering over eyes. I went through multiple options as I felt it needed something ‘eye like’ for character, but everything I tried looked too cartoony or fish-like. At the end of the day it just seemed creepier without any eyes at all so I stuck with just simple antennae.

The tentacles at the side of the head also took a while. It felt like I needed something here and I tried a number of things (including extending jaws like the Bobbit worm) but none of them really did it for me. The tentacles seemed to work OK but, again, they were difficult and time-consuming to animate.

The segments didn’t take too long to get right though I was quite a while on the larger segments that ended up loosely based on the spiny shells from Super Mario.

To get the ‘glow’ effect for the segments I have a duplicate sprite in a much lighter colour palette. This is placed behind the ‘normal’ sprite and I vary the opacity of the ‘normal’ sprite’. It took a fair bit of tweaking before I was happy with this effect.

Once all the art and basic movement was done (around eight or nine days in) I could finally start on the attacks. There are three phases to the battle, in each phase only the tail segment is vulnerable so the squirmer must be destroyed one segment at a time until only its head remains. As each segment disappears (and when it moves to the next phase) its movement gets faster.

Stage One
The squirmer spits out eggs which, once they hatch, spawn mini carnivorous worms that move very fast and attack the player.

Stage Two
The squirmer uses an ‘extending mouth’ attack inspired by H.R. Giger’s Alien. These ‘extending mouths’ both attack the player and serve to defend the squirmer from the player’s attacks.

Stage Three
The ‘extending mouth’ attack become more powerful, the mouths are larger, more aggressive, and have a greater range. They also shoot laser beams.

The ‘extending mouth’ effect is based on the same code for the tail of the main boss but with adjustments made for tethering the tail to a fixed point. It took a fair bit of tweaking for this to look right but I think it seems fairly convincing now, or as close as I can probably get anyway!

I added a few a new audio effects, a sound for the squirmer’s teeth gnashing and rotating, firing eggs, eggs hatching, and a new laser sound which I’m particularly pleased with. As with all the sounds, these were created on the DSI Tempest.

Oh yeah, I’ve also finally added some bigger explosions and a special ‘boss’ explosion. I spent about a day on explosions alone as I’ve also created smaller ones to give more variety between the various enemies.

OK, I think I’ve gone on enough now. Next I have to go through the bosses (the first two mainly) checking a few things and making a few improvements – then I’m done with this and on to what should be the final major gameplay addition!

Dev Time: 11 days
Total Dev Time: approx 196 days

previous | next

Skunkworks Physics – Tail Motion Proof of Concept

The Eyes Don’t Have It

Finally – The Art Pretty Much Done
mockup_3x Extending Mouth Attack Inspired By HR Giger


Jetboard Joust Devlog #83 – Somethin’ Fishy Goin’ On…

God, these big enemies are hard!

I thought six days on the last one was extreme but this one has taken me pretty much eight full days. Probably over 50% of that time spent on the art. Basically these have pretty much morphed into ‘miniboss’ type creatures with multiple attack patterns (and in this case even spawning smaller enemies) which was never my intention but I feel like I have to kind of go with the flow. I am really struggling with motivation now though, this project is dragging on and on and ON and to be spending so much time on one thing at this late stage is extremely demoralising. I need to be earn some sodding money. Enough of my moaning though…

I decided to make this enemy a giant deep sea fish as deep sea creatures are weird, alien and creepy looking and have already been used for inspiration on some of the other enemies such as the squocket. My main source of inspiration was a fish called the fangtooth which seemed to have the right balance between looking weird and dangerous whilst maintaining an iconic fishy shape. I’m calling it the ‘snapper’.

Creating the basic shape in pixelart wasn’t too difficult and I didn’t go down nearly as many dead-ends as I did with the stinger so the process, whilst just as time-consuming, wasn’t nearly as frustrating. Most of the time I always felt like I was making progress. The scales were the hardest part to get right – it’s large area to cover and it’s tough to get the balance right. Not enough detail and things look flat and boring, too much detail and things look too ‘photographic’ and don’t gel with the rest of the game’s style. When the scales were defined as a simple filled pattern they looked too ‘flat’, like I’d obviously filled a stencilled area. If I applied too much shading to them they almost looked too ‘3D’ and ‘realistic’. In the end I offset the scales based on a pattern of concentric circles to give a slightly rounder shape to the body, limited myself to three different scale tones and didn’t allow a change of tone within an individual scale. This took forever but it finally seemed to give me the right degree of detail whilst maintaining a sense of stylised simplicity.

I thought the teeth and gills would be hard to draw but actually those parts came together really quickly, as did the ‘skull’ for the zombie attack phase. The spikes on the spine were rather more finicky and still need a bit of tidying up.

The other reason this took so long was that collision detection on an enemy of this size gets rather more complex. When I began work on the game I didn’t have ‘boss’ type enemies in mind so assumed I could implement a simple ‘one size fits all’ collision detection system. Unfortunately this doesn’t cut it when you have enemies that are complex shapes, some areas that act as ‘hot spots’ for damage, and other areas that you may want to collide with the player but not actually take damage themselves. I needed to find a way to allow for all this whilst avoiding having to go back and redo old code (particularly checking all the weapons again).

In the end I came up with a ‘CollisionProxy’ class. A CollisionProxy is spawned from a parent (the main sprite) and will both take and inflict damage on behalf of its parent (or not depending on the configuration). It also renders with a custom shader in sync with its parent when taking damage. Any sprite can have any number of proxies. So far this system seems to work well and I’ve hardly had to change any of my core code to implement it.

There’s also polygon-based collision detection on this enemy. Up until now I have been able to get away with simple rectangle-based collision detection. Thankfully I had already implemented SAT-based collision detection for convex polygons when I first ported my game engine to MonoGame so I had no extra work to do there – Thank God!! I think trying to add something like that at this stage would probably have killed me!

In its final(?) incarnation the snapper has three attack phases…

Stage One
Tracks the player fairly slowly. Unleashes either an aggressive charge/snap attack or spawns electric jellyfish from its mouth. Its jaws do more damage than the rest of its body and it will only take damage if you fire directly into its mouth (this was a PITA to implement collision-wise).

Stage Two
Loses its flesh and becomes a steampunk zombie fish. In this mode tracking of the player is faster and it’s two mounted ‘shredder‘ weapons are armed and fully dangerous. You need to destroy the engine mounted on its side to proceed to the next phase.

Stage Three
Now on its last legs (if it had any) the snapper tracks the player very quickly. It’s only defence at this point is a very aggressive kamikaze charge attack.

And that, at last, is it. Painful, but I think it was probably worth it. I’ve had some of the best feedback for the game so far from some of these images on Twitter. There’s still a few things I’m not 100% happy with. Art-wise the final phase needs some more engineering where the engine used to be and I might try getting rid of the eyeball on the zombie skull and replacing with a more skull-like eye socket. The second phase is also a bit weird – at the moment the whole enemy can take damage but it recharges until the engine is destroyed (so there’s a separate health meter for the engine). This is confusing. I should probably have the main enemy not take damage at this point and only have a health meter for the engine.

The difficulty will need some tweaking but I’ll have to do that in the context of the game more. Generally, I must admit, I am not a big fan of boss fights as they are often done so badly. In my opinion a good boss fight should seem ridiculously tough at first but be relatively straightforward once you’ve worked out a strategy. You shouldn’t die before you’ve even had a chance to get a decent look at the boss and it shouldn’t be a schlep to get there on every retry either. Though I thoroughly enjoyed both Dark Souls and Demon Souls to the point of obsession I found the ‘rinse and repeat’ style run to the bosses immensely tedious. I gave up at the final boss on both games because of this – life was simply too short! The bosses in this game will be optional and protect hefty rewards/upgrades rather than blocking your progress in the game.

I also still need to add some larger explosions befitting an enemy of this size!!

Dev Time: 8 days
Total Dev Time: approx 179 days

previous | next

Fours Days Of Pixel-Pushing In Fifteen Seconds

Fun With Collision Proxies

Entering The Zombie Phase

Whoops – I Accidentally Added Boss Battles!

Jetboard Joust Devlog #77 – Keeping Your Enemies Close…

Been working on some new jetboarding enemies over the past few days, so around a day of pixel-pushing and a day of coding with the extra half day fixing bugs caused by the new ‘world wrap’ technique I described in my previous post. I’ve also been rejigging my sprite sheets so the art used for the jetboard and weapon attachments is duplicated on the enemy sprite sheet (fewer spritebatch calls to the GPU needed and should also make things easier if/when I add alternate colour palettes).

Fortunately new jetboarding enemies are relatively simple from a code point of view as a much of their ‘personality’ is defined by tweaking parameters already present in the AI. I also have a fairly decent template for doing the animations now too. Here are the new enemies that have been added, names are just codenames really so may well change…

1. The Master Minion
This is really just a bigger, stronger, and slightly more dangerous version of the omnipresent ‘minion’, the game’s cannon fodder. They’re quicker to snatch your babies away and mutate too!

2. The Ninja
Small, fast, light, very aggressive, but also pretty weak. This guy is very dangerous and performs a ‘pincer movement’ around the player really frequently making him a tough opponent to deal with.

3. The Aggressor
This guy is strong, fairly nimble, and very aggressive when you rile him but he’s actually pretty dumb and will let you sneak up behind him and get in the first shot. A bit like some of the knights in ‘Dark Souls’ (well, kind of)! You can tell which way he’s facing by looking at the scanner. This enemy required some custom AI work.

4. The Thug
This guy is very big and strong and takes a lot of ammo to dispatch. He’s pretty slow though, and not the brightest lamp on alien street either. I was particularly pleased with how the art for this one worked out.

5. The Snatcher
All this guy cares about is stealing your babies and trying to mutate. It’s like he’s a kind of half-mutant already and is desperate to finish the job. He’s a bit of a coward and will actively try and avoid the player unless directly engaged – watch him though, as he’ll snatch away your progeny and mutate really quickly if you don’t keep an eye on the scanner! This enemy required the most custom AI work.

This brings the total of enemy types to 12, I think I’m going to try and bring it closer to 20 and want to add some ‘miniboss’ type enemies with much larger sprites. few more smaller ones to do yet though…

Dev Time: 2.5 days
Total Dev Time: approx 156 days

previous | next

The Master Minion – Upgraded Cannon-Fodder

The Ninja – Fast And Dangerous

The Aggressor – You Won’t Like Him When He’s Angry

The Thug – Strong But Easily Outwitted

The Snatcher – A Devious Coward