Code Sketch


Aaradhya@14
By: Mhalsakant School
clear()
originBottomLeft()

// ============================================================
// OUR BEST MHALSAKANT SCHOOL
// ADVANCED SCHOOL CAMPUS ANIMATION
// ============================================================

var t = 0.0
var titleIndex = 0
var titleTimer = 0
var showCelebration = false
var pulse = 0.0

val titleText = "OUR BEST MHALSAKANT SCHOOL"
val subText = "EDUCATION - DISCIPLINE - SUCCESS"

// ------------------------------------------------------------
// STUDENT DATA
// ------------------------------------------------------------

val studentX = Array(
  210.0,
  260.0,
  315.0,
  365.0,
  420.0,
  470.0,
  525.0
)               

val studentY = Array(
  110.0,
  118.0,
  108.0,
  122.0,
  112.0,
  120.0,
  105.0
)

// ------------------------------------------------------------
// CAR DATA
// ------------------------------------------------------------

val carX = Array(
  110.0,
  180.0,
  520.0,
  600.0
)

val carY = Array(
  92.0,
  78.0,
  87.0,
  72.0
)

// ------------------------------------------------------------
// HELPERS
// ------------------------------------------------------------

def clamp(
    v: Double,
    lo: Double,
    hi: Double
): Double = {
  math.max(lo, math.min(hi, v))
}

// ------------------------------------------------------------
// SKY
// ------------------------------------------------------------

def drawSky(
    canvas: CanvasDraw
): Unit = {

  canvas.background(
    185,
    220,
    245
  )

  // Sun
  canvas.fill(
    255,
    220,
    100
  )

  canvas.noStroke()

  canvas.ellipse(
    cwidth - 85,
    cheight - 70,
    65,
    65
  )

  // Soft clouds
  canvas.fill(
    255,
    255,
    255,
    150
  )

  canvas.ellipse(
    100,
    cheight - 70,
    80,
    25
  )

  canvas.ellipse(
    130,
    cheight - 60,
    75,
    22
  )

  canvas.ellipse(
    cwidth - 180,
    cheight - 100,
    90,
    25
  )
}

// ------------------------------------------------------------
// BACKGROUND TREES
// ------------------------------------------------------------

def drawTree(
    canvas: CanvasDraw,
    x: Double,
    y: Double,
    scale: Double
): Unit = {

  // Trunk
  canvas.fill(
    100,
    65,
    35
  )

  canvas.noStroke()

  canvas.rect(
    x - 7 * scale,
    y,
    14 * scale,
    55 * scale
  )

  // Leaves
  canvas.fill(
    45,
    145,
    55
  )

  canvas.ellipse(
    x,
    y + 70 * scale,
    65 * scale,
    55 * scale
  )

  canvas.fill(
    60,
    170,
    65
  )

  canvas.ellipse(
    x - 22 * scale,
    y + 62 * scale,
    45 * scale,
    42 * scale
  )

  canvas.ellipse(
    x + 22 * scale,
    y + 62 * scale,
    45 * scale,
    42 * scale
  )
}

// ------------------------------------------------------------
// PALM TREE
// ------------------------------------------------------------

def drawPalm(
    canvas: CanvasDraw,
    x: Double,
    y: Double
): Unit = {

  canvas.stroke(
    105,
    75,
    40
  )

  canvas.strokeWeight(5)

  canvas.line(
    x,
    y,
    x + 10,
    y + 75
  )

  canvas.strokeWeight(3)

  canvas.line(
    x + 10,
    y + 75,
    x - 25,
    y + 95
  )

  canvas.line(
    x + 10,
    y + 75,
    x + 40,
    y + 95
  )

  canvas.line(
    x + 10,
    y + 75,
    x + 5,
    y + 115
  )

  canvas.line(
    x + 10,
    y + 75,
    x - 5,
    y + 112
  )

  canvas.fill(
    55,
    160,
    65
  )

  canvas.noStroke()

  canvas.ellipse(
    x - 25,
    y + 95,
    40,
    18
  )

  canvas.ellipse(
    x + 40,
    y + 95,
    40,
    18
  )

  canvas.ellipse(
    x + 5,
    y + 112,
    38,
    18
  )

  canvas.ellipse(
    x - 5,
    y + 112,
    38,
    18
  )
}

