Code Sketch
Bixuu02
Category: Programming
// ============================================================
// GANESH CHATURTHI ANIMATED MISSION GAME - BRINGING BAPPA HOME
// ============================================================
cleari()
originBottomLeft()
// ============================================================
// GAME STATES & ANIMATION VARIABLES
// ============================================================
var screen = 0
var selectedBappa = ""
// Animation Variables
var carX = -120.0
var carY = 100.0
var isCarAtPandal = false
var isCarBringingBappa = false
class Star(val x: Double, val y: Double, val size: Double) {
var phase = randomDouble(6.28)
def step() { phase += 0.04 }
def view(canvas: CanvasDraw) {
val brightness = 150 + (math.sin(phase) * 80).toInt
canvas.noStroke()
canvas.fill(255, brightness, 100, 220)
canvas.ellipse(x, y, size, size)
}
}
val stars = ArrayBuffer.empty[Star]
for (i <- 0 until 60) {
stars.append(new Star(randomDouble(cwidth), randomDouble(cheight), 1.0 + randomDouble(3.0)))
}
// ============================================================
// DRAW GANPATI BAPPA IDOLS
// ============================================================
def drawGanpatiBappa(canvas: CanvasDraw, x: Double, y: Double, bappaType: String, scale: Double) {
canvas.noStroke()
// Base / Throne
canvas.fill(180, 100, 30)
canvas.rect(x - 30 * scale, y - 20 * scale, 60 * scale, 15 * scale)
// Body (Pitambar / Clothes)
canvas.fill(255, 140, 0) // Orange Dhoti
canvas.ellipse(x, y + 10 * scale, 50 * scale, 40 * scale)
// Stomach (Lambo-dara)
canvas.fill(255, 215, 0)
canvas.ellipse(x, y + 25 * scale, 45 * scale, 45 * scale)
// Big Ears
canvas.fill(255, 200, 150)
canvas.ellipse(x - 22 * scale, y + 45 * scale, 25 * scale, 30 * scale)
canvas.ellipse(x + 22 * scale, y + 45 * scale, 25 * scale, 30 * scale)
// Head & Trunk
canvas.ellipse(x, y + 48 * scale, 32 * scale, 35 * scale)
canvas.stroke(255, 180, 130)
canvas.strokeWeight(6 * scale)
canvas.line(x, y + 45 * scale, x - 8 * scale, y + 25 * scale) // Curved trunk
canvas.line(x - 8 * scale, y + 25 * scale, x + 5 * scale, y + 20 * scale)
// Crown (Mukut) based on Type
canvas.noStroke()
if (bappaType == "Lalbaugcha Raja") {
canvas.fill(220, 20, 60) // Royal Red Crown
canvas.rect(x - 18 * scale, y + 60 * scale, 36 * scale, 35 * scale)
canvas.fill(255, 215, 0)
canvas.ellipse(x, y + 80 * scale, 15 * scale, 20 * scale)
} else if (bappaType == "Dagdusheth") {
canvas.fill(255, 215, 0) // Full Golden Crown
canvas.rect(x - 20 * scale, y + 60 * scale, 40 * scale, 40 * scale)
canvas.fill(255, 60, 0)
canvas.ellipse(x, y + 75 * scale, 12 * scale, 15 * scale)
} else if (bappaType == "Eco-Friendly") {
canvas.fill(34, 139, 34) // Eco Green Crown
canvas.rect(x - 16 * scale, y + 60 * scale, 32 * scale, 28 * scale)
canvas.fill(255, 255, 255)
canvas.ellipse(x, y + 70 * scale, 10 * scale, 10 * scale)
} else {
// Bal Ganesha
canvas.fill(0, 191, 255) // Cute Blue Crown
canvas.rect(x - 14 * scale, y + 60 * scale, 28 * scale, 22 * scale)
canvas.fill(255, 215, 0)
canvas.ellipse(x, y + 70 * scale, 8 * scale, 8 * scale)
}
// Tilak
canvas.fill(220, 0, 0)
canvas.ellipse(x, y + 55 * scale, 6 * scale, 8 * scale)
}
// ============================================================
// CAR DRAWING WITH GANPATI BAPPA
// ============================================================
def drawCarWithBappa(canvas: CanvasDraw, x: Double, y: Double, bappaType: String) {
canvas.noStroke()
// Shadow
canvas.fill(50, 50, 50, 100)
canvas.ellipse(x + 75, y - 5, 170, 20)
// Festive Car Body
canvas.fill(220, 30, 30) // Red festive car
canvas.rect(x, y + 10, 150, 45)
canvas.rect(x + 30, y + 55, 85, 30)
// Windows
canvas.fill(200, 230, 255)
canvas.rect(x + 35, y + 58, 35, 22)
canvas.rect(x + 75, y + 58, 35, 22)
// Wheels
val wheelPositions = Array(x + 35, x + 115)
for (wx <- wheelPositions) {
canvas.fill(20, 20, 20)
canvas.ellipse(wx, y + 8, 36, 36)
canvas.fill(255, 215, 0) // Golden Rim
canvas.ellipse(wx, y + 8, 18, 18)
}
// IF BAPPA IS SELECTED, PLACE BAPPA ON TOP OF CAR WITH DECORATION!
if (bappaType != "") {
// Festive Flag
canvas.stroke(255, 140, 0)
canvas.strokeWeight(3)
canvas.line(x + 10, y + 55, x + 10, y + 110)
canvas.fill(255, 100, 0)
canvas.noStroke()
canvas.rect(x + 10, y + 90, 25, 20)
// Bappa Seated on Car Top
drawGanpatiBappa(canvas, x + 75, y + 85, bappaType, 0.45)
}
}
// ============================================================
// SCREEN 0: GANESH CHATURTHI WELCOME LETTER
// ============================================================
def drawLetterScreen(canvas: CanvasDraw) {
canvas.background(40, 10, 20)
repeatFor(stars) { s => s.view(canvas) }
// Letter Card
canvas.fill(255, 248, 220)
canvas.stroke(255, 215, 0)
canvas.strokeWeight(5)
canvas.rect(cwidth/2 - 240, cheight/2 - 180, 480, 370)
canvas.fill(200, 30, 30)
canvas.text("GANESH CHATURTHI MISSION!", cwidth/2 - 150, cheight/2 + 140)
canvas.fill(40, 40, 40)
canvas.text("Dear Friend,", cwidth/2 - 210, cheight/2 + 100)
canvas.text("The most awaited festival of joy and blessing is here!", cwidth/2 - 210, cheight/2 + 70)
canvas.text("May Lord Ganesha remove all obstacles from your path", cwidth/2 - 210, cheight/2 + 45)
canvas.text("and fill your life with wisdom, peace, and happiness.", cwidth/2 - 210, cheight/2 + 20)
canvas.fill(0, 120, 50)
canvas.text("Ganpati Bappa Morya! Mangal Murti Morya!", cwidth/2 - 210, cheight/2 - 15)
// Button: Come To Ganpati Bappa
canvas.fill(220, 50, 50)
canvas.noStroke()
canvas.rect(cwidth/2 - 140, cheight/2 - 120, 280, 50)
canvas.fill(255, 255, 255)
canvas.text("WELCOME GANPATI BAPPA", cwidth/2 - 110, cheight/2 - 90)
}
// ============================================================
// SCREEN 1: DRIVING CAR TO PICK UP BAPPA
// ============================================================
def drawDrivingToPandalScene(canvas: CanvasDraw) {
canvas.background(135, 206, 235)
// Ground & Road
canvas.noStroke()
canvas.fill(40, 160, 60)
canvas.rect(0, 0, cwidth, 160)
canvas.fill(70, 70, 75)
canvas.rect(0, 80, cwidth, 70)
// Ganesh Murti Workshop / Pandal
val pandalX = cwidth - 220.0
val pandalY = 140.0
canvas.fill(255, 140, 0)
canvas.rect(pandalX, pandalY, 190, 140)
canvas.fill(220, 20, 20)
canvas.rect(pandalX - 10, pandalY + 140, 210, 40)
canvas.fill(255, 255, 255)
canvas.text("GANESH MURTI WORKSHOP", pandalX + 10, pandalY + 152)
// Car Driving
drawCarWithBappa(canvas, carX, carY, "")
// Select Ganpati Bappa Button when arrived
if (isCarAtPandal) {
canvas.fill(0, 180, 80)
canvas.noStroke()
canvas.rect(cwidth / 2 - 110, 20, 220, 50)
canvas.fill(255, 255, 255)
canvas.text("SELECT GANPATI BAPPA", cwidth / 2 - 90, 42)
}
}
// ============================================================
// SCREEN 2: SELECT TYPES OF GANPATI BAPPA
// ============================================================
def drawBappaSelectionScreen(canvas: CanvasDraw) {
canvas.background(40, 20, 50)
canvas.fill(255, 215, 0)
canvas.text("SELECT YOUR GANPATI BAPPA IDOL", cwidth/2 - 150, cheight - 50)
val options = Array("Lalbaugcha Raja", "Dagdusheth", "Eco-Friendly", "Bal Ganesha")
for (i <- 0 until 4) {
val bx = if (i % 2 == 0) cwidth/2 - 210 else cwidth/2 + 20
val by = if (i < 2) cheight/2 + 10 else cheight/2 - 130
// Box Card
canvas.fill(255, 248, 220)
canvas.stroke(212, 175, 55)
canvas.strokeWeight(3)
canvas.rect(bx, by, 190, 120)
// Draw Mini Idol inside box
drawGanpatiBappa(canvas, bx + 95, by + 20, options(i), 0.5)
// Text
canvas.fill(180, 0, 0)
canvas.noStroke()
canvas.text(options(i), bx + 30, by + 102)
}
}
// ============================================================
// SCREEN 3: BRINGING BAPPA HOME IN CAR
// ============================================================
def drawBringingBappaHomeScene(canvas: CanvasDraw) {
canvas.background(255, 182, 193) // Festive Sky
// Ground & Decorative Festive Road
canvas.noStroke()
canvas.fill(50, 180, 80)
canvas.rect(0, 0, cwidth, 160)
canvas.fill(80, 80, 85)
canvas.rect(0, 80, cwidth, 70)
// Festive Marigold Garland Lights
for (i <- 0 until 10) {
canvas.fill(255, 140, 0)
canvas.ellipse(i * (cwidth / 9), cheight - 30, 20, 20)
canvas.fill(255, 215, 0)
canvas.ellipse(i * (cwidth / 9), cheight - 42, 14, 14)
}
// Car with Ganpati Bappa on top!
drawCarWithBappa(canvas, carX, carY, selectedBappa)
canvas.fill(180, 0, 0)
canvas.text("BRINGING GANPATI BAPPA HOME WITH JOY!", cwidth/2 - 170, cheight - 80)
}
// ============================================================
// SCREEN 4: FINAL CELEBRATION & COMPLETION SCREEN
// ============================================================
def drawFinalCompletionScreen(canvas: CanvasDraw) {
canvas.background(30, 10, 40)
repeatFor(stars) { s => s.view(canvas) }
// Big Bappa in Center
drawGanpatiBappa(canvas, cwidth/2, cheight/2 - 40, selectedBappa, 1.1)
canvas.fill(255, 215, 0)
canvas.text("HAPPY GANESH CHATURTHI!", cwidth/2 - 130, cheight - 60)
canvas.fill(255, 255, 255)
canvas.text("THANK YOU FOR PARTICIPATING IN THIS MISSION!", cwidth/2 - 185, cheight - 95)
canvas.fill(100, 255, 100)
canvas.text("Ganpati Bappa Morya! Mangal Murti Morya!", cwidth/2 - 160, 40)
}
// ============================================================
// ANIMATION UPDATER
// ============================================================
def updateDeliveryAnimation() {
if (screen == 1) {
if (!isCarAtPandal) {
carX += 3.8
if (carX >= cwidth - 360) {
isCarAtPandal = true
}
}
} else if (screen == 3) {
// Car driving Bappa home
carX += 4.2
if (carX > cwidth + 120) {
screen = 4 // Go to Final Screen
}
}
}
// ============================================================
// CLICK HANDLER
// ============================================================
def handleClick(x: Double, y: Double) {
if (screen == 0) {
// Click "WELCOME GANPATI BAPPA"
if (x >= cwidth/2 - 140 && x <= cwidth/2 + 140 && y >= cheight/2 - 120 && y <= cheight/2 - 70) {
carX = -120.0
screen = 1
}
} else if (screen == 1) {
// Click "SELECT GANPATI BAPPA"
if (isCarAtPandal) {
if (x >= cwidth / 2 - 110 && x <= cwidth / 2 + 110 && y >= 20 && y <= 70) {
screen = 2
}
}
} else if (screen == 2) {
// Select Bappa Idol
val options = Array("Lalbaugcha Raja", "Dagdusheth", "Eco-Friendly", "Bal Ganesha")
for (i <- 0 until 4) {
val bx = if (i % 2 == 0) cwidth/2 - 210 else cwidth/2 + 20
val by = if (i < 2) cheight/2 + 10 else cheight/2 - 130
if (x >= bx && x <= bx + 190 && y >= by && y <= by + 120) {
selectedBappa = options(i)
carX = -120.0 // Reset Car Position for returning
screen = 3
}
}
}
}
onMouseClick { (x, y) => handleClick(x, y) }
// ============================================================
// MAIN ANIMATION LOOP
// ============================================================
animateWithCanvasDraw { canvas =>
repeatFor(stars) { s => s.step() }
updateDeliveryAnimation()
if (screen == 0) drawLetterScreen(canvas)
else if (screen == 1) drawDrivingToPandalScene(canvas)
else if (screen == 2) drawBappaSelectionScreen(canvas)
else if (screen == 3) drawBringingBappaHomeScene(canvas)
else if (screen == 4) drawFinalCompletionScreen(canvas)
}