Vrije Universiteit Brussel - Faculteit Ingenieurswetenschappen

JJ3DLabyrinth


Start met deze code
- vergeet de JJ3D-files niet

Hoe je dit kan uitbreiden:
    voeg de code onderaan toe op de aangegeven plaatsen

Wat je nog meer kan doen:
  1. verander labyrinth (de muren)
  2. voeg objecten toe mbv letters => teken ze in DrawArena2D en DrawArena3D
  3. teken mooiere ghosts
  4. verander spelsnelheid
  5. zorg dat speler niet naar boven of naar beneden kan
  6. verander initiele positie van player en ghost
  7. bepaal wat gebeurt als ghost en player botsen
  8. iets moeilijker: verander random generator van ghost moves


1. Check de muren.
M. vervang
    (* check walls for player *)
        IF NOT IsWall(viewerX, viewerY, dX, dY) THEN
          viewerX := viewerX + dX;
            viewerY := viewerY + dY;
        END;


2. Pak dingskes.
N. voeg toe
            
(* check objects in arena *)
        row := RowIndex(viewerY);
        column := ColumnIndex(viewerX);
        IF (row > 0) AND (row <= ARENA_HEIGHT*2+1) AND (column > 0) AND (column <= ARENA_WIDTH*2+1) THEN
          (* player is within arena *)
          CASE arena[row][column] OF
            'b' :
                WrStr("BUMPED INTO B");
                arena[row][column] := ' ';  (* delete object *)
          ELSE
          END; (* case *)
        END;


3. Haal de geest uit de fles.
D1. voeg toe 
   
Disc2D(ghostX, ghostY, 5, ghostColor);
D2. voeg toe 
  Cilinder(ghostX, ghostY, 0, 50, 600, ghostColor, TRUE);
M. voeg toe na viewerX-code 
          (* ghost moves: do a random move by which you don't bump into a wall *)
        ctr:=0;
        REPEAT
            ghostAngle := ghostAngle + VAL(INTEGER, RANDOM(30)) - 15;   (* change angle between -15 & 15 *)
            PolarToCartesian(GHOST_SPEED, ghostAngle, dX, dY);(* calculate X and Y *)           
            INC(ctr);
        UNTIL NOT (IsWall(ghostX, ghostY, 2*dX, 2*dY) OR OutsideArena(ghostX, ghostY, dX, dY)) OR (ctr > 20); (*   *)
      IF ctr < 20 THEN
          ghostX := ghostX + dX;
          ghostY := ghostY + dY;
        END;


4. Laat de geest je niet vangen.
N. voeg toe
        (* does player bumps into a ghost ? *)
        IF Distance(ghostX, ghostY, viewerX, viewerY) < 200 THEN
          WrStr("GHOST AND PLAYER COLLIDE!!"); WrLn;
        END;


5. Pijl afschieten.
L1. voeg toe
            | ORD('a'), ORD('A'):  (* arrow *)
                  arrowIsShot := TRUE;
                  arrowX := viewerX;
                  arrowY := viewerY;
                  arrowAngle := Radians2Degrees(viewerAngle);
D1. teken pijl
  
IF arrowIsShot THEN
    Arrow2D(arrowX, arrowY, arrowAngle, 600, arrowColor, 1, 12);
  END;
D2. voeg toe
  IF arrowIsShot THEN
      PolarToCartesian(ARROW_LENGTH, arrowAngle, dX, dY);
      Arrow3D(arrowX, arrowY, 200, arrowX+dX, arrowY+dY, 200, arrowColor, 10, 50);
  END;
M. voeg toe
        (* arrow moves *)
        IF arrowIsShot THEN
            PolarToCartesian(ARROW_SPEED, arrowAngle, dX, dY);
            IF IsWall(arrowX, arrowY, dX, dY) THEN
              arrowIsShot := FALSE;
            ELSE
              arrowX := arrowX + dX;
            arrowY := arrowY + dY;
            END;
        END;


6. Check of ghost geraakt door pijl.
N. doe hetzelfde als check tussen ghost en player...
    bepaal zelf wat er gebeurt


7. Create several ghosts.
B. voeg toe
  NBR_GHOSTS=5;
C. vervang
  ghostX, ghostY, ghostAngle: ARRAY[1..NBR_GHOSTS] OF INTEGER;

D. vervang in DrawArena2D()

  
FOR i := 1 TO NBR_GHOSTS DO
        Disc2D(ghostX[i], ghostY[i], 5, ghostColor);
    END;

D. vervang in DrawArena3D()
    FOR i := 1 TO NBR_GHOSTS DO
        Cilinder(ghostX[i], ghostY[i], 0, 50, 600, ghostColor, TRUE);
    END;

F. vervang
    ghostX[1] := 1*SIZE2D; (* initial coordinates of ghosts *)
    ghostY[1] := 1*SIZE2D;
    ghostAngle[1] := 90;
    ghostX[2] := 2*SIZE2D; (* initial coordinates of ghosts *)
    ghostY[2] := 2*SIZE2D;
    ghostAngle[2] := 90;
    ghostX[3] := 3*SIZE2D; (* initial coordinates of ghosts *)
    ghostY[3] := 3*SIZE2D;
    ghostAngle[3] := 90;
    ghostX[4] := 4*SIZE2D; (* initial coordinates of ghosts *)
    ghostY[4] := 4*SIZE2D;
    ghostAngle[4] := 90;
    ghostX[5] := 5*SIZE2D; (* initial coordinates of ghosts *)
    ghostY[5] := 5*SIZE2D;
    ghostAngle[5] := 90;
M. vervang
    FOR i := 1 TO NBR_GHOSTS DO
          (* ghost moves: do a random move by which you don't bump into a wall *)
          ctr:=0;
          REPEAT
              ghostAngle[i] := ghostAngle[i] + VAL(INTEGER, RANDOM(30)) - 15;   (* change angle between -15 & 15 *)
              PolarToCartesian(GHOST_SPEED, ghostAngle[i], dX, dY);(* calculate X and Y *)           
              INC(ctr);
          UNTIL NOT (IsWall(ghostX[i], ghostY[i], 5*dX, 5*dY) OR OutsideArena(ghostX[i], ghostY[i], dX, dY)) OR (ctr > 20); (*   *)
        IF ctr < 20 THEN
            ghostX[i] := ghostX[i] + dX;
            ghostY[i] := ghostY[i] + dY;
          END;
        END;
N. vervang
        FOR i := 1 TO NBR_GHOSTS DO
           IF Distance(ghostX[i], ghostY[i], viewerX, viewerY) < 200 THEN
            WrStr("GHOST AND PLAYER COLLIDE!!"); WrLn;
          END;
        END;



8. Voeg een score toe.
C. voeg toe in VAR sectie (variabele score)
  score: INTEGER;

F. voeg toe in initialisatiesectie (score start op 0)
  score:= 0;
G. voeg toe (naam van score-veldje in controlepaneel)
  SetControlName(6, "score");

I. voeg toe (waarde van score-veldje in controlepaneel)
  SetControlValue(6, score);
M. verander de score als gepast
  score := score + 1;
of
  score := score - 1;