Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions core/src/com/agateau/pixelwheels/GamePlay.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ public class GamePlay {
// speed
public float aiSpeedLimiter = 0.8f;

public float extremeSpeedLimiter = 0.5f;

public boolean oneLapOnly = false;
public boolean freeCamera = false;

Expand Down
11 changes: 0 additions & 11 deletions core/src/com/agateau/pixelwheels/racer/AIPilot.java
Original file line number Diff line number Diff line change
Expand Up @@ -197,17 +197,6 @@ private void updateAcceleration() {
Vehicle vehicle = mRacer.getVehicle();
vehicle.setAccelerating(true);
vehicle.setBraking(false);

// If we are better ranked than a player, slow down a bit
boolean needLimit = false;
for (Racer playerRacer : mGameWorld.getPlayerRacers()) {
if (Racer.compareRaceDistances(mRacer, playerRacer) > 0) {
needLimit = true;
break;
}
}
float limit = needLimit ? GamePlay.instance.aiSpeedLimiter : 1f;
vehicle.setSpeedLimiter(limit);
}

private void updateDirection() {
Expand Down
4 changes: 4 additions & 0 deletions core/src/com/agateau/pixelwheels/racer/Vehicle.java
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,10 @@ public void setSpeedLimiter(float speedLimiter) {
mSpeedLimiter = speedLimiter;
}

public float getSpeedLimiter() {
return mSpeedLimiter;
}

/** Returns the angle the car is facing */
public float getAngle() {
return AgcMathUtils.normalizeAngle(mBody.getAngle() * MathUtils.radiansToDegrees);
Expand Down
36 changes: 35 additions & 1 deletion core/src/com/agateau/pixelwheels/racescreen/GameWorldImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import com.agateau.pixelwheels.Assets;
import com.agateau.pixelwheels.Constants;
import com.agateau.pixelwheels.GamePlay;
import com.agateau.pixelwheels.GameWorld;
import com.agateau.pixelwheels.PwGame;
import com.agateau.pixelwheels.bonus.Bonus;
Expand Down Expand Up @@ -183,6 +184,40 @@ public GameStats getGameStats() {

@Override
public void act(float delta) {
// limit speed one before another, propotional to the distance between them
final int distancePerLap = mTrack.getLapPositionTable().getSectionCount();
mRacers.sort(sRacerComparator);
Racer racerBehind = null;
for (int i = mRacers.size - 1; i >= 0; i--) {
final Racer racer = mRacers.get(i);
if (racer.getLapPositionComponent().hasFinishedRace()) {
break; // this racer has finished, all racers ahead of it must have finished too
}
if (racerBehind == null) {
racer.getVehicle().setSpeedLimiter(1);
} else {
final LapPositionComponent p1 = racer.getLapPositionComponent();
final LapPositionComponent p2 = racerBehind.getLapPositionComponent();
final float ddiff =
(p1.getLapCount() - p2.getLapCount()) * distancePerLap
+ p1.getLapDistance()
- p2.getLapDistance();
assert ddiff >= 0;
if (ddiff > distancePerLap) {
// more than one lap, spare the aheader for speed limit
racer.getVehicle().setSpeedLimiter(1);
} else {
racer.getVehicle()
.setSpeedLimiter(
racerBehind.getVehicle().getSpeedLimiter()
* Math.max(
GamePlay.instance.extremeSpeedLimiter,
1.0f - ddiff / distancePerLap));
}
}
racerBehind = racer;
}

// fixed time step
// max frame time to avoid spiral of death (on slow devices)
float frameTime = Math.min(delta, 0.25f);
Expand Down Expand Up @@ -214,7 +249,6 @@ public void act(float delta) {
}

if (haveAllRacersFinished()) {
mRacers.sort(sRacerComparator);
setState(GameWorld.State.FINISHED);
}
}
Expand Down