Jetboard Joust - Defender-Inspired Cute Retro SHMUP - Alpha Now Available For MacOS and Windows

Chatting about life in general, videogames, making videogames and stuff. No adverts/team requests.
User avatar
BitBullDotCom
Remakenaut
Posts: 95
Joined: Thu Dec 10, 2015 2:31 pm
Contact:

Re: Jetboard Joust - Defender-Inspired Cute Retro SHMUP - Alpha Now Available For MacOS and Windows

Post by BitBullDotCom » Sat Mar 03, 2018 1:16 pm

Ian wrote:
Fri Mar 02, 2018 8:01 pm
You've gotta be squidding! They're awesome :)
:lol: Thanks!
====

James Closs, Director & Wielder of Code, BitBull Ltd

http://www.bitbull.com | http://www.joystickjunkyard.com

@BitBullDotCom | @JunkyStickJoy

====

User avatar
BitBullDotCom
Remakenaut
Posts: 95
Joined: Thu Dec 10, 2015 2:31 pm
Contact:

Re: Jetboard Joust - Defender-Inspired Cute Retro SHMUP - Alpha Now Available For MacOS and Windows

Post by BitBullDotCom » Thu Mar 08, 2018 2:18 pm

In the late 1970s, when kids played with proper toys rather than tablets and smartphones, there was this marvellous toy called a ‘BigTrak‘. I always wanted one, but they were way too expensive to buy and probably cost around £10k per year in batteries. I’m sure the reason there’s so many SUVs on the roads today is that all these 40-something-yr-old men are buying them as some kind of mid-life BigTrak substitute. I still think the BigTrak design looks pretty cool even today.

This enemy, the ‘crawler’, was very much inspired by BigTrak, but it wasn’t just a nod to seventies nostalgia. At the moment gameplay seems to gravitate very much towards the top of the screen and I wanted something other than pickups to take the player closer to the ground and amongst the buildings. A ground-based enemy seemed the logical choice to do this.

Usually I’d work on the art first but in this case I thought I’d run a few code tests first to see if the ‘tank’ type enemy I had planned had any kind of hope of succeeding. Maths is not my strong point, and as this vehicle would have to perform the impossible feat of traversing vertical slopes and 90° changes of gradient I needed to make sure it wasn’t going to look like arse before I wasted loads of time on the art.

To my surprise my initial tests worked very well. There’s no ‘physics’ at play here, the wheels (working independently) simply traverse the outer edge of the terrain in the most basic way. I then work out the angle between the wheels (i.e. the axle) and place and orientate the chassis based on this. It’s not physically ‘correct’ by any means as the distance between the wheels changes depending on the terrain but, as it’s performing impossible feats anyway, I didn’t think this mattered – I could get away with a telescopic axle! In the final version I added something to make the wheels roll more nicely around corners but other than that I stuck with my first approach, I made a couple of attempts to make things more ‘realistic’ but both ended up looking worse than the original.

Image

Satisfied that I could make this work I then began work on the art. There were two keys things I had to bear in mind here. Firstly, the design needed to be such that the distance between the wheels could change without looking ridiculous as described above, and secondly that the vehicle could travel in either direction. I think you can get away with simply flipping sprites for left/right when they’re small but with larger sprites like this that approach can look pretty ropey.

At first I was working on a ‘tank’ type idea that was similar to BigTrak. I spent several hours on this but wasn’t happy with anything I came up with. Everything looked too clunky or too much like a motorbike (ugh!)...

Image

So I started experimenting with some radical changes and in the ended settled on a kind of armoured ‘push me/pull you’ design that I felt worked much better. It’s a complex affair though, the final unit comprises eleven different sprites, so getting these all lined up and positioned correctly was a very fiddly business!

Image

Getting the guns to track the player was also fairly tortuous as one has to consider the rotation of the vehicle as well as the previous rotation of the gun to make things work smoothly. People with more of a maths brain probably find this stuff easy. I don’t, but I got there in the end - here's a clip of everything in action.

Image

The AI wasn’t simple either. For individual vehicles it’s pretty straightforward, but when they appeared in batches I was getting issues (as with the Squocket enemy in the previous post) of them overlapping too much. In the end I created a ‘hive mind’ class that acts as a controller for a bunch of vehicles. This class works out the ideal positioning of each vehicle and then the individual vehicles track to this position.

