NAME
Physics::Balls::Strike - one shot, as the integers a client sends
VERSION
Version 0.03
SYNOPSIS
my $strike = Physics::Balls::Strike->new(ball => 0, dx => 707107, dy => -707107, power => 640, sx => 0, sy => 300);
my $out = $strike->play($world, \@layout);
# a delivery whose surface changes once it passes y = 32.007 m
my $swept = Physics::Balls::Strike->new(ball => 7, dx => 0, dy => 1_000_000, power => 500, sy => 400,
adjust => 1, adjust_at => 3200700, adjust_axis => 1, adjust_dir => 1, adjust_mu => 600, adjust_curve => 350);
DESCRIPTION
The direction is dx, dy in plus or minus 1,000,000 (normalised inside the engine with one square root), power 0 to 1000 (the speed is 0.3 + (power/1000)^2 (vmax - 0.3) so low power is fine-grained), and the tip offset sx, sy in thousandths of the radius, clamped to half a radius. Integers, so that a client cannot send a float two encoders would spell differently. validate refuses anything else with a Physics::Balls::Error rather than dying.
The adjust
A shot may say that the surface under the struck ball changes partway down its run: once the ball's centre crosses a line, in one direction, its friction and its curve are multiplied by two factors, once, for the rest of the shot. That is a swept path, a fast strip or a damp patch; the engine does not know which. The crossing is an adjust event in the outcome, and every segment before it is bit-identical to the same delivery with no adjust, which is what lets a game show a delivery, ask a question at the line, and then play the same delivery again with the answer applied.
ATTRIBUTES
ball
The id struck, default 0.
dx
dy
power
sx
sy
trace
When true the outcome carries the energy after every event.
adjust
True to apply the adjust; default 0, and then the other adjust fields are ignored.
adjust_at
The line, an integer in hundredths of a millimetre.
adjust_axis
0 for a line of constant x, 1 for a line of constant y; default 1.
adjust_dir
1 to fire when the coordinate increases through the line, -1 when it decreases; default 1.
adjust_mu
adjust_curve
The factors in thousandths, default 1000 (unchanged).
METHODS
validate
my $err = $strike->validate($world, \@layout);
Undef when the shot and the layout are acceptable, else the error. Two balls may sit touching, and a tenth of a millimetre inside each other, because a tight rack rounded to hundredths does that and the engine treats it as contact; any closer is overlap.
rows
The layout as plain rows, whatever it was given as.
play
my $out = $strike->play($world, \@layout);
A Physics::Balls::Outcome, or the Physics::Balls::Error that refused it.