/// This function block describes a ball.
/// A ball has always a current impulse, which keeps it moving.
/// In our case it doesn't even slow down.
FUNCTION_BLOCK FB_Ball EXTENDS FB_ObjectBase
VAR_INPUT
END_VAR
VAR_OUTPUT
VAR
iDeltaX: INT;
iDeltaY: INT;
VAR_TEMP
udiTimeNow : UDINT;
udiTimeDiff : UDINT;
udiTimeNow := SysTimeGetMs();
IF udiTimeOld = 0 THEN
udiTimeOld := udiTimeNow;
END_IF
udiTimeDiff := udiTimeNow - udiTimeOld;
iDeltaX := REAL_TO_INT(vecIn.rVX * UDINT_TO_REAL(udiTimeDiff));
iDeltaY := REAL_TO_INT(vecIn.rVY * UDINT_TO_REAL(udiTimeDiff));
IF (iDeltaY >= 12) THEN
iDeltaY := 12;
IF (iDeltaY <= -12) THEN
iDeltaY := -12;
IF posOld.xValid AND (iDeltaX <> 0 OR iDeltaY <> 0) THEN
posOut.iXPos := posOld.iXPos + iDeltaX;
posOut.iYPos := posOld.iYPos + iDeltaY;
vecOut := vecIn;
IF (posOut.iYPos >= 768) THEN
posOut.iYPos := 768;
IF (posOut.iYPos <= 0) THEN
posOut.iYPos := 0;
// Call generic implementation of base fb
SUPER^();