Snabb Grabb

Neon White is defined by its lightning-fast pace and the strategic burning of resources. In Snabb Grabb, I translated this loop into a modular state machine where every card functions as both a combat tool and a key for traversal. This page highlights my primary focuses during the project, specifically the intersection of physics and player agency. While these sections cover the core movement and card systems, they represent a focused look at a much broader development process. This involved custom engine integration and systems architecture that supported the game's high-speed requirements.

Dev Time:

10 Weeks (75%)

Group Size:

13

Engine:

CrackEngine, C++

Base Movement & Kinematic Control dropdown

The movement in Snabb Grabb is built for precision and speed. I implemented a hybrid system where the player is a component-driven entity using a PhysX Capsule Controller. By manually calculating displacement and using the PxCapsuleController::move function, I gained total control over movement curves while letting PhysX handle complex collision resolution and slope-sliding. This approach prevents the 'floaty' feel often found in purely dynamic physics simulations and ensures the movement is snappy and deterministic.

Grounded Logic & Coyote Time dropdown

The movement loop follows a specific sequence to maintain stability. Every frame, gravity is applied to the vertical axis before the grounded check. If the bitmask filters (Ground, Enemy, or Door) confirm contact, the velocity is reset to a minimal downward value to keep the controller glued to the surface. Within this same check, I manage Coyote Time by resetting a timer that allows the player a brief grace period to jump after leaving a ledge, ensuring the platforming feels fair and responsive.

1 myVelocity = { 0, myVelocity.y + (myGravity * aDeltaTime), 0 };
2
3 //Cayote Time
4 if (myGroundedState & (PhysXManager::FilterGroup::eGROUND |
5 PhysXManager::FilterGroup::eGROUNDENEMY |
6 PhysXManager::FilterGroup::eDOOR))
7 {
8 myCayoteTimer = myCayoteTime;
9 myVelocity.y = -0.01f;
10 }
11 else
12 {
13 myCayoteTimer -= aDeltaTime;
14 }
15
16 //Jump input if in cayote time
17 if (myCayoteTimer > 0 && myVelocity.y < 0 && myInputDirection.y > 0)
18 {
19 myCayoteTimer = 0;
20 myVelocity.y = myJumpForce;
21 }

Horizontal Input & World Space dropdown

Horizontal movement is calculated by normalizing raw input and applying the player's speed variable. To ensure consistent movement regardless of the camera's orientation, I convert these local directions into world space before passing the final displacement to the controller. To improve playability and prevent the player from breaking the level flow, I implemented strict limits on both vertical falling speed and horizontal run speed. This baseline consistency is vital for the game's core platforming, though specific abilities are designed to temporarily override these limits to provide a punchy, high-velocity feel.

1 //Horizontal movement
2 Vector3f horizontalInput = { myInputDirection.x, 0, myInputDirection.z };
3 horizontalInput.Normalize();
4 myInputDirection.x = horizontalInput.x;
5 myInputDirection.z = horizontalInput.z;
6
7 myVelocity.x += myInputDirection.x * mySpeed;
8 myVelocity.z += myInputDirection.z * mySpeed;
9
10 myAppliedVelocity = ConvertToWorldDirection(myVelocity);
11 float vericalSpeed = std::max(myAppliedVelocity.y, -myGravityMaxSpeed);
12 myAppliedVelocity.y = 0;
13 float length = std::min(myAppliedVelocity.Length(), myHorizontalMaxSpeed);
14 myAppliedVelocity.Normalize();
15 myAppliedVelocity *= length;

Base Movement Showcase dropdown

This video demonstrates the base movement foundation, showing the interaction between gravity, grounded state resets, and the responsive jumping mechanics before any specialized abilities are applied.

Card Systems & Combat Design dropdown

Following the core loop of 'Neon White,' every card in Snabb Grabb serves a dual purpose: a weapon with limited ammunition and a powerful movement ability triggered by 'burning' the card. This gives the player multiple ways to strategize through each level, rewarding experimentation while keeping the movement mechanics tight and predictable.

Deterministic Shooting: Physics Sweeps