// ------------------------------------------------------------
// GROUND
// ------------------------------------------------------------

def drawGround(
    canvas: CanvasDraw
): Unit = {

  canvas.fill(
    145,
    108,
    70
  )

  canvas.noStroke()

  canvas.rect(
    0,
    0,
    cwidth,
    115
  )

  // Road
  canvas.fill(
    105,
    105,
    100
  )

  canvas.rect(
    0,
    65,
    cwidth,
    30
  )

  // Road line
  canvas.fill(
    245,
    220,
    90
  )

  var x = 0.0

  while (x < cwidth) {

    canvas.rect(
      x,
      78,
      25,
      3
    )

    x += 45
  }
}

// ------------------------------------------------------------
// SCHOOL BUILDING
// ------------------------------------------------------------

def drawSchool(
    canvas: CanvasDraw
): Unit = {

  // Main building
  canvas.fill(
    222,
    225,
    230
  )

  canvas.stroke(
    65,
    75,
    85
  )

  canvas.strokeWeight(2)

  canvas.rect(
    160,
    125,
    410,
    180
  )

  // Top floor
  canvas.fill(
    200,
    205,
    212
  )

  canvas.rect(
    175,
    245,
    380,
    60
  )

  // Windows
  for (row <- 0 until 3) {

    for (col <- 0 until 9) {

      val wx =
        185.0 + col * 41.0

      val wy =
        155.0 + row * 45.0

      canvas.fill(
        70,
        125,
        165
      )

      canvas.stroke(
        35,
        60,
        75
      )

      canvas.strokeWeight(1)

      canvas.rect(
        wx,
        wy,
        24,
        27
      )

      canvas.stroke(
        210,
        230,
        240
      )

      canvas.line(
        wx + 12,
        wy,
        wx + 12,
        wy + 27
      )
    }
  }

  // Main entrance
  canvas.fill(
    55,
    65,
    75
  )

  canvas.rect(
    320,
    125,
    85,
    85
  )

  canvas.fill(
    110,
    160,
    190
  )

  canvas.rect(
    330,
    135,
    30,
    65
  )

  canvas.rect(
    365,
    135,
    30,
    65
  )

  // School name board
  canvas.fill(
    35,
    60,
    90
  )

  canvas.stroke(
    255,
    210,
    90
  )

  canvas.strokeWeight(2)

  canvas.rect(
    255,
    265,
    220,
    32
  )

  canvas.fill(
    255,
    235,
    150
  )

  canvas.noStroke()

  canvas.text(
    "MHALSAKANT SCHOOL",
    275,
    286
  )

  // Entrance steps
  canvas.fill(
    165,
    165,
    165
  )

  canvas.rect(
    305,
    112,
    115,
    10
  )

  canvas.rect(
    295,
    102,
    135,
    10
  )
}

// ------------------------------------------------------------
// PDEA STYLE EMBLEM
// ------------------------------------------------------------

def drawEmblem(
    canvas: CanvasDraw
): Unit = {

  val cx = cwidth - 105
  val cy = cheight - 105

  canvas.fill(
    250,
    250,
    250
  )

  canvas.stroke(
    35,
    35,
    35
  )

  canvas.strokeWeight(2)

  canvas.ellipse(
    cx,
    cy,
    105,
    105
  )

  // Blue lower shape
  canvas.fill(
    35,
    85,
    155
  )

  canvas.noStroke()

  canvas.ellipse(
    cx,
    cy - 10,
    55,
    20
  )

  // Orange upper shape
  canvas.fill(
    240,
    120,
    35
  )

  canvas.ellipse(
    cx,
    cy + 3,
    45,
    20
  )

  canvas.fill(
    40,
    40,
    45
  )

  canvas.text(
    "PDEA",
    cx - 27,
    cy - 28
  )

  canvas.fill(
    35,
    35,
    35
  )

  canvas.text(
    "Pune District Education Association",
    cx - 55,
    cy - 47
  )
}

