Code Sketch
Aaradhya@14
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)
}