To ensure 100% accuracy in a high-speed environment, I replaced kinetic bullets with a sweep mechanism. When the player fires, the system performs an immediate physics sweep. If a hit is detected, the enemy is scheduled for destruction after a delay calculated from the weapon's unique bullet speed. This approach allows for entirely simulated bullets that feel physically accurate while remaining deterministic. This works effectively because the enemies in our game are static; for moving targets, more advanced predictive logic would be required to maintain this level of precision.

Ability Hurtboxes & Level Routing dropdown

A core mechanic of the game is that every enemy must be defeated to pass a level. To facilitate this at high speeds, I implemented custom hurtboxes that activate during movement abilities. Hitting an enemy with these volumes results in an instant kill, allowing the player to maintain their momentum without having to slow down. These volumes are tailored to the action, such as wide boxes for dashes or spheres for ground slams. This system is a primary tool for speedrunning, as it allows players to combine precise timing and smart movement with projectile combat to find the most efficient route through a level.

Designer Empowerment & Tuning dropdown

To empower gameplay designers in refining each ability, I ensured nearly every aspect—from dash distance and gravity scales to bullet velocity—was customizable at runtime. This flexibility allows for rapid iteration and 'live' balancing sessions, making it possible to fine-tune the addictive feel of the game without requiring code recompilation.

Movement Abilities & Level Routing dropdown

The core of the gameplay is built around mastering specialized movement abilities. By 'burning' cards, players unlock moves that transform the environment into a high-speed playground. These abilities allow for creative routing and flow-state movement, where the challenge lies in chaining different mechanics together to find the most efficient path through a level.

Ground Slam dropdown

The Ground Slam causes the player to descend at a consistent high speed until they hit an object. To make the ability feel satisfying, I implemented a brief buildup pause on activation to convey weight and force. This pause provides a visual tell for the spherical hurtbox that triggers on impact. This hurtbox destroys enemies and environmental objects in the landing zone, rewarding the player for aggressive vertical movement.

Double Jump dropdown

Double Jumping works as a mid-air extension of the base jump. I designed it to be non-intrusive by applying an upward impulse while maintaining the player's current horizontal velocity and full input control. This allows for precise mid-air course corrections and vertical height gains without killing the momentum of a run.

Dashing & Momentum Falloff dropdown

I developed two distinct dashes: a straightforward horizontal dash for simpler navigation and a directional dash that provides full 3D control. A significant issue during development was that abilities would end abruptly, causing an instant halt that felt jarring. To solve this, I introduced a customizable falloff force. This force smooths out the transition back to standard movement, allowing the player to carry their speed into the next action.

Grappling Hook dropdown

The Grappling Hook uses raycasting to detect objects within range and pulls the player directly toward the hit point to provide a speed boost. This feature opens up a multitude of creative possibilities. It serves as a reliable tool for gaining height or closing distances quickly, which is ideal for crafting a diverse range of level shortcuts.

Teleporting dropdown

The teleport ability is restricted to targeting enemies via raycasting. Simply transporting the player to the target's position felt disorienting and lacked impact. To address this, the ability moves the player close to the enemy and then finishes with a dashing motion. This dash provides a more engaging transition and ensures the player clearly understands they successfully hit the enemy before they move on to their next target.

The Bomb dropdown

The Bomb is the most complex ability, repurposing the bullet sweep logic to trigger an explosion on impact. When caught in the blast, the player is propelled upward by a predetermined amount influenced by current velocity. The horizontal displacement is determined by the player's distance from the explosion center. This distance-based calculation allows skilled players to use the blast for massive level skips and advanced routing.

Project Reflection

The goal was to create an addictive gameplay loop where the challenge came from mastering physics to shave milliseconds off a run. By combining responsive movement with a simple web server for high scores, we saw a competitive atmosphere during testing. This validation showed that the core mechanics were solid, rewarding players for finding the most efficient lines through the geometry and prioritizing feel over perfect physics simulation. Developing these abilities was a constant collaboration with level designers. Since abilities were gated by card placement, I ensured every variable—from ground slam buildup to dash falloff distance—was tweakable at runtime. This allowed for rapid iteration, ensuring levels had a clear main path while still supporting emergent shortcuts. Looking back, I would architect the card system more modularly to simplify the player logic by decoupling ability-specific components. I would also focus more on camera detailing, such as adding a 'squish' effect when landing a slam to further emphasize the impact. While the mechanics are tight, adding this polish alongside improved VFX and UI would further bridge the gap between a technical prototype and a finished experience.