// ------------------------------------------------------------
// CARS
// ------------------------------------------------------------

def drawCar(
    canvas: CanvasDraw,
    x: Double,
    y: Double,
    scale: Double
): Unit = {

  val move =
    math.sin(
      t * 1.5 + x
    ) * 2.0

  canvas.fill(
    240,
    245,
    250
  )

  canvas.stroke(
    70,
    80,
    90
  )

  canvas.strokeWeight(2)

  canvas.rect(
    x - 28 * scale + move,
    y,
    56 * scale,
    21 * scale
  )

  canvas.beginShape()

  canvas.vertex(
    x - 18 * scale + move,
    y + 21 * scale
  )

  canvas.vertex(
    x - 8 * scale + move,
    y + 34 * scale
  )

  canvas.vertex(
    x + 12 * scale + move,
    y + 34 * scale
  )

  canvas.vertex(
    x + 22 * scale + move,
    y + 21 * scale
  )

  canvas.endShape()

  // Windows
  canvas.fill(
    70,
    125,
    160
  )

  canvas.noStroke()

  canvas.rect(
    x - 5 * scale + move,
    y + 23 * scale,
    12 * scale,
    8 * scale
  )

  canvas.rect(
    x + 9 * scale + move,
    y + 23 * scale,
    9 * scale,
    8 * scale
  )

  // Wheels
  canvas.fill(
    35,
    35,
    40
  )

  canvas.ellipse(
    x - 18 * scale + move,
    y,
    10 * scale,
    10 * scale
  )

  canvas.ellipse(
    x + 18 * scale + move,
    y,
    10 * scale,
    10 * scale
  )
}

// ------------------------------------------------------------
// STUDENTS
// ------------------------------------------------------------

def drawStudent(
    canvas: CanvasDraw,
    x: Double,
    y: Double,
    i: Int
): Unit = {

  val walk =
    math.sin(
      t * 5.0 + i
    ) * 3.0

  // Head
  canvas.fill(
    220,
    175,
    145
  )

  canvas.noStroke()

  canvas.ellipse(
    x,
    y + 27,
    12,
    12
  )

  // Hair
  canvas.fill(
    45,
    30,
    25
  )

  canvas.ellipse(
    x,
    y + 32,
    12,
    7
  )

  // Shirt
  canvas.fill(
    65 + i * 18,
    90 + i * 10,
    155
  )

  canvas.rect(
    x - 8,
    y + 7,
    16,
    18
  )

  // Legs
  canvas.stroke(
    50,
    55,
    65
  )

  canvas.strokeWeight(3)

  canvas.line(
    x - 3,
    y + 7,
    x - 6 + walk,
    y - 8
  )

  canvas.line(
    x + 3,
    y + 7,
    x + 6 - walk,
    y - 8
  )

  // Arms
  canvas.line(
    x - 7,
    y + 19,
    x - 12,
    y + 8 - walk
  )

  canvas.line(
    x + 7,
    y + 19,
    x + 12,
    y + 8 + walk
  )
}

// ------------------------------------------------------------
// BIRDS
// ------------------------------------------------------------

def drawBirds(
    canvas: CanvasDraw
): Unit = {

  canvas.stroke(
    55,
    70,
    80
  )

  canvas.strokeWeight(2)

  for (i <- 0 until 5) {

    val bx =
      80.0 +
      i * 130.0 +
      math.sin(
        t + i
      ) * 25.0

    val by =
      cheight - 90.0 -
      i * 18.0 +
      math.cos(
        t * 2.0 + i
      ) * 6.0

    canvas.noFill()

    canvas.arc(
      bx - 7,
      by,
      14,
      9,
      math.Pi,
      math.Pi * 2
    )

    canvas.arc(
      bx + 7,
      by,
      14,
      9,
      math.Pi,
      math.Pi * 2
    )
  }
}