Lastly I have the pilots of the vehicle man jetboards and make a last-ditch attempt to attack the player when their vehicle is destroyed. There’s a specific class for this type of enemy too (I’m calling it the Kamikaze) but it’s pretty much one of the basic minions with tweaked parameters. Here's a clip (enlarged 150%) showing a battle with two crawlers with the player using a variety of weapons to dispatch them (he only just makes it)..

Image

EDIT: Aaarggh – I thought I was done but whilst working on some screengrabs for this post I ran into a hideous bug to do with the world wrapping (remember I talked about that here?). I was getting all sorts of problems caused by the vehicle wrapping at a different time to any of the buildings it was in contact with. Very difficult to find a solution for this so in the end I’ve settled on a bit of a hack whereby the vehicle stops moving if it’s very close to the edge of the world. This seems to work OK and I don’t think it will be too obvious in practice.

So, the most complex enemy to date but I’m pleased with the end result. I think I only really need a couple more like this and I can move on…

Dev Time: 4 days
Total Dev Time: approx 166 days
====

James Closs, Director & Wielder of Code, BitBull Ltd

http://www.bitbull.com | http://www.joystickjunkyard.com

@BitBullDotCom | @JunkyStickJoy

====

User avatar
BitBullDotCom
Remakenaut
Posts: 95
Joined: Thu Dec 10, 2015 2:31 pm
Contact:

Re: Jetboard Joust - Defender-Inspired Cute Retro SHMUP - Alpha Now Available For MacOS and Windows

Post by BitBullDotCom » Thu Mar 22, 2018 8:38 am

To say that I’m glad to be finished with this next enemy would be something of an understatement. It’s been painful. I knew these more elaborate enemies would be time consuming but this one has caused me all sorts of headaches and I’m really, really sick of it. So sick of it in fact that I’m not even sure whether I’m pleased with the end result any more.

I started out with a plan to create a kind of ‘robot/alien wasp’ type creature called a ‘stinger’ and it was fairly straightforward to knock up a version with placeholder art, splitting the creature into three separate sprites for head, thorax and abdomen that could move independently. Getting the final art right though was an absolute nightmare. I think this was due to a number of reasons…

1. Wasps are very dark, consequently reference photos were very unclear on detail. Also creating a dark sprite that stands out from a dark background with a very limited colour palette is tough.

2. Insects in general are pretty ‘fiddly’ creatures. The things that distinguish their character are actually pretty small and/or spindly which make them very hard to render in low resolution. I found the legs particularly hard and gave up trying to render mandibles as whatever I did they just looked like a beak!

3. One of the things that characterises a wasp is (obviously) the stripes on their abdomen. These are hard to render at low resolution as angled stripes just look too ‘jaggy’ and going for straight stripes just makes the abdomen look like a boiled sweet, too cartoony and not ‘creepy’ enough.

Here's a first abandoned attempt. With this one I was trying to make the enemy look too realistic and relying too much on reference photography. It sounds dumb but their is probably around a day's work here included the various blind alleys I went down (actually it was all really one blind alley)!

Image

Here's a second abandoned direction. As I wasn't getting anywhere with the 'realistic' approach I tried going down a complete ‘robot’ path, creating a creature partly from sprites that I’d already designed (mainly the ‘upgrade weapon’ icons). I felt this one had some kind of vague potential but was too bitty and I felt going full-robot lacked the creepiness I was after (never go full-robot)!

Image

Things only really started together when I sketched out a very stylised wasp by hand and went for an approach that was 50% ‘real insect’ and 50% ‘steampunk’. I stuck with very stylised angles where possible and this seemed to work, particularly on the legs which I was having massive problems with (I ended up separating these out as individual sprites). This is the first version I posted on Twitter. It still sucks but it's getting there. The mandibles look horrible (like a stubby beak) and the abdomen is too 'tubby' and clumsy looking but the thorax, legs and bulk of the head are actually looking OK.

Image

And here's pretty much the final version. I've got rid of the 'beak' and replaced with some dangly mouth parts, replaced the 'real' abdomen with a clanky, steampunk-esque fuel tank, and created a more detailed and less clumsy 'sting'. After this I also made the abdomen pulse a bit. I reckon it took me 3.5 days of painful pixel-pushing to get to this stage!

Image

Thankfully coding the movement wasn’t too problematic, the AI is very simple but seems to work nicely. The gamma-ray that it fires from its ‘sting’ was a bit of a pain in the arse as I had to redo my original gamma-ray code to cope with being aimed at an angle, this meant I needed to use raycasting for the collisions. Fortunately I could reuse code from the ‘shredder‘ weapon but still, this was non-trivial due to my lack of foresight in the way the original gamma-ray was implemented!

