Dashkin Development

Saving the World

Category: Tech Updates

Movement Part 2

Posted on May 14, 2017  in Tech Updates

Last tech update covered how we move along sloped surfaces and dealt with tricky issues such as mantling up and into tunnels equal to our height.  But a platform isn’t about just running along the ground.. its about.. platforming.  That means jumping.
 

Step 1 : Leaving the ground

With our vector movement based approach it was relatively simple to get our character to jump.  We merely used the existing horizontal velocity along the movement direction perpendicular to the normal of our ground surface and added a positive jump velocity.  We do a quick sweep up to determine if our character has at least a minimum height ceiling above them and switch from ‘ground-mode’ to ‘air-mode’ for our movement.
 

Step 2 : Air Control

There are many key points for successfully creating jump logic in a platformer.  Our character can influence their horizontal movement each frame in the direction the player holds the d-pad.  This coupled with a jump height ‘kill’ (apply extra gravity when the user releases the jump button) allows the player to precisely control their motion in the air in a way that makes sense.  If the player presses and holds the button they jump farther.  If the player holds in a direction they attempt to move in that direction.  If the player releases all controls the character attempts to stop moving and fall in the current location.  While experimenting with motion it became very clear that stopping the character when no input is received is just as important as moving when a direction is pressed.
 

Step 3 : Landing

With our analog approach to movement using sweeps landing is accomplished by sweeping in the direction of motion, discovering the normal to the surface, and comparing that normal to what slopes are ‘landable.’  We preserve the horizontal motion of the character, switch to ground mode, and apply any extra time after hitting the ground to smooth out motion when we finally land on something solid.
 

Step 4 : Wall Hugging, Hitting our Head

Real physics aren’t always fun, that’s why we make fake game physics.  When our character hits their head on a platform above them, we apply vertical and horizontal friction, but do not zero out their velocity.  We then move our character along the ceiling in the direction perpendicular to the normal of impact.  This allows the player to jump against curved ceiling, nudge around platform edges to get on top of them, and keeps motion fluid.  These rules also apply to vertical slopes, so if a player is attempting to move into a wall their descent is slowed while they slide down it.
 

Step 5 : Playing with Friends

All the rules up until now have applied only to a moving character vrs a static world.  Thankfully the same sweep tests, overlaps, and collisions also work great against other dynamic characters.  By applying our same rules as before and preventing objects from penetrating each other, we merely perform the same logic as with our platforms and our characters can move freely around and over each other.
 

Step 6 : Rigging all the Things

Finally we’ve completed solving moving our object around our terrain.  The final step is the incredibly tedious process of defining the bounding boxes of all our characters across all of their various animation states and frames.  In order to do this we draw bounding boxes in ToonBoom Harmony and expert them per-frame into Unreal 4.

 

 

 

[Top]

Category: Tech Updates

Movement Part 1

Posted on May 1, 2017  in Tech Updates

Dashkin is all about platforming.  Anyone who has ever played any platformer knows that movement is basically.. the entire game.  This past week I’ve been exploring solutions on twitch to figure out how we’ll be doing this for dashkin.

 

Step 1 : Build Fatsack a test level

The first thing I did was create a simple level in Unreal 4 in order to test edge cases with collision.  We made stairs, vertical walls, walls with tunnels, and a few giant ramps into space that we can run along and make sure our fatsack can into space.  The idea being that if fatsack can traverse all the test objects properly in a horribly constructed danger zone, that he’ll be able to do so in a real level that we put together later.

 

Step 2 : Think a lot

Next I started drawing out all the cases I could think of and figuring out how we’d move our fatsack through the world.  We went through an entire day of vector math drawings, hypothetical teleporting fatsack wormholes, and random tangents complaining about floating point to settle on our basic plan.  We’ll be using sweep & overlap tests in unreal in order to move our object in an analog fashion (so not tile-based collision) through the world.  Basically we sweep fatsack perpendicular to the normal of the surface he’s standing on, check for collisions, then resolve those collisions based on the situation.

 

Step 3 : Moving along the ground

In the simple case fatsack moves by nudging out of the ground by a tiny amount and sweeping forward in constant time along a vector perpendicular to the normal.  If we run into an object we move to the point of impact and nudge out from that object by a small amount normal to the surface of impact.  After we do this, we attempt to snap our fatsack to the ground.  This allows us to run up and down slopes even if there are seams in the ground, as long as we don’t stub our toe into the ground.

 

Step 4 : Stubbing our Toe