// ------------------------------------------------------------
// CELEBRATION EFFECT
// ------------------------------------------------------------

def drawCelebration(
    canvas: CanvasDraw
): Unit = {

  if (!showCelebration)
    return

  for (i <- 0 until 24) {

    val angle =
      pulse +
      i * 15.0

    val rad =
      math.toRadians(angle)

    val radius =
      40.0 +
      math.abs(
        math.sin(
          t * 3.0 + i
        )
      ) * 90.0

    val px =
      cwidth / 2.0 +
      math.cos(rad) * radius

    val py =
      120.0 +
      math.sin(rad) * radius * 0.6

    canvas.fill(
      if (i % 2 == 0) 255 else 80,
      if (i % 2 == 0) 210 else 180,
      if (i % 2 == 0) 80 else 255,
      190
    )

    canvas.noStroke()

    canvas.ellipse(
      px,
      py,
      5,
      5
    )
  }
}

// ------------------------------------------------------------
// TITLE
// ------------------------------------------------------------

def drawTitle(
    canvas: CanvasDraw
): Unit = {

  if (titleIndex > 0) {

    val shown =
      titleText.substring(
        0,
        titleIndex
      )

    canvas.fill(
      15,
      15,
      25
    )

    canvas.stroke(
      255,
      225,
      120
    )

    canvas.strokeWeight(1)

    canvas.text(
      shown,
      cwidth / 2.0 - 135,
      35
    )
  }

  if (titleIndex >= titleText.length) {

    canvas.fill(
      230,
      230,
      240
    )

    canvas.noStroke()

    canvas.text(
      subText,
      cwidth / 2.0 - 125,
      17
    )
  }
}

// ------------------------------------------------------------
// COMPLETE SCENE
// ------------------------------------------------------------

def drawScene(
    canvas: CanvasDraw
): Unit = {

  drawSky(canvas)

  drawTree(
    canvas,
    55,
    120,
    1.2
  )

  drawTree(
    canvas,
    cwidth - 45,
    115,
    1.3
  )

  drawPalm(
    canvas,
    90,
    95
  )

  drawPalm(
    canvas,
    cwidth - 95,
    95
  )

  drawGround(canvas)

  drawSchool(canvas)

  // Cars
  drawCar(
    canvas,
    carX(0),
    carY(0),
    0.9
  )

  drawCar(
    canvas,
    carX(1),
    carY(1),
    0.8
  )

  drawCar(
    canvas,
    carX(2),
    carY(2),
    0.9
  )

  drawCar(
    canvas,
    carX(3),
    carY(3),
    0.75
  )

  // Students
  for (i <- studentX.indices) {

    drawStudent(
      canvas,
      studentX(i),
      studentY(i),
      i
    )
  }

  drawBirds(canvas)

  drawEmblem(canvas)

  drawCelebration(canvas)

  drawTitle(canvas)

  // Click instruction
  if (!showCelebration) {

    canvas.fill(
      35,
      45,
      55
    )

    canvas.noStroke()


 
    canvas.text(
      "CLICK TO CELEBRATE OUR SCHOOL",
      cwidth / 2.0 - 125,
      55
    )
  }
}

// ------------------------------------------------------------
// MAIN ANIMATION
// ------------------------------------------------------------

animateWithCanvasDraw { canvas =>

  t += 0.04
  pulse += 0.7

  titleTimer += 1

  if (
    titleTimer % 5 == 0 &&
    titleIndex < titleText.length
  ) {

    titleIndex += 1
  }

  // Mouse click celebration
  if (isMousePressed) {
    showCelebration = true
  }

  drawScene(canvas)
}