diff --git a/SpaceCadetPinball/TFlipper.cpp b/SpaceCadetPinball/TFlipper.cpp index d93259e..5fd75bf 100644 --- a/SpaceCadetPinball/TFlipper.cpp +++ b/SpaceCadetPinball/TFlipper.cpp @@ -137,7 +137,7 @@ void TFlipper::TimerExpired(int timerId, void* caller) auto flip = static_cast(caller); int bmpCountSub1 = flip->ListBitmap->GetCount() - 1; - auto newBmpIndex = static_cast(floor((pb::time_now - flip->InputTime) / flip->TimerTime)); + auto newBmpIndex = static_cast(floor(flip->FlipperEdge->flipper_angle(pb::time_now) / flip->FlipperEdge->AngleMax * bmpCountSub1 + 0.5)); if (newBmpIndex > bmpCountSub1) newBmpIndex = bmpCountSub1; if (newBmpIndex < 0) @@ -155,7 +155,7 @@ void TFlipper::TimerExpired(int timerId, void* caller) } if (flip->MessageField == 2) { - flip->BmpIndex = bmpCountSub1 - newBmpIndex; + flip->BmpIndex = newBmpIndex; if (flip->BmpIndex <= 0) { flip->BmpIndex = 0; diff --git a/SpaceCadetPinball/TFlipperEdge.cpp b/SpaceCadetPinball/TFlipperEdge.cpp index af2874a..d70d312 100644 --- a/SpaceCadetPinball/TFlipperEdge.cpp +++ b/SpaceCadetPinball/TFlipperEdge.cpp @@ -419,19 +419,17 @@ float TFlipperEdge::flipper_angle(float timeNow) { if (!FlipperFlag) return Angle1; - float angle = (Angle1 - Angle2) / AngleMax * AngleMult; - if (angle < 0.0f) - angle = -angle; - if (angle >= 0.0000001f) - angle = (timeNow - InputTime) / angle; + float currentAngleDuration = fabsf((Angle1 - Angle2) / AngleMax * AngleMult); + float currentAngleRatio; + + if (currentAngleDuration >= 0.0000001f) + currentAngleRatio = (timeNow - InputTime) / currentAngleDuration; else - angle = 1.0; + currentAngleRatio = 1.0; - angle = min(1, max(angle, 0)); - if (FlipperFlag == 2) - angle = 1.0f - angle; - return angle * AngleMax; + currentAngleRatio = min(1.0f, max(currentAngleRatio, 0.0f)); + return currentAngleRatio * (Angle1 - Angle2) + Angle2; } int TFlipperEdge::is_ball_inside(float x, float y) @@ -483,8 +481,7 @@ void TFlipperEdge::SetMotion(int code, float value) default: break; } - if (!FlipperFlag) - InputTime = value; + InputTime = value; FlipperFlag = code; AngleStopTime = AngleMult + InputTime; }