The first issue with the motion is if we run into a piece of geometry which sticks out from the floor.  A person in real life would just step a little higher and traverse over something like this (or they’d trip and fall on their face).  In this game we want our characters to nicely glide over small seams in the geometry without any issue.
In order to do this we :

— Sweep in the direction of motion

— Move to the collision point with the sweep

— Raycast to discover a ‘mantle’ destination

— Sweep perpendicular to the impact normal

— Sweep along the perpendicular to the normal of the discovered mantling destination

 

Step 5 : Tunneling

One issue with mantle destination discovery is that we need to ensure that we can ‘step up’ into a hole that’s the same height of our character.  In order to accomplish this we iterate in steps by our character’s height up the wall we’re climbing, move in the inverse of the impact normal, and again trace inverse in the perpendicular to the impact normal to discover the mantling point.

 

Conclusion Part 1 :

So far this method of movement has allowed fatsack to successfully navigate the ground in the test level!

 

Good Job Fatsack.

 

 

[Top]

Category: Tech Updates

Professional Development on an Indie Budget

Posted on April 19, 2017  in Tech Updates

One of the biggest challenges associated with development is figuring out how you actually get work done.  This becomes much, much more complex when you have people not only in different time zones but also halfway around the world.

Version Control

Version control systems store your game assets and code securely so that everyone can work on the project at the same time.  We’ve gone through quite a saga with zeroing in on the correct solution.  First we started out with git hosted on github.  This worked just fine until we needed to store large assets (like uassets in unreal 4).  We tried throwing git-lfs (git large file storage) at this problem, but found that none of the toolsets supported it.  This became a gigantic headache as I had to debug git commandline issues with Adam over voice chat.  If you can imagine fighting a tiger with a blindfold on while googling how to compile ubuntu.. it was something like that.  We then switched to the tried-and-true perforce.  We were using hosted perforce on assembla, but when they raised their prices to over $200 a month for our services, we needed to pull the plug.  We are now hosting perforce on our own t2.micro on aws and its been working out fantastically.  We pay <$5 a month for this and it works great even though I’m in the US and Adam is in Aus.

All told we’ve migrated source control systems 4 times!

Automated Builds

I don’t know how many indie studios have nightly builds, but we sure do.  We’ve got a build machine setup under my other desk running Jenkins which builds all versions of the game nightly.  It’s hooked up with its own gmail account and wakes me up at midnight if the build is busted (its always my fault).  Having a build system which automatically builds our systems has caught so many boneheaded errors that I *HIGHLY* recommend any dev setup a build system even if you don’t think you really need it.  All the software for Jenkins is free, so if you’ve got a spare machine sitting around you can set it all up for free in a snap.

Sharing Files

Version control is good at storing source code and big assets, but what about temporary work or files that don’t work well with source control (I’m looking at you ToonBoom Harmony!)?  We tried various solutions such as dropbox, share drives over VPN, and others.. but nothing has come close to the speed and just plain ‘works’ as Resilio Sync.  Its a torrent-based file transfer system which syncs file systems asychronously.  We just leave the build machine always on as a peer with automated nightly archives onto our NAS and we’ve got versioned backups as well as always-available secure peers for fast file transfers.

Tools and Scripts

Creating easy-to-use development tools can be very tricky even as a small team.  Telling someone to go run ‘GenerateProjectFiles.bat’, sync down the latest on p4, run the sync tools for unreal dependencies, build the editor in ‘development’ mode, run the code generator, and run the newly built editor is a huge pain.  In order to simplify our workflow we’ve created a master helper batch file which we both use.  If one of us creates a new tool we just add it as an option and check it in.  No more ‘oh yeah.. sorry Adam.. I totally broke all your stuff.. so.. here’s a 12 step process … Adam?  Are you there?   …..

C++ Debugging

Debugging crashdumps from C++ applications can be a gigantic headache.  To solve this we host a symbol server on our shared NAS which our build server updates.  We use srcsrv & symstore so when we get a crashdump all we have to do is double-click the files and it syncs down the files from p4, grabs the symbols from the Z: and we’re fixing bugs before we realize it.

*a quick hint for those troubled by p4 srcsrv requiring identical hostnames and not playing well with proxies, just edit p4.pm so it doesn’t include the host.. then tell developers to make sure p4v is open on the right server and it’ll automatically grab your correct files

In Short

Tools and scripts : Java / Python / Batch scripts

Version control : Perforce self-hosted on AWS (free for <5 users)

File share : Resilio Sync Pro (secure folders ftw!)

Debugging : Srcsrv & Symstore

 

Total cost per month : $25

 

If you’ve got any questions you can hit me up on twitter @ambientenergy_0

[Top]