Vrije Universiteit Brussel - Faculteit Ingenieurswetenschappen

JJ3DRace


Start met de code JJ3DRace.mod
- vergeet de JJ3D-files niet

Dingen die vrij zo kan aanpassen:
- vorm van het circuit
- eigenschappen (gewicht, motorkracht) van de wagen, dit heeft wel pas effect als je opdracht (2.) gedaan hebt
- kleuren
- objecten bijplaatsen
...


Opdrachtjes om het spel te verbeteren:

1. Voeg een pijl toe aan minimap.
P. Voeg toe
 
    Arrow2D(viewerX, viewerY, VAL(INTEGER, viewerAngle * 180.0 / pi), 4000, BLACK, 1, 10);

(we zetten viewerAngle om van radialen naar graden)  
  

2. Maak optrekken en remmen realistischer.
R2. vervang (optrekken)
 
    car.v := car.v + 1.0;
    car.v := car.v + car.force / car.mass * DELTA_T;
R4. vervang  (remmen)
    car.v := car.v - 2.0;
    car.v := car.v - car.break / car.mass * DELTA_T;
   

3. Wrijving.
N. voeg toe
   friction := 15.0;
   airfriction := 2.0;
   car.v := car.v - (friction * car.v + airfriction * car.v * car.v) / car.mass * DELTA_T;
             

3b. Verhoog wrijving wanneer wagen off-road gaat.
N. vervang 
      
friction := 15.0;
    IF onTrack THEN
        friction := 15.0;
    ELSE
        friction := 250.0;
    END;   



4. Verminder tractie off-road.
N. voeg toe
(grijs = huidige code)

    IF onTrack THEN
        friction := 15.0;
        traction := 1.0;
    ELSE
        friction := 250.0;
        traction := 0.3;
    END;
R2. voeg toe (optrekken)   
    car.v := car.v + traction * car.force / car.mass * DELTA_T;
R4. voeg toe  (remmen)
    car.v := car.v - traction * car.break / car.mass * DELTA_T;
   
Zelf: zorg ervoor dat wagen moeilijker draait off-road.


5. Auto wordt beschadigd wanneer hij off-road gaat.
N. voeg toe
    IF (car.v > 0.0) THEN
        health := health - 0.5 * DELTA_T; (* 0.5% decay per second *)
    END;
R2. Voeg toe (extra schade wanneer je off-road gas geeft)
  
  IF (car.v > 0.0) THEN
        health := health - 1.0 * DELTA_T; (* additional 1.0% decay per second *)
    END;


Zelf: zorg er natuurlijk voor dat de 2 bovenstaande codeblokken alleen worden uitgevoerd als je van de weg afgaat.
Optioneel: zorg ervoor dat de wagen meer schade krijgt wanneer hij sneller rijdt.
 
R2. Voeg toe (trager optrekken wanneer wagen schade heeft)
   
car.v := car.v + (health / 100.0) * traction * car.force / car.mass * DELTA_T;

Optioneel: slijtage aan de remmen?


6. Zet de laatste/beste lap time op de controlebalk bovenaan.
Zelf: Hoe zou je dit doen?


7. Voeg front & wielen toe.
A. voeg toe
IMPORT Wimdows;
FROM JJ3D IMPORT SCHERM_BREEDTE, SCHERM_HOOGTE;
D. voeg toe
PROCEDURE DrawFront(angleDiff: REAL);
  CONST B1 = 180; B2 = 220; L1 = 70; L2 = 110; PW = (B1 + B2)/2+5; BW = 44.; LW = 50.;       
  VAR ptsX, ptsY: ARRAY[1..8] OF INTEGER;
