Hyperactive Tennis

A fast-paced single player tennis game.

Ingame smash


HTML5 WebGL capable browser required. Suggested to play in fullscreen (click the button "fullscreen" below the render area).




You play tennis in single player mode for one set with tie break. There are three difficulty levels: ROOKIE for training, PRO and "NO. 1" for the real challenge.


The game is keyboard only.

Menu select/Next screen Return
Menu navigation Arrow keys
Back to title screen B
Hit Ball C
Lob X
Running around Arrow keys

The levels ROOKIE, PRO and "NO. 1" are selected with left/right arrow keys.

The key "C" hits the ball. The game automatically selects service, normal stroke, volley and smash.

The key "X" plays a lob.

Direction of shot is determined by where your racket is in its swing when you hit ball. So for a cross you have to to start swing earlier than for a longline.


The game was developed as native Linux application in 100% C++ and OpenGL ES 2 (emulation) and when finished, transpiled to html5 utilizing the amazing emscripten.

Only YOU play lobs. The CPU does NOT. Main reason is, always running back from net disrupted the gameplay.

The lobs (key X) you have to carefully aim, else they will go astray. For the other strokes (key C) you get some help from a stroke solver unless you present it with problems for there is no solution. Then they go astray or hit net.

Try out things. Its fun ! More possibilities than you might think at first. E.g. strength of hit and therefore shotspeed depends on factors such as: The stroke type, where you are standing in court (distance to net), if you hit ball while its still ascending, if you hit ball with sweetspot of racket, if you hit ball before you or if it nearly passed you and so on. When at net you could make a ball fast or make it kind of cross volley stop.

All music and sfx made with a Novation Circuit. Title track is Blazing Rackets. "New game" music is start of Farewell, "you win" music is start of Good Night.

Plan is to implement new ideas for CPU opponents over time and to select from them for playing. Funny thing about current CPU opponent is, even it might look like more, its actually being held together just by minimizing running distance (in intercepting a ball). So I term this opponent "LAZY".

Version history

0.10 Initial version.
0.11 Now correct ball over net height calculation in cpu evaluating shot opportunities (misplaced sign in equations). Effect: cpu hits net less often.
0.12 Fixed point counting when missing service (reproduce in old version: service, throw ball, at highest point hit, miss, wrong score).
0.13 Detect cpu service out (code was there but was not enabled. Since most of cpu services are in this was not obvious). After enabling fixed point counting when cpu service out.
0.14 Fixed another ball out bug. Was responding to wrong event. Symptom was: You played lob, cpu played smash. Cpu smash was wide out, still cpu got the point.
0.20 Fixed cpu passing shots and half volleys which are >1.5 <2 meters high when hit by increasing maximum ball over net height for passing shot in equations from 1.5 meters to 2.2. Effect: Cpu makes less errors when you feed it with lobs.
Added a third difficulty level: "No. 1".
Cpu has tendency to hit return some distance behind baseline. Limited this behavior for "No. 1" difficulty level.
Reworked lob swing interpretation. Effect: Now easier to target whole horizontal range, e.g. the middle.
Speed limit for smash depending on difficulty level.
In evaluating shot opportunities, even when skipping because of numerical issues for one, now all other opportunities are checked.
Increased hit strength penalty for passing shot if having to play from over shoulder height (not a smash).
Added further "thinking" delays for cpu before running backwards or having to switch sideways direction.
0.21 Fixed case where cpu is missing its service, then immediately making a normal smash which is called in even if outside service field. Not allowing cpu feigning a stroke and then making another :-)
0.22 Ball exchange occurred which ended suddenly because ball seem to fell flat and therefore second bounce very short after first bounce. Looked like a numerical problem. Added some safeguards.
0.23 Replaced "cpu makes point" sound.
0.24 Observations: Player never hits net and occasionally his shots visually seem to pass through net. Associated bug: Net collisions were only detected for CPU shots (!). Fixed. Those too low balls passing through net created some second bounce short after first bounce cases.
0.25 Fix in 0.24 revealed bugs in stroke solver: If player was standing wide out (sideways) of court when hitting ball he most probably hit net. Same for CPU. Rewrote those parts. Effect: I have yet to see a net hit again :-( If I want those back I probably have to add them as artificial errors. Nice thing is CPU might now go wider out of court to make winners, e.g. in a return or to play e.g. a backhand cross on the forehand side. Seems now pretty close to bug freeness of basics.