Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
    ///////////////////////////////////
    //      The BasketBall Game      //
    //          by WangZuo           //
    ////////////// 2018 ///////////////

     
    ///////////////////////////
    //  Ball & Basket 
    ///////////////////////////
    float BallX = 75;
    float BallY = 20;
    float basketY = random(80, 320); 
    
    ///////////////////////////
    //   physical engine
    ///////////////////////////
    float gravity = 0.6;
    float fallspeed = 8;
    float Xspeed = 0 ;
    int xdirection = 1;  // Left or Right
    int ydirection = 1;  // Top to Bottom
    
    ///////////////////////////////
    //   collision detection 
    ///////////////////////////////
    float distance1 = 0;
    float distance2 = 0;
    float distance3 = 0;
    float puff1Mod;
    float colorT=0;
    
    ////////////////////////   
    //   effects 
    ////////////////////////    
    int[] trailX = new int[10]; //These arrays are used to store previous ball positions, to draw the trail
    int[] trailY = new int[10];
    float effect1=0;
    
    ////////////////////////       
    //   GamePlay 
    ////////////////////////       
    float timeLeft=400; 
    boolean play = false; 
    float score=0;
    float highScore = 0;
    
    
    void setup(){
      size(400,400);
      frameRate(60);
      noStroke();
      frameRate(60); 
 
    }
     
    void draw(){ 
   if(play == false){             // -------------show First interface
        gamestart();
        score = 0;
      }     
    if (play ==  true) {         // ------------- show Second interface
      drawBackground();           
      drawBasket();          
      drawBall();
      updateBall();    
      distance();                // Distance calculating between Ball, Basket and Goal area. So that do collisions and goal.
      goal();
      drawgoal();                // Goal effects
      trailUpdate ();            // Ball effects
      drawGUI ();
       }
    }
       
    void gamestart(){   
    rectMode(CENTER);                 // ------------ The button
    fill(#CE6666);
    rect (200 ,243 ,85 ,45 , 15);   
    fill(255);
    textSize(30);
    text("PLAY", 165, 255);} 
     
    void mouseClicked(){                // -------------- mouseclick and start the game
    if (mouseX > 150 && mouseX < 250 && mouseY > 220 && mouseY < 270) {
    play = true;    }
   }
    
    void drawBackground(){
      background(1,1,1);
    }
   
    void drawBasket(){      // --------------- drawBasket
    rectMode(CENTER);
    fill(255);
    rect(385, basketY, 10, 120, 7);    // the backboard
    rect(375, basketY+25, 10 , 10 , 2);  // the edge of basket
    noFill();
    stroke(255);       
    strokeWeight(3);
    ellipseMode(CENTER);
    ellipse(340, basketY+25, 60, 20 );   //the basket
    noStroke();    
    }
   
    void drawBall(){
    fill(#D80000);
    ellipse(BallX, BallY, 40, 40);
  }
     
    void distance(){     
      distance1 = sqrt(sq(310 - BallX) + sq(basketY+25 - BallY));  // -------- calculate distance between Ball and edge of basket
      distance2 = sqrt(sq(375 - BallX) + sq(basketY+25 - BallY));  // -------- calculate distance between Ball and basket
      distance3 = sqrt(sq(340 - BallX) + sq(basketY+45 - BallY));  // -------- calculate distance between Ball and goal area
          
    }
      
  
    void updateBall(){
      BallY=BallY+fallspeed;                        //  -------------------- Ball's falling
      BallX = BallX + ( Xspeed * xdirection );      //  -------------------- Ball's falling
      fallspeed = fallspeed + gravity;              //  -------------------- Ball's falling
      
      if (BallY > height-14) {                      //  -------------------- Ground reflection
        fallspeed = abs(fallspeed) * -0.75;
        }
            if (mousePressed == true) {             //  -------------------- Ball move to right top when mousepressed
        fallspeed = 8 * -1;
        xdirection = 1;
        Xspeed = 2;
        }
        BallX = BallX + ( Xspeed * xdirection );
        
      if (BallX > width ) 
      {BallX=15;}                                       //  -------------------- Ball appear on the left of screen when reach to the right border
      if (BallX < 1 )
      {BallX=400;}                                      //  -------------------- Ball appear on the right of screen when reach to the left border
  
  
  if ( BallX < 400 &&BallX > 360 && BallY < basketY+85 && BallY > basketY-85 && xdirection > 0){  //  -------------------- collision of backboard
      xdirection *= -1;
      Xspeed *= 0.9;
    }
    
  if( distance1 < 15 && xdirection <0){            //  -------------------- collision of edge of basket
        fallspeed = abs(fallspeed) * -0.75;
   
    }
    
  if( distance1 < 15 && xdirection > 0){    //  --------------------  collision of edge of basket
      xdirection *= -1;
      Xspeed *= 0.9;  
    }
    
  if( distance2 < 20 && xdirection <0){    //  --------------------  collision of basket
        fallspeed = abs(fallspeed) * -0.75;  
    }
    
   if( distance2 < 20 && xdirection > 0){    //  --------------------  collision of basket
      xdirection *= -1;
      Xspeed *= 0.9;   
    }    
    }
    
    
    void goal() {    
      if ( distance3 <30 && BallY > basketY+55 && fallspeed > 0){     //  -------------------- when ball reach the goal area  
        basketY= int(random(80, 320));    // renew basket position
        puff1Mod=200;                     // do effects
        colorT=colorT+10;                 // track's color burn
        timeLeft += 100;                  // times add
        score += 100;                     // increase score
        effect1 -= 2;                     // fade of effects

      }   
            if (timeLeft <= 0)            // have no time
      {
           play = false;              // show first interface
           timeLeft = 400;           // reset time
           colorT= 40;              // track's color reset
      } else
      {
        timeLeft-=1;
      }
        if (score>highScore){      //record hightscore
        highScore = score;}
      }
      
    void drawgoal(){        // ------------------------------ draw effect's when goal
    fill(#FFF80D, 50+puff1Mod);
    ellipse(340, basketY+30, 0.2*(255 - puff1Mod), 0.2*(255 - puff1Mod));
    fill(#FFDB0D, puff1Mod);
    ellipse(340, basketY+30, 0.3*(255 - puff1Mod), 0.3*(255 - puff1Mod));
    fill(#FF0D0D, puff1Mod);
    ellipse(340, basketY+30, 0.4*(255 - puff1Mod), 0.4*(255 - puff1Mod));    
    fill(#D80000, puff1Mod);
    ellipse(BallX, BallY, 0.4*(255 - puff1Mod), 0.4*(255 - puff1Mod));    
    fill(#FA955B, puff1Mod);
    ellipse(BallX, BallY, 0.3*(255 - puff1Mod), 0.3*(255 - puff1Mod));
    puff1Mod -= 2;  // fade of effects
    }
      
    void trailUpdate () { //  ----------------------------------  Ball's trail
    
     for (int i = 0; i < trailX.length; i++){ 
     fill(#FCAC0A, colorT ); // the color's depth changed by colorT
     ellipse (trailX[i], trailY[i], i*3, i*3);}
        
      for (int i = 0; i < trailX.length - 1; i++) {
        trailX[i] = trailX[i+1];  // shift the array values for the ball trail down one place
        trailY[i] = trailY[i+1];
      }
      trailX[trailX.length - 1] = (int)BallX;  //Add the current position to the end of the arrays. When combined with the shifting, this will make the arrays hold the previous 10 positions, which are used to make the trail.
      trailY[trailY.length - 1] = (int)BallY;
    }
    
     void drawGUI()
    {
      rectMode(CENTER);
      timeLeft = constrain(timeLeft, 0, 400);      //timeLeft changed by framerate
      fill(255);
      rect(200, 15, timeLeft, 10);
      fill(255, puff1Mod);
      rect(200, 15, 1.5*(timeLeft - puff1Mod), 0.2*(255 - puff1Mod));  // effects
      puff1Mod -= 2;     // fade
      
      fill(255);
      textSize(20);                   // ---------------------------  score GUI
      text("score:", 0, 60);
      text(score, 55, 60);
      text(highScore, 100, 95);
      text("highScore:", 0, 95);    
    }