Cobo Makes Games blog

How to make combat feel good

How we made combat feel good in our indie game Mytheria: hitstop, hit flash, knockback and screen shake, with real frame data you can try yourself.

A three-hit sword combo with hitstop, hit flash and knockback in Mytheria
On this page
  1. The short answer
  2. Why most hits feel weak
  3. Make the attack move the attacker
  4. Knockback: hand the momentum to the enemy
  5. Hit flash: turn the enemy white on the exact frame
  6. What is hitstop, and how long should it be?
  7. Screen shake: smaller than you think, inside the hitstop
  8. Make enemies lean when they get hit
  9. Hit effects that show which way you hit
  10. Big enemies should push back
  11. It still has to read at night
  12. How we do hitstop in Godot
  13. Use it in your own game
  14. A checklist for satisfying combat

Our sword hits used to feel light. You swung, a number popped up, the enemy blinked and squashed a little, and the whole screen jumped. Everything worked, but it never felt like you'd actually hit something.

This is how we made combat feel good in Mytheria, our pixel-art co-op game. Every clip below is from the game, and every number is the one the game uses.

The short answer

Good combat feel comes from a handful of small effects that all happen on the same frame. This is what one sword hit does in Mytheria:

  • A swing pulls you about 16 pixels forward.
  • On contact, 80 percent of what's left of that pull goes into the enemy's knockback.
  • The enemy turns cream for 8 frames, about 133 milliseconds.
  • Both fighters hold still for 4 frames of hitstop, and the screen shake happens inside that pause.
  • The enemy tilts away from the blow, about 1.3 degrees for every pixel it's pushed.
  • A short stroke cuts across the swing to show which way you hit.

Big enemies get less of all of it, and push you back instead. Below is the same swing on the same training dummy, before and after we rebuilt it.

Drag the line to compare before and now

Real time. On the left, the hit as it was. On the right, the hit as it is now. Same weapon, same dummy, same input.

Why most hits feel weak

A hit is two bodies trading weight. When two things collide, the energy should go somewhere you can see, mostly into the target and a little into the attacker and the camera. Most weak hits stop dead instead, and the energy goes nowhere.

Here is the hit built up one layer at a time. Every step is a real clip from the game with one more effect switched on. Try quarter speed too.

Choose a step to switch on the next effect

Every effect off. The damage number is the only sign that anything happened.

How the numbers themselves stay readable in a busy fight is in damage numbers that read at a glance.

Make the attack move the attacker

The first thing we changed is that a sword swing now moves your body. A blade swing pulls you about 16 pixels forward over a fifth of a second, fast at first and then easing out. Heavy weapons pull 11, the harpoon's thrust 14, and ranged weapons do the opposite, with a small step back when you shoot.

That step gives the swing weight. Without it the blade moves while your character stands still, and the attack reads as light and floaty.

The lunge must never give you extra reach, or it would change the fight as well as the feel. The game checks every hit from where you stood before the lunge carried you, so the reach is the same as before.

Knockback: hand the momentum to the enemy

If the swing connects, it shouldn't keep carrying you forward. When the blade hits, we cut what's left of your lunge to 20 percent and add the rest to the dummy's knockback, so you stop as the dummy starts to move.

The knockback itself is a short slide of about a tenth of a second. Jumping the dummy straight to its new spot looks like a glitch.

Hit flash: turn the enemy white on the exact frame

The flash is the oldest trick there is, and we still think it's the most important one. The struck creature turns a solid cream colour on the exact frame of contact. Even one frame of delay reads as lag.

A plain solid colour works better than anything fancier. The one thing we added is light: our flash lights itself, so at night it stays bright while the world around it goes dark.

Step through a single hit below, frame by frame. The bars show what each effect is doing on every frame.

One sword hit, frame by frame

Contact

Drag along the timeline, or step through it with the buttons

Flash
Hitstop
Mark
Tilt
Real game frames at 60 per second, from the arena we use to tune fights. Frame 0 is the first frame of contact.

The flash lasts 8 frames on a normal hit, which is about 133 milliseconds, and 11 on the third hit of a combo. We keep it short on purpose. In Mytheria, pale and white also mean "you can't hurt this", so a flash only reads as damage because it's brief and always tied to a hit.

What is hitstop, and how long should it be?

Hitstop (or hit stop) is the tiny pause when both fighters freeze on contact. Ours is 4 frames for a sword, about 67 milliseconds at 60 frames per second. Heavy weapons hold for 5, a harpoon thrust for 3 and ranged weapons for 1, and a kill adds a few more frames. Without it, every hit feels like the blade slid off.