There’s a two-stage attack pattern whereby the player must destroy the creature’s abdomen first. At this point the creature becomes faster, more aggressive, and starts to spit poisonous space-venom! The venom-spitting effect is created with particles.

I still need to add some custom audio and maybe work on the explosions a bit more (these ones don’t seem bit enough and bigger enemies also need bigger bones!) but, for now, this one is finally done. Six bloody days!!!

Image

*** edit *** ….and, I’ve just realised when I grabbed this video that I had immunity on the player for debug purposes (groan). That’s why the enemy’s attacks aren’t doing any damage!! I need a break!

Dev Time: 6 days
Total Dev Time: approx 171 days
====

James Closs, Director & Wielder of Code, BitBull Ltd

http://www.bitbull.com | http://www.joystickjunkyard.com

@BitBullDotCom | @JunkyStickJoy

====

User avatar
Tam Toucan
Team RR
Posts: 402
Joined: Mon Jan 06, 2014 3:57 pm
Location: My head
Contact:

Re: Jetboard Joust - Defender-Inspired Cute Retro SHMUP - Alpha Now Available For MacOS and Windows

Post by Tam Toucan » Fri Mar 23, 2018 11:38 am

That is friggin' AWESOME!

User avatar
bignobody
Team RR
Posts: 453
Joined: Sat Jan 18, 2014 12:58 pm
Location: Not quite all there.

Re: Jetboard Joust - Defender-Inspired Cute Retro SHMUP - Alpha Now Available For MacOS and Windows

Post by bignobody » Fri Mar 23, 2018 12:32 pm

Tam Toucan wrote:
Fri Mar 23, 2018 11:38 am
That is friggin' AWESOME!
Agreed. Seems like your hard work and frustration paid off!

notrobot
Remakenaut
Posts: 187
Joined: Wed Jan 08, 2014 7:55 am

Re: Jetboard Joust - Defender-Inspired Cute Retro SHMUP - Alpha Now Available For MacOS and Windows

Post by notrobot » Sat Mar 24, 2018 9:37 am

Looks really tough! Love the sound-effects too.

User avatar
BitBullDotCom
Remakenaut
Posts: 95
Joined: Thu Dec 10, 2015 2:31 pm
Contact:

Re: Jetboard Joust - Defender-Inspired Cute Retro SHMUP - Alpha Now Available For MacOS and Windows

Post by BitBullDotCom » Sat Mar 24, 2018 2:30 pm

Hey - thanks for the feedback people! Really glad you like it - it was a struggle getting there!
====

James Closs, Director & Wielder of Code, BitBull Ltd

http://www.bitbull.com | http://www.joystickjunkyard.com

@BitBullDotCom | @JunkyStickJoy

====

User avatar
Havie
Team RR
Posts: 1096
Joined: Wed Jan 08, 2014 9:37 pm
Location: Surrey
Contact:

Re: Jetboard Joust - Defender-Inspired Cute Retro SHMUP - Alpha Now Available For MacOS and Windows

Post by Havie » Sat Mar 24, 2018 9:18 pm

More amazing every time I look - this is a real labour of love!

User avatar
BitBullDotCom
Remakenaut
Posts: 95
Joined: Thu Dec 10, 2015 2:31 pm
Contact:

Re: Jetboard Joust - Defender-Inspired Cute Retro SHMUP - Alpha Now Available For MacOS and Windows

Post by BitBullDotCom » Thu Apr 12, 2018 1:37 pm

Firstly, thanks again to everyone for posting feedback and continuing to read this magnum opus. It really helps to not feel like I'm developing entirely in a vacuum. All I get from the Mrs is 'When are you going to start looking for a proper job?! :roll:

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. Here's how it progressed - four days work in fifteen seconds...

Image

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!

Image

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.

Image

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!!

Here's a video showing all three attack stages...

Image

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

James Closs, Director & Wielder of Code, BitBull Ltd

http://www.bitbull.com | http://www.joystickjunkyard.com

@BitBullDotCom | @JunkyStickJoy

====

User avatar
Ian
Team RR
Posts: 1024
Joined: Sun Jan 05, 2014 11:02 pm

Re: Jetboard Joust - Defender-Inspired Cute Retro SHMUP - Alpha Now Available For MacOS and Windows

Post by Ian » Sat Apr 14, 2018 5:05 pm

Loving both of those bosses. Very cool :)
I came. I saw. I Played.

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest