Skip to content

Commit

Permalink
Do not draw slightly rotated vehicles on the start line
Browse files Browse the repository at this point in the history
  • Loading branch information
agateau committed Aug 11, 2023
1 parent c845308 commit 545a407
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 6 deletions.
4 changes: 4 additions & 0 deletions .changes/unreleased/Changed-20230811-081227.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
kind: Changed
body: Vehicles are no longer drawn slightly rotated on the start line, making them
look better.
time: 2023-08-11T08:12:27.301161038+02:00
9 changes: 7 additions & 2 deletions core-tests/src/com/agateau/utils/tests/AgcMathUtilsTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,12 @@ public void testLineDoesNotCrossSegment() {
@Test
public void testSnapAngle() {
assertThat(AgcMathUtils.snapAngle(92f), is(90f));
assertThat(AgcMathUtils.snapAngle(87f), is(90f));
assertThat(AgcMathUtils.snapAngle(183f), is(180f));
assertThat(AgcMathUtils.snapAngle(182f), is(180f));
assertThat(AgcMathUtils.snapAngle(-89f), is(-90f));
assertThat(AgcMathUtils.snapAngle(-92f), is(-90f));

// Untouched values
assertThat(AgcMathUtils.snapAngle(87f), is(87f));
assertThat(AgcMathUtils.snapAngle(183f), is(183f));
}
}
4 changes: 2 additions & 2 deletions core/src/com/agateau/pixelwheels/racer/VehicleRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ public void init(CellFrameBufferManager manager) {

private void drawBodyToCell(Batch batch, Body body, TextureRegion region) {
float angle = body.getAngle() * MathUtils.radiansToDegrees;
// Snap angles so that the vehicles do not slightly rotated when facing north, south, east
// or west. This is especially useful at startup.
// Snap angles so that the vehicle body textures are not drawn slightly rotated when facing
// north, south, east or west. This is especially useful at startup.
angle = AgcMathUtils.snapAngle(angle);
float xOffset =
(body.getPosition().x - mVehicle.getPosition().x) / Constants.UNIT_FOR_PIXEL;
Expand Down
9 changes: 7 additions & 2 deletions core/src/com/agateau/utils/AgcMathUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ public class AgcMathUtils {
public static final float msToKmh = 3600 / 1000f;
public static final float kmhToMs = 1 / msToKmh;

private static final float SNAP_ANGLE_THRESHOLD = 2;

/** Wrap angles if they are less than 0 or greater than 360 */
public static float normalizeAngle(float angle) {
return modulo(angle, 360);
Expand Down Expand Up @@ -223,10 +225,13 @@ public static boolean rectangleContains(Rectangle rect, Vector2 position, float
return true;
}

/**
* Snap angle when its value is close to a multiple of 90°. "Close" means a difference of less
* than SNAP_ANGLE_THRESHOLD.
*/
public static float snapAngle(float value) {
value = normalizeAngle(value);
float snappedValue = MathUtils.round(value / 90f) * 90f;
if (Math.abs(snappedValue - value) < 2) {
if (Math.abs(snappedValue - value) <= SNAP_ANGLE_THRESHOLD) {
return snappedValue;
}
return value;
Expand Down

0 comments on commit 545a407

Please sign in to comment.