Quantcast
Channel: Library Questions - Processing 2.x and 3.x Forum
Viewing all articles
Browse latest Browse all 2896

Need help with a maze

$
0
0

Hello, I'm working on this maze but I want to make it where you can see the whole maze in the window and can move a ball within it with the mouse. Right now, the camera move around like 1st person within the maze. Are there any other imports I can use because I think it's the type of camera I added?

import queasycam.*;


Player player;
Maze maze;

void setup(){
  size(600, 600, P3D);
  strokeWeight(2);

  player = new Player(this);
  maze = new Maze(20);
  maze.setPlayerAtStart(player);
}

void draw(){
  background(51);
  maze.update();
  maze.display();
  player.update();
}


class Block {
  PVector position;
  PVector dimensions;
  color fillColor;
  boolean visited;

  Block(float x, float y, float z, float w, float h, float d){
    position = new PVector(x, y, z);
    dimensions = new PVector(w, h, d);
    fillColor = color(random(150, 200));
    visited = false;
  }

  void update(){
    float playerLeft = player.position.x - player.dimensions.x/2;
    float playerRight = player.position.x + player.dimensions.x/2;
    float playerTop = player.position.y - player.dimensions.y/2;
    float playerBottom = player.position.y + player.dimensions.y/2;
    float playerFront = player.position.z - player.dimensions.z/2;
    float playerBack = player.position.z + player.dimensions.z/2;

    float boxLeft = position.x - dimensions.x/2;
    float boxRight = position.x + dimensions.x/2;
    float boxTop = position.y - dimensions.y/2;
    float boxBottom = position.y + dimensions.y/2;
    float boxFront = position.z - dimensions.z/2;
    float boxBack = position.z + dimensions.z/2;

    float boxLeftOverlap = playerRight - boxLeft;
    float boxRightOverlap = boxRight - playerLeft;
    float boxTopOverlap = playerBottom - boxTop;
    float boxBottomOverlap = boxBottom - playerTop;
    float boxFrontOverlap = playerBack - boxFront;
    float boxBackOverlap = boxBack - playerFront;

    if (((playerLeft > boxLeft && playerLeft < boxRight || (playerRight > boxLeft && playerRight < boxRight)) && ((playerTop > boxTop && playerTop < boxBottom) || (playerBottom > boxTop && playerBottom < boxBottom)) && ((playerFront > boxFront && playerFront < boxBack) || (playerBack > boxFront && playerBack < boxBack)))){
      float xOverlap = max(min(boxLeftOverlap, boxRightOverlap), 0);
      float yOverlap = max(min(boxTopOverlap, boxBottomOverlap), 0);
      float zOverlap = max(min(boxFrontOverlap, boxBackOverlap), 0);

      if (xOverlap < yOverlap && xOverlap < zOverlap){
        if (boxLeftOverlap < boxRightOverlap){
          player.position.x = boxLeft - player.dimensions.x/2;
        } else {
          player.position.x = boxRight + player.dimensions.x/2;
        }
      }

      else if (yOverlap < xOverlap && yOverlap < zOverlap){
        if (boxTopOverlap < boxBottomOverlap){
          player.position.y = boxTop - player.dimensions.y/2;
          player.velocity.y = 0;
          player.grounded = true;
        } else {
          player.position.y = boxBottom + player.dimensions.y/2;
        }
      }

      else if (zOverlap < xOverlap && zOverlap < yOverlap){
        if (boxFrontOverlap < boxBackOverlap){
          player.position.z = boxFront - player.dimensions.x/2;
        } else {
          player.position.z = boxBack + player.dimensions.x/2;
        }
      }
    }
  }

  void display(){
    pushMatrix();
    translate(position.x, position.y, position.z);
    fill(fillColor, 200);
    box(dimensions.x, dimensions.y, dimensions.z);
    popMatrix();
  }

  void moveDown(){
    position.y += 5;
  }
}

class Player extends QueasyCam {
  PVector dimensions;
  PVector velocity;
  PVector gravity;
  boolean grounded;

  Player(PApplet applet){
    super(applet);
    speed = 0.04;
    dimensions = new PVector(1, 3, 1);
    velocity = new PVector(0, 0, 0);
    gravity = new PVector(0, 0.01, 0);
    grounded = false;
  }

  void update(){
    velocity.add(gravity);
    position.add(velocity);

    if (grounded && keyPressed && key == ' '){
      grounded = false;
      velocity.y = -0.5;
      position.y -= 0.1;
    }
  }
}

class Maze {
  Block[][] blocks;
  Block start;
  Block end;

  Maze(int size){
    blocks = new Block[size][size];

    for (int i=0; i<size; i++){
      for (int j=0; j<size; j++){
        float x = i * 5;
        float y = 0;
        float z = j * 5;
        blocks[i][j] = new Block(x, y, z, 5, 5, 5);
      }
    }

    int row = int(random(1, size-1));
    int col = int(random(1, size-1));
    start = blocks[row][col];

    for (int i=0; i<size*size*size/10; i++){
      if (!blocks[row][col].visited) blocks[row][col].moveDown();
      blocks[row][col].visited = true;

      if (random(0, 1) < 0.5){
        if (random(0, 1) < 0.5 && row > 1) row -= 1;
        else if (row < size-2) row += 1;
      } else {
        if (random(0, 1) < 0.5 && col > 1) col -= 1;
        else if (col < size-2) col += 1;
      }
    }
  }

  void update(){
    for (int i=0; i<blocks.length; i++){
      for (int j=0; j<blocks[i].length; j++){
        blocks[i][j].update();
      }
    }
  }

  void display(){
    for (int i=0; i<blocks.length; i++){
      for (int j=0; j<blocks[i].length; j++){
        blocks[i][j].display();
      }
    }
  }

  void setPlayerAtStart(Player player){
    player.position = PVector.add(start.position, new PVector(0, -15, 0));
  }
}

Viewing all articles
Browse latest Browse all 2896

Trending Articles