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!).