Our advice is to start smaller than you think. A long freeze reads as lag, and in a fast fight you'll see dozens of them a minute.

Screen shake: smaller than you think, inside the hitstop

Throwing the whole view at full strength on the contact frame and snapping it back reads as a mistake (we wrote a whole post on how to make screen shake feel good). Our jolt eases in over a frame, wobbles about one and a half times inside the stop, and settles within 60 milliseconds after it. Almost all of the shake happens while everything is frozen, so your eyes keep track of the fight.

Make enemies lean when they get hit

When something gets hit, it leans away from the blow. We don't draw a hurt frame for every creature. We rotate the sprite in code, about 1.3 degrees for every pixel it gets shoved, and ease it back upright over a fifth of a second.

The rotation breaks the pixel outline a little, and we like the jagged edge because it reads as shock. It also works on every creature we add later, with no extra art.

Big creatures lean less. The tilt is scaled by the creature's size, so a small dummy leans 17 to 24 degrees, a medium one 12 to 14, and a boss only 2 or 3. A boss with the same lean as a rabbit looks like it's about to fall over.

Quarter speed. The same blade and the same tilt rule: the small dummy leans hard and slides away, while the boss barely leans and the player bounces off it.

Hit effects that show which way you hit

Every hit leaves a short tapered stroke across the swing, which shows the direction of the blow. The stroke is about 1.3 times the height of the target, so it scales with what you're hitting, and it fades with the flash.

A longer line, or a beam across the whole screen, looks dramatic in a still and like a rendering bug in motion, so we keep the strokes short.

We also keep these marks in colours nothing else uses. Magenta and violet are only used for your hits. Red, blue and gold are the colours of danger warnings in Mytheria, so a hit mark must never look like one.

Big enemies should push back

When you hit something much heavier than you, you should feel it (more in how to make big enemies feel heavy). Every creature has a mass, and the push is split between the two bodies. A small thornling gets shoved about 28 pixels, while a Rune Sentinel moves about 8 and you bounce off it.

Try it below. These are the game's own numbers for one sword hit.

Your character
Thornling

Pick a creature to hit it with the same sword swing

Creature is pushed

You bounce back

One blade hit landing mid-swing, with each creature's real weight. The distances are drawn at the game's own scale. Anything heavier than your swing starts pushing you back.

Bouncing off a big enemy brings its own problem, because hitting it over and over builds tension that doesn't let go until it dies. So the third quick blade hit on anything that needs more than three hits sets off a discharge that throws you both apart. That releases the tension and gives you a moment to reposition if the boss is winding up.

It still has to read at night

All of this is easy to read in daylight on plain grass. Mytheria has nights and fog, and a hit has to read there too, even inside a bullet pattern. The self-lit flash handles that, following the same rule as the rest of our pixel art lighting.

The same hit at night. The flash lights itself, so it stays cream instead of going grey.

How we do hitstop in Godot

Mytheria is made in Godot, and our hitstop never pauses the game or touches the engine's time scale. The world keeps running, and only the two fighters' drawings hold their pose for those few frames.

This is important in co-op. The freeze comes from the shared hit event, so every player sees the same hold on the same hit, and nobody else's game stops while you land a combo. It also makes accessibility simple: players who turn on Reduced motion in our settings skip the freeze and get calmer flashes, and screen shake has its own switch.

Use it in your own game

The hitstop from this post is free to use: Hitstop, a Godot 4 add-on that freezes only the fighters you name for a few frames while the rest of the world keeps running, and puts every animation back exactly as it was. The shake that goes inside it is Screen Shake, and the numbers are Damage Numbers. All three are MIT licensed.

A checklist for satisfying combat

  • Ask where the energy goes. If a hit stops dead, fix that first.
  • Move the attacker, then hand the movement over on contact.
  • Keep the flash plain, on the contact frame, and short.
  • Hide the shake inside the hitstop.
  • Make every effect smaller than you think.
  • Test it where players actually fight, at night and in a crowd, not only in an empty room.

Sound matters just as much: how a hit is built from layered sounds is in game sound effects.

Further reading

Wishlist Mytheria

Mytheria is a pixel-art co-op adventure for one to four players, coming to Steam for Windows, macOS and Steam Deck. A wishlist is the best way to follow it and to help us.

See the game Join the Discord

Mytheria

Coming to Steam

The store page isn't up yet. Leave your email and we'll tell you when you can wishlist Mytheria on Steam.

We'll send that one email and never share your address.

Windows · macOS · Steam Deck