BEGIN
    (* the constants 8, 10 and 20 are correction terms for the perspective *)
    ptsX[1] := SCHERM_BREEDTE/2-PW-VAL(INTEGER, BW)/2; ptsY[1]:= SCHERM_HOOGTE;
    ptsX[2] := SCHERM_BREEDTE/2-PW+8+ VAL(INTEGER, -BW/2. * cos(angleDiff)+ LW * sin(angleDiff)); ptsY[2]:= SCHERM_HOOGTE-VAL(INTEGER, +BW/2. * sin(angleDiff)+LW * cos(angleDiff));
    ptsX[3] := SCHERM_BREEDTE/2-PW+8+ VAL(INTEGER, BW/2. * cos(angleDiff)+LW * sin(angleDiff)); ptsY[3]:= SCHERM_HOOGTE-VAL(INTEGER, -BW/2. * sin(angleDiff)+LW * cos(angleDiff));
    ptsX[4] := SCHERM_BREEDTE/2-PW+VAL(INTEGER, BW)/2; ptsY[4]:= SCHERM_HOOGTE;
    Wimdows.Polygon(4, ptsX, ptsY, RgbColor(20, 20, 20), TRUE);
   
    ptsX[1] := SCHERM_BREEDTE/2+PW-VAL(INTEGER, BW)/2; ptsY[1]:= SCHERM_HOOGTE;
    ptsX[2] := SCHERM_BREEDTE/2+PW-8+ VAL(INTEGER, -BW/2. * cos(angleDiff)+ LW * sin(angleDiff)); ptsY[2]:= SCHERM_HOOGTE-VAL(INTEGER, +BW/2. * sin(angleDiff)+LW * cos(angleDiff));
    ptsX[3] := SCHERM_BREEDTE/2+PW-8+ VAL(INTEGER, BW/2. * cos(angleDiff)+LW * sin(angleDiff)); ptsY[3]:= SCHERM_HOOGTE-VAL(INTEGER, -BW/2. * sin(angleDiff)+LW * cos(angleDiff));
    ptsX[4] := SCHERM_BREEDTE/2+PW+VAL(INTEGER, BW)/2; ptsY[4]:= SCHERM_HOOGTE;
    Wimdows.Polygon(4, ptsX, ptsY, RgbColor(20, 20, 20), TRUE);

  ptsX[1] := SCHERM_BREEDTE/2-B1; ptsY[1]:= SCHERM_HOOGTE;
    ptsX[2] := SCHERM_BREEDTE/2-B1+10; ptsY[2]:= SCHERM_HOOGTE-L1;
    ptsX[3] := SCHERM_BREEDTE/2-B2; ptsY[3]:= SCHERM_HOOGTE-L1;
    ptsX[4] := SCHERM_BREEDTE/2-B2+10; ptsY[4]:= SCHERM_HOOGTE-L2;
    ptsX[5] := SCHERM_BREEDTE/2+B2-20; ptsY[5]:= SCHERM_HOOGTE-L2;
    ptsX[6] := SCHERM_BREEDTE/2+B2; ptsY[6]:= SCHERM_HOOGTE-L1;
    ptsX[7] := SCHERM_BREEDTE/2+B1-10; ptsY[7]:= SCHERM_HOOGTE-L1;
    ptsX[8] := SCHERM_BREEDTE/2+B1; ptsY[8]:= SCHERM_HOOGTE;
    Wimdows.Polygon(8, ptsX, ptsY, LIGHTBLUE, TRUE);

END DrawFront;
E. voeg toe (onder het VAR symbool)
wheelAngle, dx, dy: REAL;
M. vervang
  
viewerY := viewerY + VAL(INTEGER, car.v * DELTA_T * SCALEFACTOR * cos(viewerAngle));
  viewerX := viewerX + VAL(INTEGER, car.v * DELTA_T * SCALEFACTOR * sin(viewerAngle));
  door:
               
dx := car.v * DELAY_S * SCALEFACTOR * cos(viewerAngle);
          dy := car.v * DELAY_S * SCALEFACTOR * sin(viewerAngle);           
          viewerY := viewerY + VAL(INTEGER,dx);
          viewerX := viewerX + VAL(INTEGER,dy);
            (* angle changes according to angle of wheels and distance *)
          viewerAngle := viewerAngle + dx/1000.0*(wheelAngle-viewerAngle);
N. voeg toe achter DrawEverything();
 
DrawFront(wheelAngle-viewerAngle); (* after DrawEverything, it directly draws on screen! *)

R1. vervang
viewerAngle := viewerAngle - pi/70.0;

  door:
           
IF wheelAngle > -pi/4. THEN
          wheelAngle := wheelAngle - pi/70.0;
       END;

R3. vervang
viewerAngle := viewerAngle + pi/70.0;

  door:
            
IF wheelAngle < pi/4. THEN
          wheelAngle := wheelAngle + pi/70.0;
       END;


Extra opdrachtjes...

X1. Maak van een deel van het circuit een "dirt track"
- Zorg ervoor dat dit deel in het bruin getekend wordt
- Pas de detectie van onTrack en de berekening van friction en traction aan zodat je op het dirty gedeelte minder tractie en meer frictie hebt, maar nog steeds beter dan op het gras


X2. Voeg een Turbo Booster toe
Bijvoorbeeld als volgt (andere manieren mogelijk)
E. voeg toe
    turboPower : REAL;
    turboActive : BOOLEAN;
L. voeg toe
    turboPower := 10.0;
R. voeg toe
    IF( turbo knop ingedrukt ) THEN
       
turboActive := TRUE;
        turboPower :=
turboPower - 1.0 * DELTA_T; (* 1.0 turbo per second used *)
    ELSE
       
turboActive := FALSE;
    END;
R2. Voeg toe
    IF (turboActive AND (turboPower > 0.0)) THEN
        wagen trekt harder op
        ...


X3. Voeg extra objecten toe en zorg dat je ertegen kan botsen
M. voeg toe
    bv. met Cilinder(x0, y0, z0, radius, height, color, fill (-> TRUE of FALSE)) kan je extra palen plaatsen
    Je kan sommige objecten misschien random plaatsen?
P. Voeg toe
  
Zet die objecten ook op de minimap (misschien niet als je verassings-effect wil bekomen...)
N. voeg toe
    FOR i := 1 TO aantal objecten DO
    IF (afstand van (viewerX, viewerY) tot object i = 0) THEN
       car.v := 0.0;
       health := health / 2.0; (* of maak health-aftrek afhankelijk van snelheid *)
    END;
  END;

Je kan dit ook uitbreiden zodat sommige objecten een bonus geven (extra snelheid, health, ...)

X4. Maak de bochten mooier
D. pas aan
      De procedure PieXYToPolygon kan je bv. aanpassen om de binnenkant van een bocht minder scherp te maken (niet gemakkelijk!).